今天给大家分享一个只混淆自己的项目代码而不混淆所有第三方jar的方法(没错,是所有的第三方都不进行混淆,无论来什么第三方,都不需要动混淆配置)
使用注意:如果你项目用的第三方特别杂乱、特别多,不混淆的话会导致包体积增大很多
在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.example.** {*;}//以前是这样写的,as3.0之前的朋友烦请自测一下哪个有效
#3.0之后的写法
-keep class !com.wang.**,** {*;}
-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 {
(...);
}
#序列化
-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 ;
}
#WebView
-keepclassmembers class * extends android.webkit.WebView {*;}
-keepclassmembers class * extends android.webkit.WebViewClient {*;}
-keepclassmembers class * extends android.webkit.WebChromeClient {*;}
-keepclassmembers class * {
@android.webkit.JavascriptInterface ;
}
#-------------------------------------------项目定义区-------------------------------------------------
#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.taobao.app.**,** {*;}(3.0之前的朋友烦请自测一下里面2种写法哪个正确)
③反射、bean、eventbus等数据敏感区参照最后面的项目自定义自行增加
很多新手总是出问题,此处追加demo:https://github.com/weimingjue/ProguardExample
java代码里请改成自己的包路径,你的json解析文件及其他敏感数据请写在项目自定义区里面:
包路径即你java文件里声明“package com.x.x.x;”的前几个,一般情况下和packageName、applicationId相同
举例:你Mainfest的packageName=“com.a.a”,build.gradle的applicationId=“com.b.b”,你的代码实际都是“package com.c.c.activity.MainActivity”及相关“com.c.c”目录下的,那么你应该写“-keep class !com.c.c.** {*;}”
问题1:没混淆正常,开了混淆就崩溃
请看日志!看日志!看日志!一般都是使用了反射出现的xxxNotFound异常或者一些bean数据类忘加了,自行添加忽略
问题2:开了混淆没任何作用
1.查看是否改成了自己的包路径(检查ApplicationId和packageName,如果不一致请按照上面修改)
2.查看release是否开启了混淆,打包时选择release,并用AS查看
4.确认你的混淆文件路径正确,并且和上面基本一致(如混淆文件乱放的、不小心写错了混淆文件、复制了其他人的混淆逻辑)
由于多数博客鱼龙混杂,本博客如果让你非常满意或解决了大家的根本性问题,希望多多支持在右边点赞和回复一下,举手之劳方便大家。
转载请注明出处:王能的博客https://blog.csdn.net/weimingjue/article/details/84976058