Android自定义混淆规则

Android 将包名类名混淆为藏文

Posted by Jack on September 18, 2018

Android自定义混淆规则

1.配置proguard-rules.pro和module文件混淆成藏文:

在proguard-rules.pro的配置:

#藏文混淆
#指定class模糊字典
-classobfuscationdictionary ./proguard-keys.txt
#指定package模糊字典
-packageobfuscationdictionary ./proguard-keys.txt
#指定外部模糊字典
-obfuscationdictionary ./proguard-keys.txt

在module的目录下创建proguard-keys.txt文件,里面写上一堆藏文:

《摩诃般若波罗蜜多心经》的藏文名如下:

བཅོམ་ལྡན་འདས་མ་ཤེས་རབ་ཀྱི་ཕ་རོལ་ཏུ་ཕྱིན་པའི་སྙིང་པོ། 

然后在build.gradle 中添加混淆规则

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        zipAlignEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
    }
    debug {
        signingConfig signingConfigs.debug
    }
}

下面附上通用的 proguard-android-optimize.txt

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

# 代码混淆的压缩比例(0-7) , 默认为5 , 一般不需要改
-optimizationpasses 5

# 混淆后类名都小写
-dontusemixedcaseclassnames

# 指定不去忽略非公共的库的类(即混淆第三方, 第三方库可能自己混淆了 , 可在后面配置某些第三方库不混淆)
# 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明
-dontskipnonpubliclibraryclasses

# 指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers

# 不做预检验,preverify是proguard的四个步骤之一
# Android不需要preverify,去掉这一步可以加快混淆速度
-dontpreverify

# 有了verbose这句话,混淆后就会生成映射文件
# 包含有类名->混淆后类名的映射关系
# 然后使用printmapping指定映射文件的名称
-verbose
-printmapping proguardMapping.txt

# 保护代码中的Annotation不被混淆
# 这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation*,InnerClasses

# 避免混淆泛型
# 这在JSON实体映射时非常重要,比如fastJson
-keepattributes Signature

#抛出异常时保留源文件和代码行号
#-keepattributes SourceFile,LineNumberTable

#Android SDK默认的proguard-android-optimize.txt用*,但用某些版本的AS和Gradle时,不能处理内嵌enum的情况
-keepclassmembers enum ** {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

效果

jadx下的效果

JEB2下的效果

可以看到类名和方法名都无法区别(由于我们自定义的混淆规则字符比较少所以还有abc等)但大部分类名和方法名变成无法识别的字符(除非你懂藏文……),可以确保应用的安全性。