diff --git a/README.md b/README.md index 7b1314eb..340150a5 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,9 @@ Supports React Native 0.74 ~ 0.82. +> [!NOTE] +> If you are using React Native 0.76 or lower, please use version `12.0.2` of this library. + (Tested on the React Native CLI template apps) ### ✅ Requirements diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 9eb36cb2..a86b4ff4 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -20,17 +20,14 @@ -keepclassmembers class com.facebook.react.ReactInstanceManager { private final ** mBundleLoader; } --keepclassmembers class com.facebook.react.ReactDelegate { - private ** mReactHost; # bridgeless - public void reload(...); # RN 0.74 and above -} # bridgeless -keepclassmembers class com.facebook.react.defaults.DefaultReactHostDelegate { private ** jsBundleLoader; } # bridgeless -keepclassmembers class com.facebook.react.runtime.ReactHostImpl { - private final ** mReactHostDelegate; + private final ** mReactHostDelegate; # RN < 0.81 + private final ** reactHostDelegate; # RN 0.81+ } # Can't find referenced class org.bouncycastle.** diff --git a/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java b/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java index 1aaee51e..392301ca 100644 --- a/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java +++ b/android/app/src/main/java/com/microsoft/codepush/react/CodePushNativeModule.java @@ -12,8 +12,8 @@ import com.facebook.react.ReactDelegate; import com.facebook.react.ReactHost; -import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactActivity; +import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactRootView; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.JSBundleLoader; @@ -126,7 +126,9 @@ private void setJSBundle(String latestJSBundleFile) throws IllegalAccessExceptio ReactHost reactHost = resolveReactHost(); if (reactHost == null) { + CodePushUtils.log("Unable to resolve ReactHost"); // Bridge, Old Architecture + setJSBundleLoaderBridge(latestJSBundleLoader); return; } @@ -138,11 +140,27 @@ private void setJSBundle(String latestJSBundleFile) throws IllegalAccessExceptio } } + private void setJSBundleLoaderBridge(JSBundleLoader latestJSBundleLoader) throws NoSuchFieldException, IllegalAccessException { + ReactDelegate reactDelegate = resolveReactDelegate(); + assert reactDelegate != null; + ReactInstanceManager instanceManager = reactDelegate.getReactInstanceManager(); + Field bundleLoaderField = instanceManager.getClass().getDeclaredField("mBundleLoader"); + bundleLoaderField.setAccessible(true); + bundleLoaderField.set(instanceManager, latestJSBundleLoader); + } + @OptIn(markerClass = UnstableReactNativeAPI.class) private void setJSBundleLoaderBridgeless(ReactHost reactHost, JSBundleLoader latestJSBundleLoader) throws NoSuchFieldException, IllegalAccessException { - Field mReactHostDelegateField = reactHost.getClass().getDeclaredField("mReactHostDelegate"); - mReactHostDelegateField.setAccessible(true); - ReactHostDelegate reactHostDelegate = (ReactHostDelegate) mReactHostDelegateField.get(reactHost); + Field reactHostDelegateField; + try { + // RN < 0.81 + reactHostDelegateField = reactHost.getClass().getDeclaredField("mReactHostDelegate"); + } catch (NoSuchFieldException e) { + // RN >= 0.81 + reactHostDelegateField = reactHost.getClass().getDeclaredField("reactHostDelegate"); + } + reactHostDelegateField.setAccessible(true); + ReactHostDelegate reactHostDelegate = (ReactHostDelegate) reactHostDelegateField.get(reactHost); assert reactHostDelegate != null; Field jsBundleLoaderField = reactHostDelegate.getClass().getDeclaredField("jsBundleLoader"); jsBundleLoaderField.setAccessible(true); @@ -216,16 +234,11 @@ private ReactDelegate resolveReactDelegate() { private ReactHost resolveReactHost() { ReactDelegate reactDelegate = resolveReactDelegate(); if (reactDelegate == null) { + CodePushUtils.log("Unable to resolve ReactDelegate"); return null; } - try { - Field reactHostField = reactDelegate.getClass().getDeclaredField("mReactHost"); - reactHostField.setAccessible(true); - return (ReactHost) reactHostField.get(reactDelegate); - } catch (Exception e) { - return null; - } + return reactDelegate.getReactHost(); } private void restartAppInternal(boolean onlyIfUpdateIsPending) {