ClassLoading под android ics

Существуют ли какие-либо ограничения для ClassLoaders под Android ICS?

У меня вообще не работает ни один пример, и я думаю, что все делаю правильно.

Например, этот код

    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/[email protected]@classes.dex)

W/System.err﹕ java.io.IOException: невозможно открыть файл DEX

Расположение правильное, файл dex существует.


person Marian Klühspies    schedule 06.04.2014    source источник


Ответы (2)


/data/dalivk-cache имеет разрешение 775. Это недоступная для записи папка для других. Это сделано в целях безопасности, чтобы приложения не модифицировали другие приложения. Он предназначен для системного установщика, который распаковывает и разархивирует файл dex, содержащийся в apk.

Чтобы приложения загружали внешние классы, используйте 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();
}
person Manish Mulimani    schedule 06.04.2014

Если вы читаете из внутреннего хранилища, то для API 18 и более ранних версий вам потребуется следующее разрешение в файле AndroidManifest.xml:

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

Вам не нужно вышеуказанное разрешение, начиная с API 19 и далее. Дополнительную информацию см. здесь.

Кроме того, вместо того, чтобы жестко указывать путь (например, «/sdcard/») в вашем классе, я бы использовал это вместо этого:

String path = Environment.getExternalStorageDirectory().getAbsolutePath();
person ChuongPham    schedule 06.04.2014