2014-04-06 32 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();