diff --git a/src/com/android/launcher3/MainProcessInitializer.java b/src/com/android/launcher3/MainProcessInitializer.java index a8ec371237..e2260eec77 100644 --- a/src/com/android/launcher3/MainProcessInitializer.java +++ b/src/com/android/launcher3/MainProcessInitializer.java @@ -55,7 +55,10 @@ public class MainProcessInitializer implements ResourceBasedOverride { try { Unseal.unseal(); Log.i(TAG, "Unseal success!"); - } catch (Exception e) { + } catch (Exception | LinkageError e) { + // A repackaged APK or a multi-open container can fail to load libnrb.so, in which + // case Unseal.unseal() throws UnsatisfiedLinkError (an Error). Startup must survive + // a broken bypass: only the hidden API exemption is lost for this launch. Log.e(TAG, "Unseal fail!"); e.printStackTrace(); } diff --git a/wmshell/shared/src/com/android/wm/shell/shared/TransitionUtil.java b/wmshell/shared/src/com/android/wm/shell/shared/TransitionUtil.java index 0005cb24df..4f0614ac82 100644 --- a/wmshell/shared/src/com/android/wm/shell/shared/TransitionUtil.java +++ b/wmshell/shared/src/com/android/wm/shell/shared/TransitionUtil.java @@ -440,6 +440,11 @@ public class TransitionUtil { TransitionInfo.Change.class, "getAllowEnterPip").invoke(change); } catch (ReflectiveOperationException e) { throw new IllegalStateException("Unable to read allowEnterPip from transition change", e); + } catch (LinkageError e) { + // The restriction bypass can be unavailable (libnrb.so failed to load), in which case + // touching RestrictionBypass throws ExceptionInInitializerError/NoClassDefFoundError. + // Assume PIP is not allowed instead of crashing the transition. + return false; } }