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

标签 android gradle obfuscation android-proguard android-multidex

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

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

enter image description here

昨天我更新了一个与此无关但现在比以前更大的 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/

相关文章:

.net - 如何在混淆和调试版本之间保持反序列化兼容性?

android - 微调器弹出窗口标题背景

android - 是否有任何解决方案可以将设备连接为我的模拟器并运行输出?Flutter run :No Devices Connected

交换 fragment 时 Android FAB anchor 发生变化

android - 从 Android Studio gradle 任务构建和安装多个模块

gradle - 如何使Intellij IDEA使用并行和Gradle构建缓存进行构建

java - OnClickListener 不从父类触发

android - 找不到 firebase-messaging.jar - Android 构建错误

javascript - 为什么这个混淆代码在 JavaScript 中是恶意的?

c# - .net 中的代码保护和代码编织