Android Studio开启混淆

使用Android Stduio开启混淆
本篇主要介绍在Studio中lib库中jar包的混淆和phone中对apk的混淆

一.对app 主module的混淆

方法很简单,主module下的build.gradle中有buileTypes的定义如下:

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

其中minifyEnabled是控制是否开启混淆,若需要在debug和release中都开启混淆,可以将其改为如下方式:

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

开启混淆即可。剩余的工作就是配置proguard-rules.pro这个混淆配置文件。我们统一在下面说

二.对lib工程进行混淆打出混淆的jar包

这里我们有两种方式
(1).如一中所示,在build.gradle中将minifyEnabled配置为true即可,完成proguard-rules.pro的配置后会在对应工程目录下的build/intermediates/bundles目录中生成对应的class.jar文件(debug or default目录)最后将其copy出改名即可
(2)通过修改module目录下的build.gradle在生成未混淆的class.jar文件再次将其进行混淆
代码如下:

//下述为混淆jar包的方式
task deleteOldJar(type: Delete) {
    //不混淆的jar
    delete 'build/libs/unPro_passportsdk.jar'
    //混淆的jar
    delete 'build/libs/passportsdk.jar'
}

task exportJar(type: Copy) {
    from('build/intermediates/bundles/debug/')
    into('build/libs/')
    include('classes.jar')
    rename ('classes.jar', 'unPro_passportsdk.jar')
}

task makeJar(type: ProGuardTask, dependsOn: "build") {
// 未混淆的jar
    injars 'build/libs/unPro_passportsdk.jar'
// 混淆后的jar路径
    outjars 'build/libs/Pro_passportsdk.jar'
// 具体需要keep住的类
    configuration'proguard-rules.pro'// 混淆配置文件

    libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
}
makeJar.dependsOn(deleteOldJar,exportJar,build);

执行makeJar任务即可在build/libs文件中找到混淆的Pro_passportsdk.jar和未混淆的unPro_passportsdk.jar

三.proguard-rules.pro混淆配置

开启混淆开关后主要的还是配置混淆内容,Google给了我们示例,在android-sdk/tools/proguard/proguard-android.txt中进行占时,有需要的可以去查看下官方建议配置,这里给出常用的配置:

-optimizationpasses 5                                                           # 指定代码的压缩级别  
-dontusemixedcaseclassnames                                                     # 是否使用大小写混合  
-dontskipnonpubliclibraryclasses                                                # 是否混淆第三方jar  
-dontpreverify                                                                  # 混淆时是否做预校验  
-verbose                                                                        # 混淆时是否记录日志  
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法  
  
-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 com.android.vending.licensing.ILicensingService              # 保持哪些类不被混淆  
  
-keepclasseswithmembernames class * {                                           # 保持 native 方法不被混淆  
    native <methods>;  
}  
  
-keepclasseswithmembers class * {                                               # 保持自定义控件类不被混淆  
    public <init>(android.content.Context, android.util.AttributeSet);  
}  
  
-keepclasseswithmembers class * {  
    public <init>(android.content.Context, android.util.AttributeSet, int);     # 保持自定义控件类不被混淆  
}  
  
-keepclassmembers class * extends android.app.Activity {                        # 保持自定义控件类不被混淆  
   public void *(android.view.View);  
}  
  
-keepclassmembers enum * {                                                      # 保持枚举 enum 类不被混淆  
    public static **[] values();  
    public static ** valueOf(java.lang.String);  
}  
  
-keep class * implements android.os.Parcelable {                                # 保持 Parcelable 不被混淆  
  public static final android.os.Parcelable$Creator *;  
}  
  
-keep class MyClass;                                                            # 保持自己定义的类不被混淆  
四.常见错误分析及解决办法
  • can't find referenced class okhttp3.Call 或者 can't find superclass or interface
    报错如下:

在proguard-rules.pro中添加需要keep的 class or interface

  • java.io.IOException: The output jar is empty. Did you specify the proper '-keep' options?

这里报错是需要keep入口函数。如图所示
这里keep主类如下

-keep class com.test.myTest{*;}

注意上述的函数内容全部keep.不要忘记后面的大括号,不然可以正常编译通过,但是入口函数在内部为空实现

  • keep之后扔不错未引用

这里需要注意的是使用去除waring的参数 例如

-dontwarn android.widget.Toast

PS :如大家有混淆问题可在下方留言

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

推荐阅读更多精彩内容