我的APK是大(对很多方法)和作为解决方案我试图将一些库类(例如android / support / v4)放到framework.jar。我拉框架.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$2
-> Landroid/support/v4/app/BackStackRecord
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord$3
-> 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文件。
答案 0 :(得分:2)
可能因为使用支持库的应用程序(我猜除外)现在将拥有两个来源的支持库类:一个来自框架,一个来自他们的应用程序。< / p>
所以你得到这样的错误,其中(如果我正确地读取了这个错误日志),内部类不允许访问它的父类:
DexOpt: resolve class illegal access: Landroid/support/v4/app/BackStackRecord$3 -> Landroid/support/v4/app/BackStackRecord
如果我们假设BackStackRecord$3
和BackStackRecord
类最终是从两个不同的来源引入的,这是合理的:BackStackRecord不是公共的(it's package-protected),所以在它之外的类包(显然包括“具有相同包名但具有不同来源的类”)不允许访问。或者也许内部类正在尝试访问私有字段,并被拒绝访问?无论如何,就像那样。
如果你重命名添加到框架中的所有类(以及它们对彼此所做的所有引用),可以工作,但是...就像问题评论所说,你应该使用multidex代替。