首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >安卓下的ClassLoading

安卓下的ClassLoading
EN

Stack Overflow用户
提问于 2014-04-06 01:15:05
回答 2查看 870关注 0票数 1

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

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

例如,这段代码

代码语言:javascript
复制
    DexFile df = new DexFile("/sdcard/test.apk");
    ClassLoader cl = context.getClassLoader();
    Class clazz = df.loadClass("com/test/LibraryClass", cl);

生产:

E/dalvikvm: Dex缓存目录不可写: /data/dalvik-cache I/dalvikvm:无法为/sdcard/test.apk (/data/dalvik-cache/sdcard@test.apk@classes.dex)打开或创建缓存 W/System.err: java.io.IOException:无法打开DEX文件

位置正确,则存在dex文件。

EN

回答 2

Stack Overflow用户

发布于 2014-04-06 01:56:28

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

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

代码语言:javascript
复制
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();
}
票数 1
EN

Stack Overflow用户

发布于 2014-04-06 02:41:10

如果您正在从内部存储区域读取数据,那么对于API 18和更早版本,您需要在AndroidManifest.xml中使用此权限

代码语言:javascript
复制
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

您不需要从API 19开始的上述权限。有关更多信息,请参见这里

另外,我不会在您的类中硬编码路径(即"/sdcard/"),而是使用以下方法:

代码语言:javascript
复制
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22888866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档