042android初级篇之android混淆代码ProGuard

混淆代码能有效防止被反编译,防止自己的劳动成果被别人窃取;

混淆配置文件及开关的设置

配置文件的位置以及开关的设置位置,android studio 和eclipse稍微有些差异,这里以android sudio为例:

android工程中混淆配置文件:proguard-rules.pro (默认文件名)

混淆开关:

在 build.gradle

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

如上在buildTypes为release版本时,设置minifyEnabled为true,即使用proguard-rules.pro混淆脚本进行混淆。

解读一个混淆配置

proguard的语法规则可参考参考链接ProGuard在线说明手册

下面是我对一个配置加上了注释,详细看过了之后,便可以打造自己的简单配置了。

# To enable ProGuard in your project, edit project.properties  
# to define the proguard.config property as described in that file.  
#  
# Add project specific ProGuard rules here.  
# By default, the flags in this file are appended to flags specified  
# in ${sdk.dir}/tools/proguard/proguard-android.txt  
# You can edit the include path and order by changing the ProGuard  
# include property in project.properties.  
#  
# For more details, see  
#   http://developer.android.com/guide/developing/tools/proguard.html  
  
# Add any project specific keep options here:  
  
# If your project uses WebView with JS, uncomment the following  
# and specify the fully qualified class name to the JavaScript interface  
# class:  
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {  
#   public *;  
#}  

#optimizationpasses表示对代码进行迭代优化的次数,optimization可以对代码进行各种优化,每次优化后还可以继续优化,故称之迭代优化;
-optimizationpasses 5  
#混淆时不产生混合大小写的类名
-dontusemixedcaseclassnames  
#指定不去忽略非公共的库类
-dontskipnonpubliclibraryclasses  
#不预校验
-dontpreverify  

#显示混淆的log,帮助排错
-verbose  

#代码混淆采用的算法,一般不改变,使用谷歌默认算法即可
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  

#如果项目中有用到注释,则加入
-keepattributes *Annotation*  
-keepattributes Signature  
  
#用到的相关支持包
-libraryjars libs/apns_1.0.6.jar  
-libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so  
-libraryjars libs/armeabi/liblocSDK4.so  
-libraryjars libs/baidumapapi_v2_3_1.jar  
-libraryjars libs/core.jar  
-libraryjars libs/gesture-imageview.jar  
-libraryjars libs/gson-2.0.jar  
-libraryjars libs/infogracesound.jar  
-libraryjars libs/locSDK_4.0.jar  
-libraryjars libs/ormlite-android-4.48.jar  
-libraryjars libs/ormlite-core-4.48.jar  
-libraryjars libs/universal-image-loader-1.9.0.jar

-keep class org.bouncycastle.** {*;}
-keep class com.android.signapk.** {*;}

  
#指定类不进行混淆,保持原样
-keep class com.baidu.** { *; }   
-keep class vi.com.gdi.bgl.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 * extends android.support.v4.**  
-keep public class com.android.vending.licensing.ILicensingService  
  
-keep class com.google.gson.stream.** { *; }  
-keep class com.google.gson.examples.android.model.** { *; }  
-keep class com.uuhelper.Application.** { *; }  
-keep class net.sourceforge.zbar.** { *; }  
-keep class com.google.android.gms.** { *; }   
  
-keep class com.bank.pingan.model.** { *; }  
  
-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper  
-keep public class * extends com.j256.ormlite.android.apptools.OpenHelperManager  
   
-keep class com.android.vending.licensing.ILicensingService  
-keep class android.support.v4.** { *; }    
-keep class org.apache.commons.net.** { *; }    
-keep class com.tencent.** { *; }    
   
-keep class com.umeng.** { *; }    
-keep class com.umeng.analytics.** { *; }    
-keep class com.umeng.common.** { *; }    
-keep class com.umeng.newxp.** { *; }    
   
-keep class com.j256.ormlite.** { *; }    
-keep class com.j256.ormlite.android.** { *; }    
-keep class com.j256.ormlite.field.** { *; }    
-keep class com.j256.ormlite.stmt.** { *; }   
  

#这些有警告也不去处理
-dontwarn android.support.v4.**    
-dontwarn org.apache.commons.net.**   
-dontwarn com.tencent.**    

#如果用到了webview的复杂操作,则加入
-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.WebChromeClient {
     public void *(android.webkit.WebView,java.lang.String);
}
 
#保持native方法不被混淆 
-keepclasseswithmembernames class * {  
    native <methods>;  
}  
#保持自定义控件类,不被混淆
-keepclasseswithmembernames class * {  
    public <init>(android.content.Context, android.util.AttributeSet);  
}  
  
-keepclasseswithmembernames class * {  
    public <init>(android.content.Context, android.util.AttributeSet, int);  
}  

-keepclasseswithmembers class * {  
    public <init>(android.content.Context);  
} 
#保持枚举类不进行混淆  
-keepclassmembers enum * {  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
}  
#保持 Parcelable 类不被混淆
-keep class * implements android.os.Parcelable {  
  public static final android.os.Parcelable$Creator *;  
}  
  
 
  
-dontshrink  
-dontoptimize  
-dontwarn com.google.android.maps.**  
-dontwarn android.webkit.WebView  
-dontwarn com.umeng.**  
-dontwarn com.tencent.weibo.sdk.**  
-dontwarn com.facebook.**  
  
-keep enum com.facebook.**  
-keepattributes Exceptions,InnerClasses,Signature  
-keepattributes *Annotation*  
-keepattributes SourceFile,LineNumberTable  
  
-keep public interface com.facebook.**  
-keep public interface com.tencent.**  
-keep public interface com.umeng.socialize.**  
-keep public interface com.umeng.socialize.sensor.**  
-keep public interface com.umeng.scrshot.**  
  
#不混淆该类及其成员变量
-keep public class com.umeng.socialize.* {*;}  
-keep public class javax.**  
-keep public class android.webkit.**  
  
-keep class com.facebook.**  
-keep class com.umeng.scrshot.**  
-keep public class com.tencent.** {*;}  
-keep class com.umeng.socialize.sensor.**  
  
-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}  
  
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}  
  
-keep class im.yixin.sdk.api.YXMessage {*;}  
-keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}  
  
-keep public class [your_pkg].R$*{  
    public static final int *;  
}  

混淆产生的文件

1. mapping.txt

表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。
每次发布都要保留它方便该版本出现问题时调出日志进行排查,它可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。

2. dump.txt

描述apk内所有class文件的内部结构。

3. seeds.txt

列出了没有被混淆的类和成员。

4. usage.txt

列出了源代码中被删除在apk中不存在的代码。

主要事项

  1. 上一句保护,下一句启用modifers, 启用无效; 上一句启用modifiers,下一句保护,保护有效。 重在保护
  2. 使用了-dontshrink|dontoptimize|dontobfuscate 这些全局选项后,那么再使用相应的kepp modifiers 无效
  3. 当不使用-dontoptimize选项时,则-optimizations optimization_filter才有效

参考链接

  1. ProGuard在线说明手册
  2. 位于sdk中的目录: sdk/tools/proguard
  3. Android 混淆代码总结
  4. Android 代码混淆 选项说明
  5. 使用proguard混淆android代码
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容