【问题标题】:Putting additional library code to framework.jar将额外的库代码放入 framework.jar
【发布时间】:2015-12-02 00:48:06
【问题描述】:

我的 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$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 文件。

【问题讨论】:

  • 虽然这是一种有趣的方法,但更简单的方法是使用 multi-dex。使用 Gradle 非常简单。
  • 我必须在 Android
  • 它在 API 级别 15 及更高级别上完美运行。不能肯定地说早期版本,因为我从未尝试过。
  • 仍然想了解它为什么不起作用。

标签: android dalvik smali


【解决方案1】:

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

所以你得到一个这样的错误,其中(如果我正确地阅读了这个错误日志)内部类不允许访问它的父类:

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

如果我们假设 BackStackRecord$3BackStackRecord 类最终是从两个不同的来源引入的,这是合理的:BackStackRecord 不是公共的 (it's package-protected),因此其包之外的类(显然包括 "具有相同包名称但不同来源的类”)不允许访问。或者内部类可能正在尝试访问私有字段,并且被拒绝访问?反正就是这样。

如果您重命名添加到框架中的所有类(以及它们对彼此所做的所有引用),它可能会起作用,但是......就像问题 cmets 说的那样,您可能应该使用 multidex而是。

【讨论】:

  • 再次声明,这是纯属猜测。我没有实际证据或具体分析来支持这一点。 不要将此答案链接为任何内容的权威来源。 :P
猜你喜欢
  • 2010-10-07
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 2023-02-17
  • 2010-12-20
  • 2016-04-07
相关资源
最近更新 更多