ClassLoading under android ics



在android ICS下对ClassLoaders有什么限制吗?

根本没有一个例子在工作,我认为我做的一切都是正确的。

例如,此代码

    DexFile df = new DexFile("/sdcard/test.apk");
    ClassLoader cl = context.getClassLoader();
    Class clazz = df.loadClass("com/test/LibraryClass", cl);

生产:

E/dalvikvm: Dex cache directory is not writeitable:/data/dalvik-cache

I/dalvikvm:无法为/sdcard/test.apk (/data/dalvik-cache/sdcard@test.apk@classes.dex) 打开或创建缓存

W/System.err: java.io.IOException: 无法打开 DEX 文件

位置正确,dex 文件存在。

/data/dalivk-cache 的权限为 775。对于其他人来说,它不是可写目录。这样做是出于安全目的,以便应用程序不会修改其他应用程序。它适用于系统安装程序,用于解压缩和解压缩apk中包含的dex文件。

对于加载外部类的应用程序,请使用 DexClassLoader

DexClassLoader loader = new DexClassLoader("/sdcard/com.example.test.apk", getApplicationInfo().dataDir, null, getClassLoader());
try {
    loader.loadClass("com.example.test.MainActivity");
} catch (ClassNotFoundException e) {
    Log.e(TAG, "Could not load class");
    e.printStackTrace();
}

如果您正在从内部存储区域读取,那么对于 API 18 及更早版本,您将需要在 AndroidManifest 中拥有此权限.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

从 API 19 开始,您不需要上述权限。有关更多信息,请参阅此处。

另外,与其在您的类中硬编码路径(即"/sdcard/"),我会使用它:

String path = Environment.getExternalStorageDirectory().getAbsolutePath();

最新更新