android - 如何告诉 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
解决方案
不确定这是否是正确的方法,但显然 proguard 错误地为我删除了 *.properties 文件。
什么解决了它正在做一个构建
minifyEnabled false
然后回到
minifyEnabled true
之后,*.properties 文件在最终构建中再次可用。