我想测试来自其他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){
}
}
答案 0 :(得分: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");
}