美文网首页
Android反编译和代码混淆

Android反编译和代码混淆

作者: shuixingge | 来源:发表于2016-07-08 17:03 被阅读144次

    混淆: 并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字。混淆代码可以在不影响程序正常运行的前提下让破解者很头疼,从而大大提升了程序的安全性。

    混淆APK: build.gradle中minifyEnabled的值是false,这里我们只需要把值改成true,打出来的APK包就会是混淆过的了。

    release { 
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    

    其中minifyEnabled用于设置是否启用混淆,proguardFiles用于选定混淆配置文件。注意这里是在release闭包内进行配置的,因此只有打出正式版的APK才会进行混淆,Debug版的APK是不会混淆的。

    proguard-android.txt文件:
    Android SDK/tools/proguard目录下

    # This is a configuration file for ProGuard.
    # http://proguard.sourceforge.net/index.html#manual/usage.html
    
    -dontusemixedcaseclassnames
    -dontskipnonpubliclibraryclasses
    -verbose
    
    # Optimization is turned off by default. Dex does not like code run
    # through the ProGuard optimize and preverify steps (and performs some
    # of these optimizations on its own).
    -dontoptimize
    -dontpreverify
    # Note that if you want to enable optimization, you cannot just
    # include optimization flags in your own project configuration file;
    # instead you will need to point to the
    # "proguard-android-optimize.txt" file instead of this one from your
    # project.properties file.
    
    -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*();
    }
    
    # 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.
    # Dont 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.**
    

    -dontusemixedcaseclassnames: 表示混淆时不使用大小写混淆类名。
    -dontskipnonpubliclibraryclasses:不跳过library中的非public方法。
    -verbose: 打印混淆的详细信息。
    -dontoptimize: 不进行优化,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。
    -dontpreverify: 不进行预校验。
    ** -keepattributes Annotation **:对注解参数进行保留。
    -keep public class com.google.vending.licensing.ILicensingService
    -keep public class com.android.vending.licensing.ILicensingService:

    表示不混淆上述声明的两个类。

    表示不混淆任何包含native方法的类的类名以及native方法名

    -keepclasseswithmembernames class * {
        native <methods>;
    }
    

    表示不混淆任何一个View中的setXxx()和getXxx()方法,因为属性动画需要有相应的setter和getter的方法实现

    -keepclassmembers public class * extends android.view.View {
       void set*(***);
       *** get*();
    }
    

    表示不混淆Activity中参数是View的方法

    -keepclassmembers class * extends android.app.Activity {
       public void *(android.view.View);
    }
    

    表示不混淆枚举中的values()和valueOf()方法

    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    

    表示不混淆Parcelable实现类中的CREATOR字段

    -keepclassmembers class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator CREATOR;
    }
    

    表示不混淆R文件中的所有静态字段

    -keepclassmembers class **.R$* { public static <fields>;}
    

    proguard中一共有三组六个keep关键字的含义

    keep  保留类和类中的成员,防止它们被混淆或移除。
    keepnames 保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
    keepclassmembers  只保留类中的成员,防止它们被混淆或移除。
    keepclassmembernames  只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
    keepclasseswithmembers  保留类和类中的成员,防止它们被混淆或移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
    keepclasseswithmembernames  保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
    

    keepclasseswithmember和keep关键字的区别
    如果这个类没有native的方法,那么这个类会被混淆

    -keepclasseswithmember class * {
        native <methods>;
    }
    

    不管这个类有没有native的方法,那么这个类不会被混淆

    -keep class * {
        native <methods>;
    }
    

    proguard-rules.pro:
    任何一个Android Studio项目在app模块目录下都有一个proguard-rules.pro文件,这个文件就是用于让我们编写只适用于当前项目的混淆规则的

    相关文章

      网友评论

          本文标题:Android反编译和代码混淆

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