代码混淆(反编译)
Android代码混淆 ⼀,简介 都知道如果在发布apk的时候没有进⾏其他⼀些保护措施的话,那么apk⽂件 就可以通过apk tools等⼯具把源码和资源⽂件进⾏反编译出来,因此为了防⽌⾃⼰的劳动成果被⼈窃取,有必要对app 进⾏⼀定的保护,⽽代码混淆则是其中的⼀种⽅式;本⽂简单介绍混淆的使⽤;(代码混淆⽆法防⽌⼆次打包,所以混淆 完了还可以对apk进⾏加固,爱加密,梆梆,360加固,应⽤宝也有) ⼆,代码混淆的使⽤ 本次以Android Studio ⼯程为例说明(eclipse配置代码相同⽂件名不同⽽已) (1)⼤家也许都注意到新建⼀个⼯程会在app下的adle 下看到如下代码: buildTypes { release { minifyEnabled true //Zipalign优化 zipAlignEnabled true // 移除⽆⽤的resource⽂件 shrinkResource s true proguardFiles getDefaultProguardFile(''), 'proguard-rules.pro' } } 以 上代码中的proguard-rules.pro就是被指定的混淆⽂件的配置⽂件; (2)最重要的就是在proguard-rules.pro添加混淆的申明了,主要代码如下: #保持webView的interface不被混淆 #-keepclass members class fqcn.of.javascript.interface.for.webview { # public *; #}
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify    -verbose -optimizations !code/simplificat ion/arithmetic,!field/*,!class/merging/* -dontshrink #需要⽣声明出jar包 -libraryjars libs/zxing_3.0.0.jar #忽略zxing警告 -le.zxing. ** #保持v4包不被混淆 -keep class android.support.v4.**{*;} #保持zxing包不被混淆 -keep le.zxing.** { *; } #保
持签名不变 -keepattr ibutes Signature #fastjson混淆 -keep class com.alibaba.fastjson.**{*;} -keep class com.alibaba.fastjson.annotation.**{*;} -keep class com.alibaba.f astjson.asm.**{*;} -keep class com.alibaba.fastjson.parser.**{*;} -keep class com.alibaba.fastjson.parser.deserializer.**{*;} -keep class com.alibab a.fastjson.serializer.**{*;} -keep class com.alibaba.fastjson.support.spring.**{*;} -keep class com.alibaba.fastjson.util.**{*;} -dontskipnonpubliclibrar yclasses -dontskipnonpubliclibraryclassmembers #-----------------------------------以下是对Android原⽣的⼀些保持------------------------------ -keep publi c class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -kee p public class * t.BroadcastReceiver -keep public class * t.ContentProvider -keep public class * ext ends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vendin g.licensing.ILicensingService #保持本地⽅法不被混淆 -keepclasseswithmembernames class * { native <methods>; }# 保持⾃定义属性不被混淆 -keepclasseswithmembers class * { public <init>(t.Context, android.util.AttributeSet); }
fastjson忽略属性-keepclasseswithmembers class * { public <init>(t.Context, android.util.AttributeSet, int); }# 保持View不被混淆 -keepclassmembers  class * extends android.app.Activity { public void *(android.
view.View); } # 保持enum不被混淆 -keepclassmembers enum* { public static **[] valu es(); public static ** valueOf(java.lang.String); }# 保持Parcelable序列化不被混淆 -keep class * implements android.os.Parcelable { public static fin al android.os.Parcelable$Creator *; }# 保持Serializable序列化不被混淆-keepclassmembers class * implements java.io.Serializable {<fields>;} 注:特定的jar包需要特定的混淆,⽐如Umeng的混淆需要按照官⽅的混淆来书写混淆代码,其他的⼀些第三⽅
SDK也是⼀样,正常的jar保持不被混淆是keep class jar包下的包名.**{*;};(3)以上⽂件配置完成之后就可以进⾏签名打包了;(4)混淆完了建议要对apk进⾏加固;