如何告诉Multidex保留jar属性文件?

时间:2018-10-11 16:50:02

标签: android gradle obfuscation android-proguard android-multidex

我肯定有一个与multidex有关的问题。基本上,我使用的一个库在jar中有一个.properties资源包。随着我的应用程序开始增长,我开始遇到问题。过去,我曾发表过几篇文章,但从未提出任何解决方案(post 1post 2)。实际上,第2个帖子对此问题有更多详细信息。

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

enter image description here

昨天我更新了一个与此无关的jar,但现在它的体积比以前大(我认为这意味着它具有更多的方法),现在代码在同一问题上再次失败{{1 }},但现在它对所有人都失败了,而不仅仅是某些用户。

我使用apktool分解了apk,其中一个有效,一个不起作用(基本上将那些不相关的jar降级了),两个apk中都有一个java.util.MissingResourceException: Can't find bundle for base name javax.servlet.LocalStrings, locale en_US文件夹,但是一个可用的{ }}放在该文件夹中,而那个不起作用的文件夹不在该文件夹中。我已经解压缩了那些无关的jar,只是为了确保它们没有unknown软件包,它们是jar,所以它们没有其他可能影响gradle构建的东西。

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

现在我正在测试LocalStrings.properties,并且所有LocalStrings.properties都进入了主dex文件,但仍然无法multiDexKeepProguard出现在apk中,即使:

javax.servlet

我还尝试了其他一些疯狂的事情,例如使用LocalStrings.properties包将 -keepclassmembers class **$Properties 文件放入我的主应用程序包中,但它也无济于事。

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

谢谢。

编辑:我想报告,我已经通过删除不再使用的依赖项(广告网络)再次摆脱了这个问题。当我使用dex2smali查看第一个dex文件并看到它存在时,我意识到我仍然具有这种依赖性。因此,它放在第一个dex文件中的罐子的大小绝对似乎是一个问题。

编辑:我在我的proguard设置中设置了它:

LocalStrings.properties

2 个答案:

答案 0 :(得分:0)

您的软件包属性文件似乎已被 ProGuard 剥离。我不确定您是否尝试过以下配置

-keep class javax.servlet.** 

-keep class javax.servlet.** { *; }

-optimizations !javax.servlet
-dontoptimize

此外,更多参考文献:

答案 1 :(得分:0)

不确定这样做是否正确,但显然proguard误为我删除了* .properties文件。

使用它进行构建的固定方法

minifyEnabled false

然后返回

minifyEnabled true

之后,*。properties文件在最终版本中再次可用。