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

问题描述 投票:1回答:2

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

除非我强制该jar上的一些代码在Application onCreate方法上运行,否则基本上这个资源都会丢失。至少直到昨天才是这个问题。

enter image description here

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

我使用apktool将apks用于一个工作,一个不工作(基本上降级那些无关的罐子),并且两个apks中都有一个unknown文件夹,但工作的那个有那个文件夹中的LocalStrings.properties和那个没有工作没有在那个文件夹中。我解压缩那些不相关的罐子只是为了确保它们没有那个javax.servlet包装而且它们是罐子所以它们没有任何其他可能影响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
android gradle obfuscation android-proguard android-multidex
2个回答
0
投票

看起来您的包属性文件被ProGuard剥离。我不确定您是否尝试过以下配置

-keep class javax.servlet.** 

要么

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

要么

-optimizations !javax.servlet
-dontoptimize

另外,还有更多参考资料:


0
投票

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

是什么修复它正在进行构建

minifyEnabled false

然后回去

minifyEnabled true

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

© www.soinside.com 2019 - 2024. All rights reserved.