我有一个问题,我很确定与multidex
有关。基本上我使用的库之一在jar中有一个.properties
资源包。随着我的应用程序开始增长,我开始遇到问题。我过去曾做过几篇关于它的帖子,但从来没有任何解决方案(post 1,post 2)。 Post 2实际上有关于这个问题的更多细节。
除非我强制该jar上的一些代码在Application
onCreate
方法上运行,否则基本上这个资源都会丢失。至少直到昨天才是这个问题。
昨天我更新了一个与此无关的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
看起来您的包属性文件被ProGuard剥离。我不确定您是否尝试过以下配置
-keep class javax.servlet.**
要么
-keep class javax.servlet.** { *; }
要么
-optimizations !javax.servlet
-dontoptimize
另外,还有更多参考资料:
不确定这是否是正确的方法,但显然proguard错误地为我删除了* .properties文件。
是什么修复它正在进行构建
minifyEnabled false
然后回去
minifyEnabled true
之后,* .properties文件再次在最终版本中可用。