将额外的库代码放入 framework.jar

Putting additional library code to framework.jar

我的 APK 太大(有很多方法),作为一种解决方案,我试图将一些库 类(例如 android/support/v4)放到 framework.jar。我拉 framework.jar,提取 classes.dex,baksmali,然后添加 android/support/v4,smali,构建一个新的 framework.jar,签名,推送到设备并重启设备。不幸的是,我遇到了一些奇怪的 dalvikvm 验证器错误:

FATAL EXCEPTION: main
Process: com.example.myapp, PID: 3792
java.lang.VerifyError: android/support/v4/view/ViewPager
at java.lang.reflect.Constructor.constructNative(Native Method)
at java.lang.reflect.Method.invokeNative(Native Method)
at dalvik.system.NativeStart.main(Native Method)
/system/framework/framework2.jar odex has stale dependencies
/system/framework/telephony-common.jar odex has stale dependencies
/system/framework/voip-common.jar odex has stale dependencies
/system/framework/mms-common.jar odex has stale dependencies
/system/framework/android.policy.jar odex has stale dependencies
/system/framework/services.jar odex has stale dependencies
/system/framework/apache-xml.jar odex has stale dependencies
/system/framework/webviewchromium.jar odex has stale dependencies
/system/framework/am.jar odex has stale dependencies
VFY: unable to resolve virtual method 283: Landroid/content/Context
.getCodeCacheDir ()Ljava/io/File
/system/framework/framework2.jar odex has stale dependencies
/system/framework/telephony-common.jar odex has stale dependencies
/system/framework/voip-common.jar odex has stale dependencies
/system/framework/mms-common.jar odex has stale dependencies
/system/framework/android.policy.jar odex has stale dependencies
/system/framework/services.jar odex has stale dependencies
/system/framework/apache-xml.jar odex has stale dependencies
/system/framework/webviewchromium.jar odex has stale dependencies
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord
-> Landroid/support/v4/app/BackStackRecord
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord
-> Landroid/support/v4/app/BackStackRecord

知道我做错了什么吗?我只是使用一台设备进行测试。所以我不希望我的 apk 在任何其他设备上运行。

我认为这与以下方面有关:

Is it necessary to keep classes of the same package in the same dex while using multiple dex files

但是我不明白框架是如何工作的,因为它包含自己单独的 dex 文件。

可能是因为使用支持库的应用程序(我猜除了你的应用程序)现在将有来自两个来源的支持库 classes:一个来自框架,其中一个包含在他们的应用程序中。

所以你会得到这样的错误,其中(如果我正确阅读此错误日志)不允许内部 class 访问其父级:

DexOpt: resolve class illegal access:
Landroid/support/v4/app/BackStackRecord
-> Landroid/support/v4/app/BackStackRecord

如果我们假设 BackStackRecordBackStackRecord classes 最终是从两个不同的来源引入的,这是合理的:BackStackRecord 不是 public ( it's package-protected),因此不允许访问其包外的 classes(显然包括 "classes with the same package name but different source")。或者也许内部 class 正在尝试访问私有字段,但被拒绝访问?无论如何,类似的东西。

可能 如果你重命名你添加到框架中的所有 class es(以及它们对彼此的所有引用),但是......就像问题评论说,你应该改用 multidex。