2014-04-06 24 views
1

Android ICS下ClassLoaders是否有任何限制?ClassLoading android iics

我没有得到一个单一的例子,我认为我做的一切都是正确的。

例如,该代码

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

产地:

E/dalvikvm:地塞米松缓存目录是不可写:/数据/达尔维克缓存

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

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

位置正确,dex文件存在。

回答

1

/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(); 
} 
1

如果从内部存储区域读取,然后API 18和更早版本,你需要这个权限在AndroidManifest.xml中

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

从API 19开始,您不需要上述许可。有关更多信息,请参见here

此外,而不是硬编码的路径(即“/ SD卡/”)在您的课,我会使用它代替:

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