1
0
mirror of https://gitcode.com/gh_mirrors/re/react-native-pushy.git synced 2025-09-16 10:21:37 +08:00
Code Issues Packages Projects Releases Wiki Activity GitHub Gitee

fix android reload in bridge-less mode

This commit is contained in:
sunnylqm
2025-02-25 22:19:40 +08:00
parent 9a00cf7483
commit effd7e129d
2 changed files with 63 additions and 81 deletions

View File

@@ -98,23 +98,20 @@ public class UpdateModuleImpl {
} }
}); });
}catch (Exception e){ }catch (Exception e){
promise.reject("执行报错:" + e.getMessage()); promise.reject("downloadPatchFromPpk failed: "+e.getMessage());
} }
} }
public static void reloadUpdate(UpdateContext updateContext, ReactApplicationContext mContext, ReadableMap options, Promise promise) { public static void reloadUpdate(UpdateContext updateContext, ReactApplicationContext mContext, ReadableMap options, Promise promise) {
final String hash = options.getString("hash"); final String hash = options.getString("hash");
if (hash == null || hash.isEmpty()) {
promise.reject("hash不能为空");
return;
}
UiThreadUtil.runOnUiThread(new Runnable() { UiThreadUtil.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
updateContext.switchVersion(hash);
final Context application = mContext.getApplicationContext();
JSBundleLoader loader = JSBundleLoader.createFileLoader(UpdateContext.getBundleUrl(application));
try { try {
updateContext.switchVersion(hash);
final Context application = mContext.getApplicationContext();
ReactInstanceManager instanceManager = updateContext.getCustomReactInstanceManager(); ReactInstanceManager instanceManager = updateContext.getCustomReactInstanceManager();
if (instanceManager == null) { if (instanceManager == null) {
@@ -122,12 +119,10 @@ public class UpdateModuleImpl {
} }
try { try {
JSBundleLoader loader = JSBundleLoader.createFileLoader(UpdateContext.getBundleUrl(application));
Field loadField = instanceManager.getClass().getDeclaredField("mBundleLoader"); Field loadField = instanceManager.getClass().getDeclaredField("mBundleLoader");
loadField.setAccessible(true); loadField.setAccessible(true);
loadField.set(instanceManager, loader); loadField.set(instanceManager, loader);
} catch (Throwable err) { } catch (Throwable err) {
promise.reject("pushy:"+err.getMessage());
Field jsBundleField = instanceManager.getClass().getDeclaredField("mJSBundleFile"); Field jsBundleField = instanceManager.getClass().getDeclaredField("mJSBundleFile");
jsBundleField.setAccessible(true); jsBundleField.setAccessible(true);
jsBundleField.set(instanceManager, UpdateContext.getBundleUrl(application)); jsBundleField.set(instanceManager, UpdateContext.getBundleUrl(application));
@@ -137,31 +132,36 @@ public class UpdateModuleImpl {
promise.resolve(true); promise.resolve(true);
} catch (Throwable err) { } catch (Throwable err) {
promise.reject(err);
Log.e("pushy", "switchVersion failed ", err);
final Activity currentActivity = mContext.getCurrentActivity(); final Activity currentActivity = mContext.getCurrentActivity();
if (currentActivity == null) { if (currentActivity == null) {
return; return;
} }
try { try {
// Try to get getReactDelegate method using reflection
java.lang.reflect.Method getReactDelegateMethod = java.lang.reflect.Method getReactDelegateMethod =
ReactActivity.class.getMethod("getReactDelegate"); ReactActivity.class.getMethod("getReactDelegate");
if (getReactDelegateMethod != null) {
ReactDelegate reactDelegate = (ReactDelegate) ReactDelegate reactDelegate = (ReactDelegate)
getReactDelegateMethod.invoke(currentActivity); getReactDelegateMethod.invoke(currentActivity);
// Try to get reload method using reflection Field reactHostField = ReactDelegate.class.getDeclaredField("mReactHost");
java.lang.reflect.Method reloadMethod = reactHostField.setAccessible(true);
ReactDelegate.class.getMethod("reload"); Object reactHost = reactHostField.get(reactDelegate);
if (reloadMethod != null) {
reloadMethod.invoke(reactDelegate); // Access the mReactHostDelegate field
} else { Field reactHostDelegateField = reactHost.getClass().getDeclaredField("mReactHostDelegate");
throw new NoSuchMethodException(); reactHostDelegateField.setAccessible(true);
} Object reactHostDelegate = reactHostDelegateField.get(reactHost);
} else {
throw new NoSuchMethodException(); // Modify the jsBundleLoader field
} Field jsBundleLoaderField = reactHostDelegate.getClass().getDeclaredField("jsBundleLoader");
jsBundleLoaderField.setAccessible(true);
jsBundleLoaderField.set(reactHostDelegate, loader);
// Get the reload method with a String parameter
java.lang.reflect.Method reloadMethod = reactHost.getClass().getMethod("reload", String.class);
// Invoke the reload method with a reason
reloadMethod.invoke(reactHost, "react-native-update");
} catch (Throwable e) { } catch (Throwable e) {
currentActivity.runOnUiThread(new Runnable() { currentActivity.runOnUiThread(new Runnable() {
@Override @Override
@@ -171,72 +171,54 @@ public class UpdateModuleImpl {
}); });
} }
} }
promise.resolve(true);
} }
}); });
} }
public static void setNeedUpdate(UpdateContext updateContext, ReadableMap options,Promise promise) { public static void setNeedUpdate(UpdateContext updateContext, ReadableMap options, Promise promise) {
try { final String hash = options.getString("hash");
final String hash = options.getString("hash"); UiThreadUtil.runOnUiThread(new Runnable() {
if(hash==null || hash.isEmpty()){ @Override
promise.reject("hash不能为空"); public void run() {
return; try {
} updateContext.switchVersion(hash);
UiThreadUtil.runOnUiThread(new Runnable() { promise.resolve(true);
@Override } catch (Throwable err) {
public void run() { promise.reject("switchVersionLater failed: "+err.getMessage());
try { Log.e("pushy", "switchVersionLater failed", err);
updateContext.switchVersion(hash);
promise.resolve(true);
} catch (Throwable err) {
promise.reject("switchVersionLater failed:"+err.getMessage());
Log.e("pushy", "switchVersionLater failed", err);
}
} }
}); }
} catch (Exception e){ });
promise.reject("执行报错:"+e.getMessage());
}
} }
public static void markSuccess(UpdateContext updateContext,Promise promise) { public static void markSuccess(UpdateContext updateContext, Promise promise) {
try { UiThreadUtil.runOnUiThread(new Runnable() {
UiThreadUtil.runOnUiThread(new Runnable() { @Override
@Override public void run() {
public void run() { updateContext.markSuccess();
updateContext.markSuccess(); promise.resolve(true);
promise.resolve(true); }
} });
});
} catch (Exception e){
promise.reject("执行报错:"+e.getMessage());
}
} }
public static void setUuid(UpdateContext updateContext, String uuid, Promise promise) { public static void setUuid(UpdateContext updateContext, String uuid, Promise promise) {
try { UiThreadUtil.runOnUiThread(new Runnable() {
UiThreadUtil.runOnUiThread(new Runnable() { @Override
@Override public void run() {
public void run() { updateContext.setKv("uuid", uuid);
updateContext.setKv("uuid", uuid); promise.resolve(true);
promise.resolve(true); }
} });
});
} catch (Exception e){
promise.reject("执行报错:"+e.getMessage());
}
} }
public static boolean check(String json) { public static boolean check(String json) {
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
try { try {
mapper.readValue(json, Map.class); mapper.readValue(json, Map.class);
System.out.println("String can be converted to Map");
return true; return true;
} catch (IOException e) { } catch (IOException e) {
System.out.println("String cannot be converted to Map");
return false; return false;
} }
} }
@@ -246,12 +228,12 @@ public class UpdateModuleImpl {
UiThreadUtil.runOnUiThread(new Runnable() { UiThreadUtil.runOnUiThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if(!check(info)){ if (check(info)) {
updateContext.setKv("hash_" + hash, info);
promise.reject("校验报错:json字符串格式错误");
}else {
updateContext.setKv("hash_" + hash, info); updateContext.setKv("hash_" + hash, info);
promise.resolve(true); promise.resolve(true);
} else {
updateContext.setKv("hash_" + hash, info);
promise.reject("setLocalHashInfo failed: invalid json string");
} }
} }
}); });
@@ -262,7 +244,7 @@ public class UpdateModuleImpl {
if (check(value)) { if (check(value)) {
promise.resolve(value); promise.resolve(value);
} else { } else {
promise.reject("校验报错:json字符串格式错误"); promise.reject("getLocalHashInfo failed: invalid json string");
} }
} }

View File

@@ -1,6 +1,6 @@
{ {
"name": "react-native-update", "name": "react-native-update",
"version": "10.24.3", "version": "10.25.0",
"description": "react-native hot update", "description": "react-native hot update",
"main": "src/index", "main": "src/index",
"scripts": { "scripts": {