Android 的混淆

作者: 3c2cf1f7612e | 来源:发表于2017-11-07 10:44 被阅读63次

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

    类名没有被混淆,其中声明成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 <methods>;
    }
    
    -keep class cn.hadcn.test.One {
       public <init>(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调用也需要保证写的接口方法不混淆,原因和第一条一样;
    
    未命名.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 <init>(android.content.Context);
            public <init>(android.content.Context, android.util.AttributeSet);
            public <init>(android.content.Context, android.util.AttributeSet, int);
            public void set*(...);
            public *** get*();
        }
        #不混淆R类里及其所有内部static类中的所有static变量字段
        -keepclassmembers class **.R$* {
            public static <fields>;
        }
    
        -dontwarn java.lang.invoke.*
       #指定不混淆所有的JNI方法
        -keepclasseswithmembernames class * {
            native <methods>;
        }
        -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 <fields>;
          private <fields>;
        }
        -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 <methods>;
        }
        -keep enum org.greenrobot.eventbus.ThreadMode { *; }
        # Only required if you use AsyncExecutor
        -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
            <init>(java.lang.Throwable);
        }
        -keep class org.json.** {*;}
     -dontwarn org.json.**
    
    

    参考文章:

    郭霖 Android安全攻防战,反编译与混淆技术完全解析
    Android混淆从入门到精通

    相关文章

      网友评论

      本文标题:Android 的混淆

      本文链接:https://www.haomeiwen.com/subject/nhydmxtx.html