2

我正在尝试在 Android 中实现插件架构,更具体地说,是跨 apk 类加载

假设我有以下内容:apk A 和 apk B,sharedUserIdAndroidManifest.xml 接口 I中定义相同的定义在 apk A 中,并且 apk B 包含一个实现I的类 IB

我尝试了以下方法

  1. 在 apk A 中,用于createPackageContext获取 B 的上下文,然后调用Context.getClassLoader并加载所需的类名。但是,由于这会创建两个类加载器,因此我无法将B中加载的类 IB转换为接口 I;这意味着我需要使用反射......

  2. 将 apk B 传递给DexClassLoader(通过 获得的 apk B 的路径)并因“ Class resolve by unexpected DEXApplicationInfo.sourceDir ”而失败,可能是因为 apk B 中也存在重复的接口 I...

  3. 修改build xml并按照Dalvik 中自定义类加载中的方法创建一个单独的 jar,其中包含B 中实现I的类 IB ,并将 jar 放入 apk B 的目录中。这种方法看起来很有希望,因为我可以加载类 IB并将其转换为I而不会出现问题。但是,它需要复制 jar,我不确定当涉及 NDK 共享库时会发生什么。assets

我的问题是,是否有一种方法不涉及修改 build.xml/ant.properties 并与 NDK so 库一起使用?

4

1 回答 1

1

不确定其他方法,但是对于方法2,您可以在将B打包到apk时排除接口I。只需排除生成的 I.class 文件就足够了。

您可能会发现 Fred Chung 的这篇文章很有帮助,并且可能会给您一些提示。http://android-developers.blogspot.kr/2011/07/custom-class-loading-in-dalvik.html

于 2012-06-06T06:33:18.410 回答