Android:用于混淆 class 名称和方法的 Proguard 配置
Android: Proguard configuration to obfuscate class names and methods
据我所知,有些 class 不应混淆,而且它们的名称必须像 'Activities' 一样保留。但是我希望重命名代码中的其他 classes 和包。
这是 app 文件夹中的 build.gradle
:
应用插件:'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "apt.eve.good.morning"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
}
我在我的应用程序中使用此混淆器配置 (app\proguard-rules.pro
):
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-useuniqueclassmembernames
-verbose
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-allowobfuscations class *
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
它进行了优化,但当我检查我的 classses.dex 内部时,所有 class 名称都保持不变。所以我想知道我在我的配置文件中遗漏了什么没有混淆 class/method 名称?
P.S.1 我已经搜索了几个问题,但我无法想象这里出了什么问题。
P.S.2 我已经正确配置了我的 android studio,proguard 配置的更改适用于我发布的 .apk 文件,没有任何问题。
你已经改变了吗
minifyEnabled=true
应用程序内部 -> build.gradle?
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
确保检查经过混淆处理的 .dex 文件。
使用常见的 gradle 构建脚本,build/**
文件夹可能包含多个未混淆版本的 .dex/.class 文件。
最终生成的 .apk/.aar 应该被混淆,所以如果你正在解压缩那个,并且 classes 没有被混淆,那么某些东西不会按预期工作。
如 OP 所述,验证您的 [反汇编] 工具是否正常工作也很重要。
从 .apk 查看 .dex 的二进制形式通常足以发现 [un] 混淆的符号(尝试使用未混淆的 .class,即使在文本编辑器中,这些符号也很容易阅读,在混淆的 .dex 中"aa"、"ab"、...等符号链通常也很明显。
此外,运行手动启用 gradle proguard 任务并启用详细选项可能有助于确定 proguard 是否 运行 以及基于哪些文件。
基于您的 gradle 文件 (minifyEnabled=true
) 和 proguard 配置。你看起来已经很好了。
要快速确认您的应用混淆了您的 类,请在发布版本时检查生成的 mapping.txt 文件。此文件 "provides a translation between the original and obfuscated class, method, and field names."
这是一个混淆 hockeyapp 库的 mapping.txt 示例:
net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a:
java.util.Queue queue -> a
boolean downloadRunning -> b
67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a
可以在此处的 "Shrink Your Code and Resources" 文章中找到更多信息:https://developer.android.com/studio/build/shrink-code.html
据我所知,有些 class 不应混淆,而且它们的名称必须像 'Activities' 一样保留。但是我希望重命名代码中的其他 classes 和包。
这是 app 文件夹中的 build.gradle
:
应用插件:'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "apt.eve.good.morning"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:support-v4:23.4.0'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:design:23.4.0'
}
我在我的应用程序中使用此混淆器配置 (app\proguard-rules.pro
):
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-useuniqueclassmembernames
-verbose
-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
native <methods>;
}
# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-allowobfuscations class *
# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontwarn android.support.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
它进行了优化,但当我检查我的 classses.dex 内部时,所有 class 名称都保持不变。所以我想知道我在我的配置文件中遗漏了什么没有混淆 class/method 名称?
P.S.1 我已经搜索了几个问题,但我无法想象这里出了什么问题。
P.S.2 我已经正确配置了我的 android studio,proguard 配置的更改适用于我发布的 .apk 文件,没有任何问题。
你已经改变了吗
minifyEnabled=true
应用程序内部 -> build.gradle?
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
确保检查经过混淆处理的 .dex 文件。
使用常见的 gradle 构建脚本,build/**
文件夹可能包含多个未混淆版本的 .dex/.class 文件。
最终生成的 .apk/.aar 应该被混淆,所以如果你正在解压缩那个,并且 classes 没有被混淆,那么某些东西不会按预期工作。
如 OP 所述,验证您的 [反汇编] 工具是否正常工作也很重要。
从 .apk 查看 .dex 的二进制形式通常足以发现 [un] 混淆的符号(尝试使用未混淆的 .class,即使在文本编辑器中,这些符号也很容易阅读,在混淆的 .dex 中"aa"、"ab"、...等符号链通常也很明显。
此外,运行手动启用 gradle proguard 任务并启用详细选项可能有助于确定 proguard 是否 运行 以及基于哪些文件。
基于您的 gradle 文件 (minifyEnabled=true
) 和 proguard 配置。你看起来已经很好了。
要快速确认您的应用混淆了您的 类,请在发布版本时检查生成的 mapping.txt 文件。此文件 "provides a translation between the original and obfuscated class, method, and field names."
这是一个混淆 hockeyapp 库的 mapping.txt 示例:
net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a:
java.util.Queue queue -> a
boolean downloadRunning -> b
67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a
可以在此处的 "Shrink Your Code and Resources" 文章中找到更多信息:https://developer.android.com/studio/build/shrink-code.html