0

我想测试来自其他 apk 的活动,并且此测试扩展了 ActivityInstrumentationTestCase2 ( http://developer.android.com/reference/android/test/ActivityInstrumentationTestCase2.html ),因为我需要获取 Activity 和 Instrumentation。

我尝试使用这样的 DexClassLoader:

    public MainActivityTest() throws ClassNotFoundException{
    super((new DexClassLoader(
                "/data/app/my-application.apk", "/data/app/my-application",null, MainActivityTest.class.getClassLoader())).loadClass("my-application.MainActivity")))}

但我得到一个例外:optimizedDirectory not readable/writable: /data/data/valentin.myapplication2

有解决办法吗?

我需要这个活动,因为我在之后使用它:activity.getWindow().getDecorView()

供参考:

@Before
public void setUp() throws Exception {
    super.setUp();
    injectInstrumentation(InstrumentationRegistry.getInstrumentation());
    mActivity = getActivity();
}

@Test
public void testRecorder(){

   new ActivityListener(InstrumentationRegistry.getInstrumentation(),mActivity,12).start();
    while(true){
    }
}
4

1 回答 1

0

你永远不应该在你的代码中硬编码这样的路径。首先,/data/app 是错误的路径 - 那是 apk 本身所在的位置,只有系统可以在那里写入。您可以使用getFilesDir()获取您可以写入的应用程序数据目录的路径。

使用 DexClassLoader 时,必须提供可写的路径,因为系统会优化 dex 文件,并将优化后的版本写入您指定的位置。

public Class getActivityClass(Context ctx)
        throws PackageManager.NameNotFoundException, ClassNotFoundException {
    ApplicationInfo pi = ctx.getPackageManager()
    .getApplicationInfo("my.application", 0);
    String apkPath = pi.sourceDir;

    DexClassLoader loader = new DexClassLoader(apkPath,
            ctx.getFilesDir().getAbsolutePath(), null,
            this.getClass().getClassLoader());
    return loader.loadClass("my-application.MainActivity");
}
于 2016-02-10T18:57:10.977 回答