} else { final Object condom_am = Proxy.newProxyInstance(condom.mBase.getClassLoader(), new Class[] { IActivityManager }, new CondomProcessActivityManager(condom, am)); Singleton_mInstance.set(singleton, condom_am);
@Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable { try { return proceed(proxy, method, args); } catch (final Exception e) { if (DEBUG) Log.e(TAG, "Error proceeding " + method, e); } return super.invoke(proxy, method, args); }
@SuppressLint("PrivateApi") private static void installCondomProcessActivityManager(final CondomCore condom) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { final Class<?> ActivityManagerNative = Class.forName("android.app.ActivityManagerNative"); Field ActivityManagerNative_gDefault = null; if (SDK_INT <= N_MR1) try { ActivityManagerNative_gDefault = ActivityManagerNative.getDeclaredField("gDefault"); } catch (final NoSuchFieldException ignored) {} // ActivityManagerNative.gDefault is no longer available on Android O. if (ActivityManagerNative_gDefault == null) { ActivityManagerNative_gDefault = ActivityManager.class.getDeclaredField("IActivityManagerSingleton"); } ActivityManagerNative_gDefault.setAccessible(true); final Class<?> Singleton = Class.forName("android.util.Singleton"); final Method Singleton_get = Singleton.getDeclaredMethod("get"); Singleton_get.setAccessible(true); final Field Singleton_mInstance = Singleton.getDeclaredField("mInstance"); Singleton_mInstance.setAccessible(true); final Class<?> IActivityManager = Class.forName("android.app.IActivityManager"); final Object/* Singleton */singleton = ActivityManagerNative_gDefault.get(null); if (singleton == null) throw new IllegalStateException("ActivityManagerNative.gDefault is null"); final Object/* IActivityManager */am = Singleton_get.invoke(singleton); if (am == null) throw new IllegalStateException("ActivityManagerNative.gDefault.get() returns null"); if (Proxy.isProxyClass(am.getClass()) && Proxy.getInvocationHandler(am) instanceof CondomProcessActivityManager) { Log.d(TAG, "CondomActivityManager is already installed in this process."); return; } final Object condom_am = Proxy.newProxyInstance(condom.mBase.getClassLoader(), new Class[] {IActivityManager}, new CondomProcessActivityManager(condom, am)); Singleton_mInstance.set(singleton, condom_am); }
@Override public Object invoke(final Object proxy, final Method method, final Object[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException { try { return proceed(proxy, method, args); } catch (final Exception e) { if (DEBUG) Log.e(TAG, "Error proceeding " + method, e); } return super.invoke(proxy, method, args); }