趁着项目还没开动,恶补一下混淆的相关知识,看了很多大神的博客,就将他们总结为一篇,下次要用到相关知识,就能更快了。其实,混淆会将一些不要的方法和资源给去除掉,能减少Apk的体积。
我们需要在build.gradle添加下面代码了( minifyEnabled 设为true)
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
用法:
keep class cn.hadcn.test.*
只保存完整的类名
-keep class com.example..MFragment {**;
}
keep后声明完整的类名,然后保留类中的所有内容可以使用*通配符实现
-keepclasseswithmembernames class * {
native ;
}
类名没有被混淆,其中声明成native的方法也没有被混淆,但是非native方法的方法名和局部变量都被混淆了
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
表示不混淆任何一个View中的setXxx()和getXxx()方法,因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
表示不混淆Activity中参数是View的方法
-keepclassmembers class cc.ninty.chat.ui.fragment.ScriptFragment$JavaScriptInterface {
public *;
}
如果我们要保留一个类中的内部类不被混淆则需要用$符号,表示保持ScriptFragment内部类JavaScriptInterface中的所有public内容不被混淆
如果一个类中你不希望保持全部内容不被混淆,而只是希望保护类下的特定内容,就可以使用
-keep class cn.hadcn.test.One {
public ;
}
-keep class cn.hadcn.test.One {
public (org.json.JSONObject);
}
表示One类下的所有public方法都不会被混淆,当然你还可以加入参数,比如以下表示用JSONObject作为入参的构造函数不会被混淆
###注意事项:
1,jni方法不可混淆,因为这个方法需要和native方法保持一致
2,反射用到的类不混淆(否则反射可能出现问题);
3,AndroidMainfest中的类不混淆,所以四大组件和Application的子类和Framework层下所有的类默认不会进行混淆。自定义的View默认也不会被混淆;所以像网上贴的很多排除自定义View,或四大组件被混淆的规则在Android Studio中是无需加入的;
4,与服务端交互时,使用GSON、fastjson等框架解析服务端数据时,所写的JSON对象类不混淆,否则无法将JSON解析成对应的对象;
5,有用到WebView的JS调用也需要保证写的接口方法不混淆,原因和第一条一样;
在gradle中添加
buildTypes {
release {
minifyEnabled true
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debug
debuggable true
zipAlignEnabled false
}
}
在proguard-rules.pro文件下添加 :
如我的项目 中所添加的
#############################################
#
# 对于一些基本指令的添加
#
#############################################
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-dontskipnonpubliclibraryclassmembers
-dontpreverify
-keepattributes *Annotation*,InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#############################################
#
# Android开发中一些需要保留的公共部分
#
#############################################
#不混淆哪些类
-keep public class * extends android.app.Fragment
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
#不混淆Activity中参数类型为View的所有方法
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
#不混淆所有View的子类及其子类的get、set方法
-keep public class * extends android.view.View {
public (android.content.Context);
public (android.content.Context, android.util.AttributeSet);
public (android.content.Context, android.util.AttributeSet, int);
public void set*(...);
public *** get*();
}
#不混淆R类里及其所有内部static类中的所有static变量字段
-keepclassmembers class **.R$* {
public static ;
}
-dontwarn java.lang.invoke.*
#指定不混淆所有的JNI方法
-keepclasseswithmembernames class * {
native ;
}
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
-keep public class * implements java.io.Serializable {*;}
-keepclassmembers class * implements android.os.Parcelable {
public ;
private ;
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
-dontwarn android.support.**
-dontwarn com.google.android.maps.**
-dontwarn com.slidingmenu.lib.app.SlidingMapActivity
-keep class android.support.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }
-keep class com.slidingmenu.** { *; }
-keep interface com.slidingmenu.** { *; }
-keep class android.webkit.** { *; }
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
public void *(android.webkit.webView, java.lang.String);
}
-keep class com.example.kingsunlibrary.Widget.**{ *; }
-keep class com.example.kingsunlibrary.percent.**{ *; }
-keep class com.example.kingsunlibrary.LibMain.bean.**{ *; }
-keep class com.example.kingsunlibrary.eventbus.**{ *; }
-keep class com.example.kingsunlibrary.dao.Catalogue{ *; }
-keep class com.example.kingsunlibrary.utils.PayUtils{ *; }
-keep interface com.example.kingsunlibrary.utils.ShowMessage{ *; }
-keep class com.example.kingsunlibrary.application.Kingsun{ *; }
-keep class com.example.kingsunlibrary.dao.**{*;}
-keep class com.example.kingsunlibrary.EnAndDescryption.Base64{*;}
-keep class com.example.kingsunlibrary.EnAndDescryption.DownloadKey{*;}
# -keep class com.example.kingsunlibrary.EnAndDescryption.**{*;}
#第三方包
# -libraryjars libs/vmediapalyer.jar
# -keep class io.vov.**{ *; }
# -dontwarn io.vov.**
-keep class com.lidroid.xutils.**{ *; }
-dontwarn com.lidroid.xutils.**
-keep class net.lingala.zip4j.**{ *; }
-dontwarn net.lingala.zip4j.**
-keep class com.facebook.** { *; }
-dontwarn com.facebook.**
-keep class com.nineoldandroids.** { *; }
-dontwarn com.nineoldandroids.**
-keep class junit.** { *; }
-dontwarn junit.**
-keep class org.junit.** { *; }
-dontwarn org.junit.**
-keep class android.net.** { *; }
-dontwarn android.net.**
-keep class com.android.internal.http.multipart.** { *; }
-dontwarn com.android.internal.http.multipart.**
-keep class org.apache.** { *; }
-dontwarn org.apache.**
-keep class org.hamcrest.** { *; }
-dontwarn org.hamcrest.**
-keep class com.google.gson.** { *; }
-dontwarn com.google.gson.**
-keep class sun.misc.Unsafe { *; }
-dontwarn sun.misc.Unsafe.**
-keepattributes Signature
-keepattributes *Annotation*
-keep class org.greenrobot.eventbus.**{ *; }
-dontwarn org.greenrobot.eventbus.**
-keepclassmembers class ** {
@org.greenrobot.eventbus.Subscribe ;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }
# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
(java.lang.Throwable);
}
-keep class org.json.** {*;}
-dontwarn org.json.**
参考文章:
郭霖 Android安全攻防战,反编译与混淆技术完全解析
Android混淆从入门到精通