Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
7 changes: 2 additions & 5 deletions android/app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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.**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}

Expand All @@ -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);
Expand Down Expand Up @@ -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) {
Expand Down