我有一个问题,我很确定它与 multidex
有关。基本上,我使用的一个库在 jar 中有一个 .properties
资源包。随着我的应用程序开始增长,我开始遇到问题。我过去发表过几篇关于它的文章,但从来没有任何解决方案( post 1 , post 2 )。帖子 2 实际上有更多关于这个问题的细节。
除非我强制该 Jar 上的某些代码在 Application
onCreate
方法上运行,否则基本上缺少此资源。至少那是直到昨天的问题。
昨天我更新了一个与此无关但现在比以前更大的 jar(我假设这意味着它有更多的方法),现在代码在同一个问题上再次失败 java.util.MissingResourceException:找不到基本名称 javax.servlet.LocalStrings 的包,语言环境 en_US
但现在它对每个人都失败了,而不仅仅是某些用户。
我使用 apktool 将 apk 分开,一个有效,一个无效(基本上降级那些不相关的 jar),两个 apk 中都有一个 unknown
文件夹,但有效的有那些LocalStrings.properties
在该文件夹中,而不起作用的文件夹中没有它们。我解压缩了那些不相关的 jar 以确保它们没有 javax.servlet
包,它们是 jar,所以它们没有任何其他可能影响 gradle 构建的东西。
基本上我现在的理论是那些 jar 刚好足够大,可以将 javax.servlet
内容从第一个 dex 文件中推出,但这并不完全正确,因为 properties
文件甚至不在 dex 文件中。如果我只是解压缩 apk,我可以在根文件夹中看到 javax
包,在正确的位置看到资源文件,但看不到 LocalStrings.properties
而如果我这样做是为了一个可用的 apk,我可以在其中看到 LocalStrings.properties
。
现在我一直在测试 multiDexKeepProguard
并且我将所有 javax.servlet
放入主 dex 文件,但我仍然无法获取 LocalStrings .properties
出现在 apk 中,即使有:
-keepclassmembers 类 **$Properties
我还尝试了一些其他疯狂的事情,比如使用 javax.servlet
包将 LocalStrings.properties
文件放入我的主应用程序包中,但它没有帮助。
那么我还能尝试什么?这是一个错误还是我做错了什么?
谢谢。
编辑:我想报告我通过删除不再使用的依赖项(广告网络)再次解决了这个问题。当我使用 dex2smali 查看第一个 dex 文件并看到它在那里时,我意识到我仍然有这种依赖性。因此,它放在第一个 dex 文件中的 jar 的大小肯定是一个问题。
编辑:我的混淆器设置中有这个:
-keep class javax.** {*;}
-keep interface javax.** {*;}
-keepclassmembers class javax.** {*;}
-keepclassmembers class **$Properties
最佳答案
不确定这是否是正确的方法,但显然 proguard 错误地为我删除了 *.properties 文件。
什么修复了它正在构建
minifyEnabled false
然后回到
minifyEnabled true
之后,*.properties 文件再次在最终构建中可用。
关于android - 我如何告诉 multidex 保留 jar 属性文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52765228/