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

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

不混淆所有第三方再次归来

今天心血来潮仔细看了一下Proguard的官网,发现原来是混淆规则使用不当导致(可能新版本更新了吧)

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

 

一、为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.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

你可能感兴趣的:(android教程,不做框架只做UI,Android,Proguard,不混淆,所有全部,第三方jar)