Android 的混淆

趁着项目还没开动,恶补一下混淆的相关知识,看了很多大神的博客,就将他们总结为一篇,下次要用到相关知识,就能更快了。其实,混淆会将一些不要的方法和资源给去除掉,能减少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内容不被混淆

未命名.png

如果一个类中你不希望保持全部内容不被混淆,而只是希望保护类下的特定内容,就可以使用

-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调用也需要保证写的接口方法不混淆,原因和第一条一样;
Android 的混淆_第1张图片
未命名.png

在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混淆从入门到精通

你可能感兴趣的:(Android 的混淆)