【问题标题】:Proguard doesnt obfuscate Class name, only methods are obfuscatedProguard 不会混淆类名,只有方法会被混淆
【发布时间】:2016-07-04 19:34:37
【问题描述】:

我尝试在 android studio 中使用 Proguard,但似乎 Proguard 没有混淆类名,例如我的应用程序结构和配置:

和配置

但是当我尝试在应用程序中触发异常时:

异常在 ADB 控制台中列出:

只有方法被混淆了,MainActivity.class 没有

【问题讨论】:

  • 你在proguard规则文件中添加了更多规则吗?
  • 不,我没有,唯一的规则就在那里,你能建议我应该添加或避免添加哪些规则吗?
  • 在评论您添加的规则后尝试。它可能会混淆。但是有可能 proguard 删除了一些有用的代码。所以让我们尝试测试
  • 我试过了,但是对于非类的方法仍然会发生混淆

标签: android proguard android-proguard


【解决方案1】:

这是一种预期行为,因为该类是一个活动

AndroidManifest.xml 中提到的所有类都必须保留其名称(活动、服务、提供者、接收者、应用程序、仪器)。否则系统将无法找到它们。

Gradle 构建会自动为您的 ProGuard 配置生成一些规则来实现这一点。它扫描 AndroidManifest.xml 并为在那里找到的每个类添加规则。

如果您想查看所有使用的规则,请将此行添加到您的 ProGuard 规则中:

-printconfiguration "build/outputs/mapping/configuration.txt"

它将创建包含所有规则的configuration.txt 文件。

应该是这样的:

# view AndroidManifest.xml #generated:50
-keep class com.github.browep.proguard.MainActivity {
    <init>(...);
}

【讨论】:

  • 我也有类似的问题。我的实用程序,数据类名称没有被混淆,只有方法被混淆。我也找了-keep public class * { public protected *; },但是没有这样的配置。我现在应该检查什么?
  • 我发现我的类名没有被混淆。但是如何将这些类删除到保持状态?
【解决方案2】:

我也遇到了同样的问题,

为 Gradle 更新我的 Android 插件后,Proguard 停止混淆我的实用程序和其他类文件。

经过几次搜索,我发现Android studio gradle 现在使用的是更新版本的Proguard

根据这个stack-overflow answer,它声明: proguard 自动添加特定于 android/google 包的规则。

因此,在我的应用程序中进行了一些规则更改后,Proguard 再次混淆了类名。

旧的 proguard-rules.pro:

#support-v4
#@link https://stackoverflow.com/questions/18978706/obfuscate-android-support-v7-widget-gridlayout-issue
-dontwarn android.support.v4.**
-keep class android.support.v4.** { *; }
-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }

#support-v7
-dontwarn android.support.v7.**
-keep class android.support.v7.** { *; }
#https://stackoverflow.com/a/34895791/4754141
-keep class !android.support.v7.view.menu.**
-keep interface android.support.v7.* { *; }

#support design
#@link https://stackoverflow.com/a/31028536
-dontwarn android.support.design.**
-keep class android.support.design.** { *; }
-keep interface android.support.design.** { *; }
-keep public class android.support.design.R$* { *; }

#error : Note: the configuration refers to the unknown class 'com.google.vending.licensing.ILicensingService'
#solution : @link https://stackoverflow.com/a/14463528
-dontnote com.google.vending.licensing.ILicensingService
-dontnote **ILicensingService

#updating to Gradle 2.14.1 caused error :         https://stackoverflow.com/q/17141832/4754141
-keepattributes EnclosingMethod

#render script
#@link https://stackoverflow.com/questions/22161832/renderscript-support-library-crashes-on-x86-devices
-keepclasseswithmembernames class * { native <methods>; }
-keep class android.support.v8.renderscript.** { *; }

新的 proguard-rules.pro:

#https://stackoverflow.com/a/41901653/4754141
#https://stackoverflow.com/a/23840049/4754141
-keep class android.support.** { *; }
-keep interface android.support.** { *; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多