【发布时间】:2016-08-05 15:12:05
【问题描述】:
据我所知,有些类不应该被混淆,而且它们的名称必须像“活动”一样持久化。但是我希望我的代码中的其他类和包被重命名。
这是应用程序文件夹内的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'
}
我将这个 proguard 配置用于我的应用程序 (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>(...);
}
它进行了优化,但是当我在 classes.dex 中检查时,所有类名都保持不变。所以我想知道我在配置文件中遗漏了哪些没有混淆类/方法名称的内容?
P.S.1我已经搜索了几个问题,但我无法想象这里出了什么问题。
P.S.2 我已经正确配置了我的 android studio,并且对 proguard 配置的更改适用于我发布的 .apk 文件,没有任何问题。
【问题讨论】:
-
发布你的 gradle 构建文件
-
在哪里查看混淆结果?我不是 100% 确定,但我认为在我的项目中,混淆的
.dex文件位于build/intermediates/transforms/dex/**中,build/**中的任何其他类/dex 看起来像是混淆前构建步骤的输出。最终生成的.apk/.aar应该被混淆,所以如果你解压缩那个,并且类没有被混淆,那么某些东西就不会按预期工作。 -
@Ped7g 我使用 dex2jar 将我的 apk 中的 dex 转换为 jar 文件。然后,我使用jd-gui 反编译 jar 文件,并检查我的代码中没有名称混淆。所有类和包都保持相同的名称。
-
@Ped7g 我尝试使用旧版本的 jd-gui!新版本正确显示混淆代码。似乎一切都很好!感谢您的通知。
-
哦,我帮忙了吗? :D LOL,很好...(我在文本编辑器中检查结果,通常是对于小的
.dex文件,您可以通过 30-50 秒的时间判断内容是否被混淆,符号位于更靠近末尾.dex/.class)。也许是 jd-gui 的一个特性,如果它在其他地方找到未混淆的 .class/.dex 或 .map 文件,可以解密混淆的字符串?
标签: android obfuscation android-proguard