Android:缩小混淆动态访问的类

Posted

技术标签:

【中文标题】Android:缩小混淆动态访问的类【英文标题】:Android: minification obfuscating dynamically accessed classes 【发布时间】:2016-11-09 00:23:50 【问题描述】:

我正在使用Samsung's Motion library 为三星手机创建计步器。当我在 gradle 配置文件中创建一个没有缩小的 APK 时,系统可以工作。但是,当我尝试在发布到商店之前应用缩小时,

buildTypes 
    release 
        minifyEnabled true
        signingConfig signingConfigs.config
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        debuggable false
        jniDebuggable false
    

我收到错误消息,声称某些库(例如 android.hardware.motion)不存在。 我已经检查并:

android.hardware.motion 不是android.hardware 中的标准库(可能只存在于三星手机中?) 这些类是动态访问(可能是因为非标准?),例如Class.forName("android.hardware.scontext.SContextManager");

如果我删除该行 缩小启用真 我没有错误,所以它必须是代码混淆。

我已尝试将诸如

之类的语句添加到我的 proguard 规则文件中
-keep class android.hardware.**  *; 
-keep class com.samsung.android.sdk.**  *; 

但这似乎不起作用。 任何想法?谢谢!

【问题讨论】:

您是否尝试禁用 proguard 并检查发布 .apk? 我插入了:-dontoptimize -dontshrink -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose,但没有帮助 如果您使用 gradle(推荐),您只需删除以 proguardFiles 开头的行(android.buildTypes.release 部分)。 我使用 gradle。排除 android buildTypes proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 行没有帮助 我刚刚更新了。这是缩小。不知道为什么,如果我删除它会发生什么 【参考方案1】:

缺少的类确实只在实际设备上可用。 为了让 ProGuard 处理您的应用程序,您必须包含以下配置:

-dontwarn com.samsung.android.sdk.motion.**
-dontnote com.samsung.android.sdk.motion.**

这将忽略来自 samsung sdk 的警告和注释。

【讨论】:

这是正确的,尽管本身还不够。但是,我将其标记为正确,因为您使我走上了正确的道路。正确的解决方案是:-dontwarn com.samsung.android.** -dontnote com.samsung.android.** -keep class com.samsung.** *; -keep class android.hardware.** *; 我毫不怀疑所有提到的规则都是必要的。特别是-keep class android.hardware.** *; 毫无意义,因为该软件包已安装在设备上,因此 ProGuard 不会考虑。我测试了 Samsung SDK 中的示例项目,我的规则足以成功构建它。 你是对的。除了三星添加到 android.hardware 包中,因此发生的事情是新部分被混淆了。任何较小的子集都不适合我

以上是关于Android:缩小混淆动态访问的类的主要内容,如果未能解决你的问题,请参考以下文章

使用 DexGuard 混淆动态加载的类

Android 混淆 小结

Android 混淆 小结

Android 混淆 小结

Android 资源混淆 AndResGuard

Android/Java 混淆:R8 与(ProGuard 或 DexGuard)?