mirror of
				https://gitcode.com/gh_mirrors/re/react-native-pushy.git
				synced 2025-10-31 13:23:12 +08:00 
			
		
		
		
	feat: support for new architecture
This commit is contained in:
		| @@ -5,7 +5,15 @@ def safeExtGet(prop, fallback) { | ||||
|     rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback | ||||
| } | ||||
|  | ||||
| def isNewArchitectureEnabled() { | ||||
|     return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true" | ||||
| } | ||||
|  | ||||
| apply plugin: 'com.android.library' | ||||
| if (isNewArchitectureEnabled()) { | ||||
|     apply plugin: 'com.facebook.react' | ||||
| } | ||||
|  | ||||
|  | ||||
| android { | ||||
|     compileSdkVersion safeExtGet('compileSdkVersion', 28) | ||||
| @@ -17,11 +25,17 @@ android { | ||||
|         versionCode 1 | ||||
|         versionName "1.0" | ||||
|         consumerProguardFiles "proguard.pro" | ||||
|         buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString() | ||||
|     } | ||||
|     sourceSets { | ||||
|         main { | ||||
|             // let gradle pack the shared library into apk | ||||
|             jniLibs.srcDirs = ['./lib'] | ||||
|             if (isNewArchitectureEnabled()) { | ||||
|                 java.srcDirs += ['src/newarch'] | ||||
|             } else { | ||||
|                 java.srcDirs += ['src/oldarch'] | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
| @@ -45,3 +59,10 @@ repositories { | ||||
| dependencies { | ||||
|     implementation 'com.facebook.react:react-native:+' | ||||
| } | ||||
| if (isNewArchitectureEnabled()) { | ||||
|     react { | ||||
|         jsRootDir = file("../lib/") | ||||
|         libraryName = "update" | ||||
|         codegenJavaPackageName = "cn.reactnative.modules.update" | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -24,7 +24,7 @@ int hpatch_getInfo_by_mem(hpatch_singleCompressedDiffInfo* out_patinfo, | ||||
|     mem_as_hStreamInput(&patStream,pat,pat+patsize); | ||||
|     if (!getSingleCompressedDiffInfo(out_patinfo,&patStream,0)) | ||||
|         return kHPatch_error_info;//data error; | ||||
|     return kHPatch_ok; //ok               | ||||
|     return kHPatch_ok; //ok | ||||
| } | ||||
|  | ||||
| static hpatch_TDecompress* getDecompressPlugin(const char* compressType){ | ||||
| @@ -68,7 +68,7 @@ static int hpatch_by_stream(const hpatch_TStreamInput* old,hpatch_BOOL isLoadOld | ||||
|             _check(decompressPlugin,kHPatch_error_compressType); | ||||
|         } | ||||
|     } | ||||
|     {// mem  | ||||
|     {// mem | ||||
|         size_t mem_size; | ||||
|         size_t oldSize=(size_t)old->streamSize; | ||||
|         isLoadOldAllToMem=isLoadOldAllToMem&&(old->streamSize<=kMaxLoadMemOldSize); | ||||
| @@ -76,7 +76,7 @@ static int hpatch_by_stream(const hpatch_TStreamInput* old,hpatch_BOOL isLoadOld | ||||
|         mem_size=temp_cache_size+(isLoadOldAllToMem?oldSize:0); | ||||
|         temp_cache=malloc(mem_size); | ||||
|         _check(temp_cache,kHPatch_error_malloc); | ||||
|         if (isLoadOldAllToMem){//load old to mem  | ||||
|         if (isLoadOldAllToMem){//load old to mem | ||||
|             uint8_t* oldMem=temp_cache+temp_cache_size; | ||||
|             _check(old->read(old,0,oldMem,oldMem+oldSize),kHPatch_error_old_fread); | ||||
|             mem_as_hStreamInput(&_old,oldMem,oldMem+oldSize); | ||||
| @@ -95,7 +95,7 @@ _clear: | ||||
| } | ||||
|  | ||||
| int hpatch_by_mem(const uint8_t* old,size_t oldsize,uint8_t* newBuf,size_t newsize, | ||||
|                   const uint8_t* pat,size_t patsize,const hpatch_singleCompressedDiffInfo* patInfo){       | ||||
|                   const uint8_t* pat,size_t patsize,const hpatch_singleCompressedDiffInfo* patInfo){ | ||||
|     hpatch_TStreamInput oldStream; | ||||
|     hpatch_TStreamInput patStream; | ||||
|     hpatch_TStreamOutput newStream; | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| // hpatch.h  | ||||
| // import HDiffPatch, support patchData created by "hdiffz -SD -c-lzma2 oldfile newfile patchfile"  | ||||
| // hpatch.h | ||||
| // import HDiffPatch, support patchData created by "hdiffz -SD -c-lzma2 oldfile newfile patchfile" | ||||
| // Copyright 2021 housisong, All rights reserved | ||||
|  | ||||
| #ifndef HDIFFPATCH_PATCH_H | ||||
| @@ -41,4 +41,4 @@ int hpatch_by_file(const char* oldfile, const char* newfile, const char* patchfi | ||||
| #ifdef __cplusplus | ||||
| } | ||||
| #endif | ||||
| #endif //HDIFFPATCH_PATCH_H | ||||
| #endif //HDIFFPATCH_PATCH_H | ||||
|   | ||||
| @@ -1,7 +1,5 @@ | ||||
| package cn.reactnative.modules.update; | ||||
|  | ||||
| import android.content.Context; | ||||
|  | ||||
| import java.io.File; | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -0,0 +1,191 @@ | ||||
| package cn.reactnative.modules.update; | ||||
|  | ||||
| import android.app.Activity; | ||||
| import android.app.Application; | ||||
| import android.util.Log; | ||||
| import com.facebook.react.ReactApplication; | ||||
| import com.facebook.react.ReactInstanceManager; | ||||
| import com.facebook.react.bridge.JSBundleLoader; | ||||
| import com.facebook.react.bridge.Promise; | ||||
| import com.facebook.react.bridge.ReactApplicationContext; | ||||
| import com.facebook.react.bridge.ReadableMap; | ||||
| import com.facebook.react.bridge.UiThreadUtil; | ||||
| import java.io.File; | ||||
| import java.lang.reflect.Field; | ||||
| public class UpdateModuleImpl { | ||||
|  | ||||
|     public static final String NAME = "Pushy"; | ||||
|  | ||||
|     public static void downloadFullUpdate(UpdateContext updateContext, ReadableMap options, Promise promise) { | ||||
|         String url = options.getString("updateUrl"); | ||||
|         String hash = options.getString("hash"); | ||||
|         updateContext.downloadFullUpdate(url, hash, new UpdateContext.DownloadFileListener() { | ||||
|             @Override | ||||
|             public void onDownloadCompleted(DownloadTaskParams params) { | ||||
|                 promise.resolve(null); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onDownloadFailed(Throwable error) { | ||||
|                 promise.reject(error); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void downloadAndInstallApk(UpdateContext updateContext, ReadableMap options, Promise promise) { | ||||
|         String url = options.getString("url"); | ||||
|         String hash = options.getString("hash"); | ||||
|         String target = options.getString("target"); | ||||
|         updateContext.downloadFile(url, hash, target, new UpdateContext.DownloadFileListener() { | ||||
|             @Override | ||||
|             public void onDownloadCompleted(DownloadTaskParams params) { | ||||
|                UpdateModule.installApk(params.targetFile); | ||||
|                 promise.resolve(null); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onDownloadFailed(Throwable error) { | ||||
|                 promise.reject(error); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void installApk(String url) { | ||||
|         File toInstall = new File(url); | ||||
|         UpdateModule.installApk(toInstall); | ||||
|     } | ||||
|  | ||||
|     public static void downloadPatchFromPackage(UpdateContext updateContext, ReadableMap options, Promise promise) { | ||||
|         String url = options.getString("updateUrl"); | ||||
|         String hash = options.getString("hash"); | ||||
|         updateContext.downloadPatchFromApk(url, hash, new UpdateContext.DownloadFileListener() { | ||||
|             @Override | ||||
|             public void onDownloadCompleted(DownloadTaskParams params) { | ||||
|                 promise.resolve(null); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onDownloadFailed(Throwable error) { | ||||
|                 promise.reject(error); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void downloadPatchFromPpk(UpdateContext updateContext, ReadableMap options, Promise promise) { | ||||
|         String url = options.getString("updateUrl"); | ||||
|         String hash = options.getString("hash"); | ||||
|  | ||||
|         String originHash = options.getString("originHash"); | ||||
|  | ||||
|         updateContext.downloadPatchFromPpk(url, hash, originHash, new UpdateContext.DownloadFileListener() { | ||||
|             @Override | ||||
|             public void onDownloadCompleted(DownloadTaskParams params) { | ||||
|                 promise.resolve(null); | ||||
|             } | ||||
|  | ||||
|             @Override | ||||
|             public void onDownloadFailed(Throwable error) { | ||||
|                 promise.reject(error); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void reloadUpdate(UpdateContext updateContext, ReactApplicationContext mContext, ReadableMap options) { | ||||
|         final String hash = options.getString("hash"); | ||||
|  | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 try { | ||||
|                     updateContext.switchVersion(hash); | ||||
|                     Activity activity = mContext.getCurrentActivity(); | ||||
|                     Application application = activity.getApplication(); | ||||
|                     ReactInstanceManager instanceManager = updateContext.getCustomReactInstanceManager(); | ||||
|  | ||||
|                     if (instanceManager == null) { | ||||
|                         instanceManager = ((ReactApplication) application).getReactNativeHost().getReactInstanceManager(); | ||||
|                     } | ||||
|  | ||||
|                     try { | ||||
|                         JSBundleLoader loader = JSBundleLoader.createFileLoader(UpdateContext.getBundleUrl(application)); | ||||
|                         Field loadField = instanceManager.getClass().getDeclaredField("mBundleLoader"); | ||||
|                         loadField.setAccessible(true); | ||||
|                         loadField.set(instanceManager, loader); | ||||
|                     } catch (Throwable err) { | ||||
|                         Field jsBundleField = instanceManager.getClass().getDeclaredField("mJSBundleFile"); | ||||
|                         jsBundleField.setAccessible(true); | ||||
|                         jsBundleField.set(instanceManager, UpdateContext.getBundleUrl(application)); | ||||
|                     } | ||||
|  | ||||
|                     try { | ||||
|                         instanceManager.recreateReactContextInBackground(); | ||||
|                     } catch (Throwable err) { | ||||
|                         activity.recreate(); | ||||
|                     } | ||||
|  | ||||
|                 } catch (Throwable err) { | ||||
|                     Log.e("pushy", "switchVersion failed", err); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     public static void setNeedUpdate(UpdateContext updateContext, ReadableMap options) { | ||||
|         final String hash = options.getString("hash"); | ||||
|  | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 try { | ||||
|                     updateContext.switchVersion(hash); | ||||
|                 } catch (Throwable err) { | ||||
|                     Log.e("pushy", "switchVersionLater failed", err); | ||||
|                 } | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void markSuccess(UpdateContext updateContext) { | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 updateContext.markSuccess(); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void setBlockUpdate(UpdateContext updateContext, ReadableMap options) { | ||||
|         final int until = options.getInt("until"); | ||||
|         final String reason = options.getString("reason"); | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 updateContext.setBlockUpdate(until, reason); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void setUuid(UpdateContext updateContext, String uuid) { | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 updateContext.setKv("uuid", uuid); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void setLocalHashInfo(UpdateContext updateContext, final String hash, final String info) { | ||||
|         UiThreadUtil.runOnUiThread(new Runnable() { | ||||
|             @Override | ||||
|             public void run() { | ||||
|                 updateContext.setKv("hash_" + hash, info); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public static void getLocalHashInfo(UpdateContext updateContext, final String hash, Promise promise) { | ||||
|         promise.resolve(updateContext.getKv("hash_" + hash)); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,34 +1,45 @@ | ||||
| package cn.reactnative.modules.update; | ||||
|  | ||||
| import com.facebook.react.ReactPackage; | ||||
| import com.facebook.react.bridge.JavaScriptModule; | ||||
| import androidx.annotation.Nullable; | ||||
| import com.facebook.react.TurboReactPackage; | ||||
| import com.facebook.react.bridge.NativeModule; | ||||
| import com.facebook.react.bridge.ReactApplicationContext; | ||||
| import com.facebook.react.uimanager.ViewManager; | ||||
|  | ||||
| import java.util.Arrays; | ||||
| import java.util.Collections; | ||||
| import java.util.List; | ||||
| import com.facebook.react.module.model.ReactModuleInfo; | ||||
| import com.facebook.react.module.model.ReactModuleInfoProvider; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| /** | ||||
|  * Created by tdzl2003 on 3/31/16. | ||||
|  */ | ||||
| public class UpdatePackage implements ReactPackage { | ||||
|  | ||||
| public class UpdatePackage extends TurboReactPackage { | ||||
|     @Nullable | ||||
|     @Override | ||||
|     public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { | ||||
|         return Arrays.asList(new NativeModule[]{ | ||||
|                 // Modules from third-party | ||||
|                 new UpdateModule(reactContext), | ||||
|         }); | ||||
|     } | ||||
|  | ||||
|     public List<Class<? extends JavaScriptModule>> createJSModules() { | ||||
|         return Collections.emptyList(); | ||||
|     public NativeModule getModule(String name, ReactApplicationContext reactContext) { | ||||
|         if (name.equals(UpdateModuleImpl.NAME)) { | ||||
|             return new UpdateModule(reactContext); | ||||
|         } else { | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { | ||||
|         return Collections.emptyList(); | ||||
|     public ReactModuleInfoProvider getReactModuleInfoProvider() { | ||||
|         return () -> { | ||||
|             final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>(); | ||||
|             boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; | ||||
|             moduleInfos.put( | ||||
|                     UpdateModuleImpl.NAME, | ||||
|                     new ReactModuleInfo( | ||||
|                             UpdateModuleImpl.NAME, | ||||
|                             UpdateModuleImpl.NAME, | ||||
|                             false, // canOverrideExistingModule | ||||
|                             false, // needsEagerInit | ||||
|                             true, // hasConstants | ||||
|                             false, // isCxxModule | ||||
|                             isTurboModule // isTurboModule | ||||
|                     )); | ||||
|             return moduleInfos; | ||||
|         }; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -0,0 +1,136 @@ | ||||
| package cn.reactnative.modules.update; | ||||
|  | ||||
| import static androidx.core.content.FileProvider.getUriForFile; | ||||
| import android.content.Intent; | ||||
| import android.net.Uri; | ||||
| import android.os.Build; | ||||
| import com.facebook.react.bridge.Promise; | ||||
| import com.facebook.react.bridge.ReactApplicationContext; | ||||
| import com.facebook.react.bridge.ReactContext; | ||||
| import com.facebook.react.bridge.ReadableMap; | ||||
| import com.facebook.react.bridge.WritableMap; | ||||
| import com.facebook.react.modules.core.DeviceEventManagerModule; | ||||
| import java.io.File; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
|  | ||||
| public class UpdateModule extends NativeUpdateSpec { | ||||
|     UpdateContext updateContext; | ||||
|     public static ReactApplicationContext mContext; | ||||
|     public UpdateModule(ReactApplicationContext reactContext, UpdateContext updateContext) { | ||||
|         super(reactContext); | ||||
|         this.updateContext = updateContext; | ||||
|         mContext = reactContext; | ||||
|     } | ||||
|  | ||||
|     public UpdateModule(ReactApplicationContext reactContext) { | ||||
|         this(reactContext, new UpdateContext(reactContext.getApplicationContext())); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     protected Map<String, Object> getTypedExportedConstants() { | ||||
|         final Map<String, Object> constants = new HashMap<>(); | ||||
|         constants.put("downloadRootDir", updateContext.getRootDir()); | ||||
|         constants.put("packageVersion", updateContext.getPackageVersion()); | ||||
|         constants.put("currentVersion", updateContext.getCurrentVersion()); | ||||
|         constants.put("buildTime", updateContext.getBuildTime()); | ||||
|         constants.put("isUsingBundleUrl", updateContext.getIsUsingBundleUrl()); | ||||
|         boolean isFirstTime = updateContext.isFirstTime(); | ||||
|         constants.put("isFirstTime", isFirstTime); | ||||
|         if (isFirstTime) { | ||||
|             updateContext.clearFirstTime(); | ||||
|         } | ||||
|         String rolledBackVersion = updateContext.rolledBackVersion(); | ||||
|         constants.put("rolledBackVersion", rolledBackVersion); | ||||
|         if (rolledBackVersion != null) { | ||||
|             updateContext.clearRollbackMark(); | ||||
|         } | ||||
|         constants.put("blockUpdate", updateContext.getBlockUpdate()); | ||||
|         constants.put("uuid", updateContext.getKv("uuid")); | ||||
|         return constants; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return UpdateModuleImpl.NAME; | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void downloadFullUpdate(ReadableMap options, final Promise promise) { | ||||
|     UpdateModuleImpl.downloadFullUpdate(this.updateContext,options,promise); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void downloadAndInstallApk(ReadableMap options, final Promise promise) { | ||||
|         UpdateModuleImpl.downloadAndInstallApk(this.updateContext,options,promise); | ||||
|     } | ||||
|  | ||||
|     public static void installApk(File toInstall) { | ||||
|         Uri apkUri; | ||||
|         Intent intent; | ||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { | ||||
|             apkUri = getUriForFile(mContext, mContext.getPackageName() + ".pushy.fileprovider", toInstall); | ||||
|             intent = new Intent(Intent.ACTION_INSTALL_PACKAGE); | ||||
|             intent.setData(apkUri); | ||||
|             intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); | ||||
|             intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|         } else { | ||||
|             apkUri = Uri.fromFile(toInstall); | ||||
|             intent = new Intent(Intent.ACTION_VIEW); | ||||
|             intent.setDataAndType(apkUri, "application/vnd.android.package-archive"); | ||||
|             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | ||||
|         } | ||||
|         mContext.startActivity(intent); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void downloadPatchFromPackage(ReadableMap options, final Promise promise) { | ||||
|         UpdateModuleImpl.downloadPatchFromPackage(updateContext,options,promise); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void downloadPatchFromPpk(ReadableMap options, final Promise promise) { | ||||
|         UpdateModuleImpl.downloadPatchFromPpk(updateContext,options,promise); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void reloadUpdate(ReadableMap options) { | ||||
|         UpdateModuleImpl.reloadUpdate(updateContext, mContext, options); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setNeedUpdate(ReadableMap options) { | ||||
|         UpdateModuleImpl.setNeedUpdate(updateContext, options); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void markSuccess() { | ||||
|         UpdateModuleImpl.markSuccess(updateContext); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setBlockUpdate(ReadableMap options) { | ||||
|         UpdateModuleImpl.setBlockUpdate(updateContext,options); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setUuid(final String uuid) { | ||||
|         UpdateModuleImpl.setUuid(updateContext,uuid); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void setLocalHashInfo(final String hash, final String info) { | ||||
|         UpdateModuleImpl.setLocalHashInfo(updateContext,hash,info); | ||||
|     } | ||||
|  | ||||
|     @Override | ||||
|     public void getLocalHashInfo(final String hash, final Promise promise) { | ||||
|         UpdateModuleImpl.getLocalHashInfo(updateContext,hash,promise); | ||||
|     } | ||||
|      | ||||
|     /* 发送事件*/ | ||||
|     public static void sendEvent(String eventName, WritableMap params) { | ||||
|         ((ReactContext) mContext).getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, | ||||
|                 params); | ||||
|     } | ||||
| } | ||||
| @@ -66,7 +66,7 @@ public class UpdateModule extends ReactContextBaseJavaModule { | ||||
| 
 | ||||
|     @Override | ||||
|     public String getName() { | ||||
|         return "RCTPushy"; | ||||
|         return UpdateModuleImpl.NAME; | ||||
|     } | ||||
| 
 | ||||
|     @ReactMethod | ||||
		Reference in New Issue
	
	Block a user
	 steven
					steven