首页 > 解决方案 > 如何告诉 multidex 保留 jar 属性文件?

问题描述

我有一个问题,我很确定与multidex. 基本上我使用的库之一.properties 在 jar 中有一个资源包。随着我的应用程序开始增长,我开始遇到问题。我过去曾发表过几篇关于它的帖子,但从未有任何解决方案(帖子 1帖子 2)。Post 2 实际上有更多关于这个问题的细节。

除非我强制该 Jar 上的某些代码在该方法上运行,否则基本上缺少此资源Application onCreate。至少这是直到昨天的问题。

在此处输入图像描述

昨天我更新了一个与此无关但现在比以前更大的 jar(我假设这意味着它有更多方法),现在代码在同一个问题上再次java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_US失败,但现在每个人都失败了,而不仅仅是一些用户。

我使用 apktool 将 apk 拆开,一个可以工作,一个不工作(基本上是降级那些不相关的 jar),unknown两个 apk 中都有一个文件夹,但一个工作的LocalStrings.properties文件夹在那个文件夹中,一个不工作该文件夹中没有它们。我已经解压缩了那些不相关的 jar,只是为了确保它们里面没有那个javax.servlet包,它们是 jar,所以它们没有任何其他可能影响 gradle 构建的东西。

基本上我现在的理论是这些罐子足够大,可以将javax.servlet东西从第一个 dex 文件中推出,但这并不完全正确,因为这些properties文件甚至不进入 dex 文件。如果我只是解压缩 apk,我可以看到javax根文件夹上的包和正确位置内的资源文件,但LocalStrings.properties如果我为一个有效的 apk 这样做,我可以LocalStrings.properties在那里看到。

现在我一直在测试multiDexKeepProguard,我已经javax.servlet在主 dex 文件中进行了所有操作,但我仍然无法LocalStrings.properties显示在 apk 中,即使有:

-keepclassmembers class **$Properties

我还尝试了一些其他疯狂的事情,比如使用包将LocalStrings.properties文件放入我的主应用程序javax.servlet包中,但它也没有帮助。

那我还能尝试什么?这是一个错误还是我做错了什么?

谢谢。

编辑:我想报告我通过删除不再使用的依赖项(广告网络)再次解决了这个问题。当我使用 dex2smali 查看第一个 dex 文件并看到它存在时,我意识到我仍然有这种依赖关系。因此,它放在第一个 dex 文件上的 jar 的大小肯定是个问题。

编辑:我的 proguard 设置中有这个:

-keep class javax.** {*;}
-keep interface javax.** {*;}
-keepclassmembers class javax.** {*;}
-keepclassmembers class **$Properties

标签: androidgradleobfuscationandroid-proguardandroid-multidex

解决方案


不确定这是否是正确的方法,但显然 proguard 错误地为我删除了 *.properties 文件。

什么解决了它正在做一个构建

minifyEnabled false

然后回到

minifyEnabled true

之后,*.properties 文件在最终构建中再次可用。


推荐阅读