@BeforeClass public static void checkInstallation() throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException { try { CondomProcess.installExcept(((Application) InstrumentationRegistry.getTargetContext().getApplicationContext()), new CondomOptions().addKit(new NullDeviceIdKit()), ""); fail("CondomKit is incompatible with CondomProcess"); } catch (final IllegalArgumentException ignored) {} // Install in default process intentionally, since test cases cannot run in secondary process. CondomProcess.installExcept(((Application) InstrumentationRegistry.getTargetContext().getApplicationContext()), new CondomOptions(), ""); // Check IActivityManager proxy @SuppressLint("PrivateApi") final Object am_proxy = Class.forName("android.app.ActivityManagerNative").getMethod("getDefault").invoke(null); assertTrue(Proxy.isProxyClass(am_proxy.getClass())); sCondomProcessActivityManager = (CondomProcess.CondomProcessActivityManager) Proxy.getInvocationHandler(am_proxy); assertEquals(CondomProcess.CondomProcessActivityManager.class, sCondomProcessActivityManager.getClass()); // Check IPackageManager proxy final PackageManager pm = context().getPackageManager(); assertEquals("android.app.ApplicationPackageManager", pm.getClass().getName()); final Field ApplicationPackageManager_mPm = pm.getClass().getDeclaredField("mPM"); ApplicationPackageManager_mPm.setAccessible(true); final Object pm_proxy = ApplicationPackageManager_mPm.get(pm); assertTrue(Proxy.isProxyClass(pm_proxy.getClass())); sCondomProcessPackageManager = (CondomProcess.CondomProcessPackageManager) Proxy.getInvocationHandler(pm_proxy); assertEquals(CondomProcess.CondomProcessPackageManager.class, sCondomProcessPackageManager.getClass()); }