【问题标题】:ClassLoading under android icsandroid ics下的ClassLoading
【发布时间】:2014-05-18 07:20:24
【问题描述】:

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 缓存目录不可写:/data/dalvik-cache

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

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

位置正确,dex文件存在。

【问题讨论】:

    标签: android classloader ioexception


    【解决方案1】:

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

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

    从 API 19 开始,您不需要上述权限。请参阅here 了解更多信息。

    另外,我不会在你的类中硬编码路径(即“/sdcard/”),而是使用它:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 1970-01-01
        • 2011-07-30
        • 2012-09-28
        • 1970-01-01
        相关资源
        最近更新 更多