android 代码混淆 简单介绍1

混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。

首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源压缩等的优化过程。依靠 ProGuard,混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈;同时,将类、类成员、方法重命名为无意义的简短名称,增加了逆向工程的难度。而依靠 Gradle 的 Android 插件,我们将移除未被使用的资源,可以有效减小 apk 安装包大小。

在这里只简单的介绍一般的混淆,适用于绝大部分产品

    1、修改build.gradle文件
      android {
buildTypes {
    release {
        minifyEnabled true    //将release下minifyEnabled的值改为true,打开混淆
        shrinkResources true  //打开资源压缩
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
    }

    2、自定义混淆规则
          需要在对应的proguard-rules.pro 文件中进行说明,有其对应的语法规则,不是很全,但本人测试,还可以使用。

        #指定压缩级别
      -optimizationpasses 5

        #不跳过非公共的库的类成员
    -dontskipnonpubliclibraryclassmembers

        #混淆时采用的算法
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

        #把混淆类中的方法名也混淆了
    -useuniqueclassmembernames

        #优化时允许访问并修改有修饰符的类和类的成员 
    -allowaccessmodification

        #将文件来源重命名为“SourceFile”字符串
    -renamesourcefileattribute SourceFile
        #保留行号
    -keepattributes SourceFile,LineNumberTable

        #保持所有实现 Serializable 接口的类成员
    -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();
    }

        #Fragment不需要在AndroidManifest.xml中注册,需要额外保护下
    -keep public class * extends android.support.v4.app.Fragment
    -keep public class * extends android.app.Fragment

        # 保持测试相关的代码
    -dontnote junit.framework.**
    -dontnote junit.runner.**
    -dontwarn android.test.**
    -dontwarn android.support.test.**
    -dontwarn org.junit.**

      除此之外,我们还需要针对某些特殊的类需要保持其不备混淆,比如入口类和入口函数(就是被外部调用的类)。还有一些第三方的库等,不能被混淆。

混淆的期间有助于我们检查code。精简代码,查找bug,逐渐认识到自己的问题。

你可能感兴趣的:(android 代码混淆 简单介绍1)