Android Proguard 不混淆所有第三方jar(忽略配置设置)

今天给大家分享一个只混淆自己的项目代码而不混淆所有第三方jar的方法(没错,是所有的第三方都不进行混淆,无论来什么第三方,都不需要动混淆配置)

不混淆所有第三方重大突破

今天又被同事逼迫看了一下Proguard官网,发现原来是支持指定多个目录混淆的

例如你有:com.a.a、com.b.b、com.c.c、com.第三方等

现在只想混淆com.a.a和com.b.b,那么你写成如下即可
```
-keep class !com.a.a.**,!com.b.b.**,** {*;}
```

使用注意:如果你项目用的第三方特别杂乱、特别多,不混淆的话会导致包体积增大很多

一、为app添加混淆

在app的buildTypes里开启对指定包进行混淆,这里我混淆了release和debug的,并且增加了一个debug模式的混淆类型(注①)

buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        //不混淆,便于开发debug
        debug {
            minifyEnabled false
            signingConfig signingConfigs.release
        }
        //debug混淆模式,以便给测试人员测试
        debugProguard {//除了字符串和注释其他的不要沾半点中文
            initWith debug
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

二、增加混淆逻辑

第二步就是关键了,混淆的配置(放在app目录下即可,上面写的是相对路径,所以必须在app目录下,不是根目录)

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in /Users/chenmengjia/Library/Android/sdk/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# 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 *;
#}

#默认的proguard-android.txt已经增加了Annotation、native、view的setget方法、Activity参数为view的方法、Enum枚举、Parcelable、R,此处不再写
#------------------------------------------通用区域----------------------------------------------------
#----------------------基本指令------------------------
#代码混淆压缩比,在0和7之间,默认为5,一般不需要改
-optimizationpasses 5
#混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
#指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclasses
#指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
#不做预校验,preverify是proguard的4个步骤之一
#Android不需要preverify,去掉这一步可加快混淆速度
-dontpreverify
#有了verbose这句话,混淆后就会生成映射文件
#包含有类名->混淆后类名的映射关系
#然后使用printmapping指定映射文件的名称
-verbose
-printmapping proguardMapping.txt
#指定混淆时采用的算法,后面的参数是一个过滤器
#这个过滤器是谷歌推荐的算法,一般不改变
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#保护代码中的Annotation不被混淆,这在JSON实体映射时非常重要,比如fastJson
-keepattributes *Annotation*,InnerClasses
#避免混淆泛型,这在JSON实体映射时非常重要,比如fastJson④
-keepattributes Signature
#抛出异常时保留代码行号,在异常分析中可以方便定位
-keepattributes SourceFile,LineNumberTable
#-----------------------全局混淆-----------------------
#除了项目目录,其他都不混淆②
-keep class !com.wang.**,!com.li.**,** {*;}
-dontwarn **
#---------------------默认保留-------------------------
#基础保留
-keep class * extends android.app.Activity
-keep class * extends android.app.Application
-keep class * extends android.app.Service
-keep class * extends android.content.BroadcastReceiver
-keep class * extends android.content.ContentProvider
-keep class * extends android.app.backup.BackupAgentHelper
-keep class * extends android.preference.Preference
-keep class * extends android.view.View {
    <init>(...);
}

#序列化
-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();
}
#EventBus的注解
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
#WebView
-keepclassmembers class * extends android.webkit.WebView {*;}
-keepclassmembers class * extends android.webkit.WebViewClient {*;}
-keepclassmembers class * extends android.webkit.WebChromeClient {*;}
-keepclassmembers class * {
    @android.webkit.JavascriptInterface <methods>;
}

#-------------------------------------------项目定义区-------------------------------------------------
#com.wang.*是为了适配其他项目③
#bean
-keep class com.wang.*.bean** {*;}
#eventbus传递的类
-keep class com.wang.*.eventbus.** {*;}
#zxing相关,目前没动过
-keep class com.wang.*.zxingjava.** {*;}
#反射相关,暂无

对于某个特殊类或属性也可以在代码中使用@Keep注解来防止被混淆,举例如下

@Keep//不混淆该类方法及属性,内部类需要再加注解
public class TestClass {
}

注:

①(release和debug在所有的module里默认都有(就算module没写也是存在的),如果想增加一个“debugProguard”则在每个module里都添加即可,不需要再配置一遍混淆,如下)

    buildTypes {
        debugProguard {
            initWith debug
        }
    }

②注意修改为自己的包名,如:-keep class !com.zhangshan.app.**,** {*;}

        AS3.0之前的混淆逻辑未测试,请自行测试
③反射、bean、eventbus等数据敏感区参照最后面的项目自定义自行增加

④Signature现在好像是个坑,这个属性目前没有任何作用,好像是最近才修复的:Incorrect handling of Record.Signature attribute · Issue #194 · Guardsquare/proguard · GitHub

很多新手总是出问题,此处追加demo:GitHub - weimingjue/ProguardExample: Proguard的示例

java代码里请改成自己的包路径,你的json解析文件及其他敏感数据请写在项目自定义区里面:

包路径即你java文件里声明“package com.x.x.x;”的前几个

问题1:没混淆正常,开了混淆就崩溃

请看日志!看日志!看日志!一般都是使用了反射出现的xxxNotFound异常或者一些bean数据类忘加了,自行添加忽略

问题2:开了混淆没任何作用

1.查看是否改成了自己的包路径(检查ApplicationId和packageName,如果不一致请按照上面修改)

2.查看release是否开启了混淆,打包时选择release,并用AS查看

4.确认你的混淆文件路径正确,并且和上面基本一致(如混淆文件乱放的、不小心写错了混淆文件、复制了其他人的混淆逻辑)

由于多数博客鱼龙混杂,本博客如果让你非常满意或解决了大家的根本性问题,希望多多支持在右边点赞和回复一下,举手之劳方便大家。

转载请注明出处:王能的博客Android Proguard 不混淆所有第三方jar(忽略配置设置)_王能的小屋-CSDN博客_android 不混淆

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 43
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 43
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值