赞
踩
今天给大家分享一个只混淆自己的项目代码而不混淆所有第三方jar的方法(没错,是所有的第三方都不进行混淆,无论来什么第三方,都不需要动混淆配置)
例如你有: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的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 不混淆
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。