精华内容
下载资源
问答
  • 混淆配置文件

    2019-02-22 15:21:09
    对于Android应用的混淆,网上有很多的资料,也有很多的相关案例和模板,相信大家也都比较熟悉。但是,对于一些公司要求混淆度比较高的,有的人就会比较犯难,因为网上的大多模块,并不能完成这个需求,那我们怎么能...
  • 混淆studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。优点:1.删除项目无用...

    混淆

    studio 使用Proguard进行混淆,其是一个压缩、优化和混淆java字节码文件的一个工具。

    功能:Shrinking(压缩)、Optimization(优化)、Obfuscattion(混淆)、Preverification(预校验)四个操作。

    优点:

    1.删除项目无用的资源,有效减小apk大小;

    2.删除无用的类、类成员、方法和属性,还可以删除无用的注释,最大限度的优化字节码文件;

    3.使用简短无意义的名称重命名已存在的类、方法、属性等,增加逆向工程的难度。

    配置

    buildTypes {

    release {

    // true - 打开混淆

    minifyEnabled true

    // true - 打开资源压缩

    shrinkResources true

    // 用于设置Proguard的规划路径;

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',

    '../libModule/proguard-rules.pro'

    }

    }

    proguard-android.txt:其中proguard-android.txt 是系统默认的混淆文件,具体在../sdk/tools/proguard/ 目录下,其中包含了 android 最基本的混淆,一般不需要改动;

    proguard-rules.pro:是我们需要配置的规则;如果要配置多个Module的混淆文件,只需要后面添加逗号跟混淆文件路径;

    基本混淆配置

    # 代码混淆压缩比,在0~7之间,默认为5,一般不做修改

    -optimizationpasses 5

    # 混合时不使用大小写混合,混合后的类名为小写

    -dontusemixedcaseclassnames

    # 指定不去忽略非公共库的类

    -dontskipnonpubliclibraryclasses

    # 指定不去忽略非公共库的类成员

    -dontskipnonpubliclibraryclassmembers

    # 这句话能够使我们的项目混淆后产生映射文件

    # 包含有类名->混淆后类名的映射关系

    -verbose

    # 不做预校验,preverify是proguard的四个步骤之一,Android不需要preverify,去掉这一步能够加快混淆速度。

    -dontpreverify

    # 保留Annotation不混淆 这在JSON实体映射时非常重要,比如fastJson

    -keepattributes *Annotation*,InnerClasses

    # 避免混淆泛型

    -keepattributes Signature

    # 抛出异常时保留代码行号

    -keepattributes SourceFile,LineNumberTable

    # 指定混淆是采用的算法,后面的参数是一个过滤器

    # 这个过滤器是谷歌推荐的算法,一般不做更改

    -optimizations !code/simplification/cast,!field/*,!class/merging/*

    # 忽略警告

    -ignorewarnings

    # 设置是否允许改变作用域

    -allowaccessmodification

    # 把混淆类中的方法名也混淆了

    -useuniqueclassmembernames

    # apk 包内所有 class 的内部结构

    -dump class_files.txt

    # 未混淆的类和成员

    -printseeds seeds_txt

    # 列出从apk中删除的代码

    -printusage unused.txt

    # 混淆前后的映射

    -printmapping mapping.txt

    不能使用混淆

    1、反射中使用的元素,需要保证类名、方法名、属性名不变,否则反射会有问题。

    2、最好不让一些bean 类混淆

    3、四大组件不能混淆,四大组件必须在 manifest 中注册声明,而混淆后类名会发生更改,这样不符合四大组件的注册机制。

    -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.BackupAgent

    -keep public class * extends android.preference.Preference

    -keep public class * extends android.support.v4.app.Fragment

    -keep public class * extends android.app.Fragment

    -keep public class * extends android.view.view

    -keep public class com.android.vending.licensing.ILicensingService

    4、注解不能混淆,很多场景下注解被用于在进行时反射一些元素。

    -keepattributes *Annotation*

    5、不能混淆枚举中的value和valueOf方法,因为这两个方法是静态添加到代码中进行,也会被反射使用,所以无法混淆这两种方法。应用使用枚举将添加很多方法,增加了包中的方法数,将增加 dex 的大小。

    -keepclassmembers enum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

    }

    6、JNI 调用 Java 方法,需要通过类名和方法名构成的地址形成。

    7、Java 使用 Native 方法,Native 是C/C++编写的,方法是无法一同混淆的。

    -keepclasseswithmembernames class * {

    native ;

    }

    8、JS 调用Java 方法

    -keepattributes *JavascriptInterface*

    9、Webview 中 JavaScript 的调用方法不能混淆

    注意:Webview 引用的是哪个包名下的。

    -keepclassmembers class fqcn.of.javascript.interface.for.webview {

    public *;

    }

    -keepclassmembers class * extends android.webkit.WebViewClient {

    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);

    public boolean *(android.webkit.WebView, java.lang.String);

    }

    -keepclassmembers class * extends android.webkit.WebViewClient {

    public void *(android.webkit.WebView, java.lang.String);

    }

    10、第三方可建议使用其自身混淆规则

    11、Parcelable 的子类和 Creator 的静态成员变量不混淆,否则会出现 android.os.BadParcelableExeception 异常。

    Serializable 接口类反序列化:

    -keep class * implements android.os.Parcelable {

    public static final android.os.Parcelable$Creator *;

    }

    -keep class * implements java.io.Serializable {

    public *;

    }

    -keepclassmembers class * implements java.io.Serializable {

    static final long serialVersionUID;

    private static final java.io.ObjectStreamField[] serialPersistentFields;

    !static !transient ;

    private void writeObject(java.io.ObjectOutputStream);

    private void readObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

    }

    12、Gson 的序列号和反序列化,其实质上是使用反射获取类解析的

    -keep class com.google.gson.** {*;}

    -keep class sun.misc.Unsafe {*;}

    -keep class com.google.gson.stream.** {*;}

    -keep class com.google.gson.examples.android.model.** {*;}

    -keep class com.google.** {

    ;

    ;

    }

    -dontwarn class com.google.gson.**

    到此这篇关于Android studio 混淆配置详解的文章就介绍到这了,更多相关Android studio 混淆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    展开全文
  • android studio混淆文件配置proguard-rules.pro,以及各类架包混淆选择,混淆设定
  • 如何写一个混淆配置文件

    千次阅读 2016-11-30 20:31:16
    一、混淆apk的必要性 当我们的app开发完毕上传各大应用市场的时候如果我们不进行apk的混淆就会导致app的安全性大大的降低,你也不想自己幸幸苦苦做完的项目就这么轻易的被别人窃取了。混淆虽然不能完全防止别人反...

    一、混淆apk的必要性
    当我们的app开发完毕上传各大应用市场的时候如果我们不进行apk的混淆就会导致app的安全性大大的降低,你也不想自己幸幸苦苦做完的项目就这么轻易的被别人窃取了。混淆虽然不能完全防止别人反编译apk看到你的代码,也能很大程度上让反编译的代码阅读性降低。所以混淆还是必须的。

    二、如何混淆
    在Android Studio当中混淆APK实在是太简单了,,只需要修改build.gradle中的一行配置即可。可以看到, 现在build.gradle中minifyEnabled的值是false,这里我们只需要把值改成true,打出来的APK包就会是混淆过的了。如下 所示:

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

    其中minifyEnabled用于设置是否启用混淆,proguardFiles用于选定混淆配置文件。注意这里是在release闭包内进行配置的, 因此只有打出正式版的APK才会进行混淆,Debug版的APK是不会混淆的。
    但是这样混淆出来的app都是google的一些默认配置的混淆,但是我们的实际项目开发中有一些代码是不需要混淆的,所以这就需要我们自己写混淆文件。

    三、如何写混淆配置文件

    混淆文件
    混淆配置我们都写在文件proguard-rules.pro

    下面是混淆指令介绍:

    (1)、基本指令

    # 不优化输入的类文件  -dontoptimize
    # 代码混淆压缩比,在0~7之间,默认为5,一般不下需要修改
    -optimizationpasses 5
    
    # 混淆时不使用大小写混合,混淆后的类名为小写
    # windows下的同学还是加入这个选项吧(windows大小写不敏感)
    -dontusemixedcaseclassnames
    
    # 指定不去忽略非公共的库的类
    # 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明
    -dontskipnonpubliclibraryclasses
    
    # 指定不去忽略非公共的库的类的成员
    -dontskipnonpubliclibraryclassmembers
    
    # 不做预检验,preverify是proguard的四个步骤之一
    # Android不需要preverify,去掉这一步可以加快混淆速度
    -dontpreverify
    
    # 有了verbose这句话,混淆后就会生成映射文件
    # 包含有类名->混淆后类名的映射关系
    # 也可以使用printmapping指定映射文件的名称,不指定使用默认
    -verbose
    
    # 指定混淆时采用的算法,后面的参数是一个过滤器
    # 这个过滤器是谷歌推荐的算法,一般不改变
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
    
    # 保护代码中的Annotation不被混淆
    # 这在JSON实体映射时非常重要,比如fastJson
    -keepattributes *Annotation*
    
    # 避免混淆泛型
    # 这在JSON实体映射时非常重要,比如fastJson
    -keepattributes Signature
    
    # 抛出异常时保留代码行号
    -keepattributes InnerClasses,LineNumberTable
    
    #忽略警告
    -ignorewarning

    (2)需要保留的东西

    # 保留所有的本地native方法不被混淆
    -keepclasseswithmembernames class * {
       native <methods>;
    }
    
    # 保留了继承自Activity、Application这些类的子类
    # 因为这些子类有可能被外部调用
    # 比如第一行就保证了所有Activity的子类不要被混淆
    -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 * extends android.view.View
    -keep public class com.android.vending.licensing.ILicensingService
    
    # 如果有引用android-support-v4.jar包,可以添加下面这行
    -keep public class com.null.test.ui.fragment.** {*;}
    
    # 保留Activity中的方法参数是view的方法,
    # 从而我们在layout里面编写onClick就不会影响
    -keepclassmembers class * extends android.app.Activity {
       public void * (android.view.View);
    }
    
    # 枚举类不能被混淆
    -keepclassmembers enum * {
       public static **[] values();
       public static ** valueOf(java.lang.String);
    }
    
    # 保留自定义控件(继承自View)不能被混淆
    -keep public class * extends android.view.View {
       public <init>(android.content.Context);
       public <init>(android.content.Context, android.util.AttributeSet);
       public <init>(android.content.Context, android.util.AttributeSet, int);
       public void set*(***); *** get* ();
    }
    
    # 保留Parcelable序列化的类不能被混淆
    -keep class * implements android.os.Parcelable{
        public static final android.os.Parcelable$Creator *;
    }
    
    # 保留Serializable 序列化的类不被混淆
    -keepclassmembers class * implements java.io.Serializable {
       static final long serialVersionUID;
       private static final java.io.ObjectStreamField[] serialPersistentFields;
       !static !transient <fields>;
       private void writeObject(java.io.ObjectOutputStream);
       private void readObject(java.io.ObjectInputStream);
       java.lang.Object writeReplace();
       java.lang.Object readResolve();
    }
    
    # 对R文件下的所有类及其方法,都不能被混淆
    -keep class **.R$* {
        *;
    }
    # 对于带有回调函数onXXEvent的,不能混淆
    -keepclassmembers class * {
        void *(**On*Event);
    }
    
    # 构造函数从xml构造的类不混淆
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
    }
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet, int);
    }

    (3)、针对App的量身定制

    <1>保留实体类和成员不被混淆

    对于实体,要保留它们的get和set方法,对于boolean型get方法有的命名是isXXX类型,不要遗漏

    #全部忽略
    -keep class com.null.test.entities.** {
        *;
    }
    #忽略get和set方法
    -keep class com.null.test.entities.** {
        public void set*(***);
        public *** get*();
        public *** is*();
    }
    # 以上两种任意一种都行

    <2>内嵌类

    内嵌类经常容易被混淆,结果调用的时候为空就崩溃了。最好的办法就是不用内嵌类(有点扯淡),如果MainActivity中使用了,就用如下代码

    -keep class com.null.test.MainActivity$* {
        *;
    }

    $这个符号就是用来分割内嵌类与其母体的标志

    <3>对WebView的处理

    如果项目中用到了WebView的复杂操作,请加入以下代码:

    -keepclassmembers class * extends android.webkit.WebViewClient {
        public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
        public boolean *(android.webkit.WebView, java.lang.String);
    }
    -keepclassmembers class * extends android.webkit.WebViewClient {
        public void *(android.webkit.WebView, java.lang.String);
    }

    <4>对JavaScript的处理

    -keepclassmembers class com.null.test.MainActivity$JSInterfacel {
        <methods>;
    }

    (4)针对第三方jar包的解决方案

    一般来说第三方的SDK都是经过ProGuard混淆了的。我们要做的就是避免其再次在我们的App混淆。

    <1>针对andoid-support-v4.jar的解决方案

    -libraryjars ./libs/android-support-v4.jar
    -dontwarn android.support.v4.** 
    -dontwarn **CompatHoneycomb
    -dontwarn **CompatHoneycombMR2
    -dontwarn **CompatCreatorHoneycombMR2
    -keep interface android.support.v4.app.** { *; }
    -keep class android.support.v4.** { *; }
    -keep public class * extends android.support.v4.**
    -keep public class * extends android.app.Fragment

    这里注意一个问题就是,很有可能在我们引用的其他包里面也会依赖v4包,因两个(或者以上)v4的版本是不一样的,在运行期间抛出NoClassDefFoundError异常。相应的解决办法就是都依赖同一个v4包就行
    了。

    <2>其他第三方的jar包的解决方案

    这个要取决第三方jar包的混淆策略了。一般在其官方文档上面都有混淆说明。比如支付宝相应的混淆规则就是:

    -libraryjars ./libs/alipaysdk.jar
    -dontwarn com.alipay.android.app.** 
    -keep public class com.alipay.** {*;}

    图片加载框架Glide混淆

    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
        **[] $VALUES;
         public *;
    }

    如果没有官方混淆文档,需要配置的混淆代码也是类似的

    四、混淆关键字

    dontwarn
    缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
    libraryjars
    引用第三方jar包

    keep
    保留类和类中的成员,防止它们被混淆或移除。
    keepnames
    保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
    keepclassmembers
    只保留类中的成员,防止它们被混淆或移除。
    keepclassmembernames
    只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
    keepclasseswithmembers
    保留类和类中的成员,防止它们被混淆或移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
    keepclasseswithmembernames
    保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。

    五、通配符

    <field>

    匹配类中的所有字段

    <method>

    匹配类中的所有方法

    <init>

    匹配类中的所有构造函数

    *

    匹配任意长度字符,但不含包名分隔符(.)。比如说我们的完整类名是com.example.test.MyActivity,使用com.*,或者 com.exmaple.*都是无法匹配的,因为*无法匹配包名中的分隔符,正确的匹配方式是com.exmaple.*.*,或者 com.exmaple.test.*,这些都是可以的。但如果你不写任何其它内容,只有一个*,那就表示匹配所有的东西。

    **

    匹配任意长度字符,并且包含包名分隔符(.)。比如proguard-android.txt中使用的-dontwarn android.support.**就可以匹配android.support包下的所有内容,包括任意长度的子包。

    ***

    匹配任意参数类型。比如void set*(***)就能匹配任意传入的参数类型,*** get*()就能匹配任意返回值的类型。

    匹配任意长度的任意类型参数。比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)这些方法。

    展开全文
  • Android混淆配置(含androidx、kotlin)通用的混淆配置文件
  • Android混淆文件配置

    千次阅读 2019-09-26 19:23:14
    正常一个APP都会开启混淆,但是有时后接手的项目并没有开启混淆,然后自己修改的时候就很蛋疼,因为开启混淆便会报错,如果有一些没有用过的第三方库更要自己去处理,这里就记录一下安卓常见的混淆文件和常规用法。...

    前言

    正常一个APP都会开启混淆,但是有时后接手的项目并没有开启混淆,然后自己修改的时候就很蛋疼,因为开启混淆便会报错,如果有一些没有用过的第三方库更要自己去处理,这里就记录一下安卓常见的混淆文件和常规用法。

    混淆好处以及哪些是不能混淆的

    面试常问混淆好处,我们张口就来:

    • 打包时会去掉无用资源有效减少APK体积(尤其对一些开发不规范导致很多无效代码和资源文件)其实这也可以变向的解决64k问题
    • 增加反编译成本,有效提高APK安全性(其实很多APK都会用第三方加密工具如360、爱加密)

    但是并不是什么都可以混淆的:(具体配置代码都有)

     - 实体类
     - 序列化对象
     - 反射
     - 枚举
     - resource
     - native方法(像java调用c++)
     - 一些自定义控件
     - Gson对象
    

    开启混淆

       buildTypes {
            debug {
                // 显示Log
                buildConfigField "boolean", "LOG_DEBUG", "true"
    
                minifyEnabled false//是否开启混淆
                zipAlignEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//加载的混淆文件
                signingConfig signingConfigs.debug
            }
            release {
                // 不显示Log
                buildConfigField "boolean", "LOG_DEBUG", "false"
    
                minifyEnabled true//是否开启混淆
                zipAlignEnabled true
                // 移除无用的resource文件
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置
                signingConfig signingConfigs.release
            }
        }
    

    可以看到其实是否开启混淆通过:

    minifyEnabled true//是否开启混淆
    proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’//混淆文件位置

    但是你开启混淆会打包很慢的所以这里一定要区分当前打包模式是:debug还是release,一般debug打包提供测试用,我们不会开启混淆。

    如何打签名包

    通过AS工具面板Build ---->Generate Singned Bundle or APK
    我们选择apk后,输入好签名密码:
    在这里插入图片描述这里如果你设置渠道包的话会选择当前渠道,我这就简单选择release点击finish便可。

    混淆文件配置

    重头戏来啦,在android中常用的混淆文件(可以复制我这个常用的然后再添加)

    指定代码的压缩级别
    -optimizationpasses 5
    #包明不混合大小写
    -dontusemixedcaseclassnames
    #不去忽略非公共的库类
    -dontskipnonpubliclibraryclasses
     #优化  不优化输入的类文件
    -dontoptimize
     #预校验
    -dontpreverify
     #混淆时是否记录日志
    -verbose
     # 混淆时所采用的算法
    -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
    #保护注解
    -keepattributes *Annotation*
    #如果有引用v4包可以添加下面这行
    -keep public class * extends android.support.v4.app.Fragment
    #忽略警告
    -ignorewarning
    ##记录生成的日志数据,gradle build时在本项目根目录输出##
    #apk 包内所有 class 的内部结构
    -dump proguard/class_files.txt
    #未混淆的类和成员
    -printseeds proguard/seeds.txt
    #列出从 apk 中删除的代码
    -printusage proguard/unused.txt
    #混淆前后的映射
    -printmapping proguard/mapping.txt
    ########记录生成的日志数据,gradle build时 在本项目根目录输出-end######
    #如果引用了v4或者v7包
    -dontwarn android.support.**
    #保持 native 方法不被混淆
    -keepclasseswithmembernames class * {
        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);
    }
    
    -keep public class * extends android.view.View {
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
        public void set*(...);
    }
    
    #保持 Parcelable 不被混淆
    -keep class * implements android.os.Parcelable {
      public static final android.os.Parcelable$Creator *;
    }
    
    #保持 Serializable 不被混淆
    -keepnames class * implements java.io.Serializable
    
    #保持 Serializable 不被混淆并且enum 类也不被混淆
    -keepclassmembers class * implements java.io.Serializable {
        static final long serialVersionUID;
        private static final java.io.ObjectStreamField[] serialPersistentFields;
        !static !transient <fields>;
        !private <fields>;
        !private <methods>;
        private void writeObject(java.io.ObjectOutputStream);
        private void readObject(java.io.ObjectInputStream);
        java.lang.Object writeReplace();
        java.lang.Object readResolve();
    }
    
    #保持枚举 enum 类不被混淆
    -keepclassmembers enum * {
      public static **[] values();
      public static ** valueOf(java.lang.String);
    }
    
    -keepclassmembers class * {
        public void *ButtonClicked(android.view.View);
    }
    
    #不混淆资源类
    -keepclassmembers class **.R$* {
        public static <fields>;
    }
    
    #避免混淆泛型 如果混淆报错建议关掉
    -keepattributes Signature
    
    #移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
    #-assumenosideeffects class android.util.Log {
    #    public static *** v(...);
    #    public static *** i(...);
    #    public static *** d(...);
    #    public static *** w(...);
    #    public static *** e(...);
    #}
    
    #-------------------------------------------定制化区域----------------------------------------------
    #---------------------------------1.实体类---------------------------------
    -keep class 自己项目的包名.bean.** { *; }
    
    #########################################################第三方的配置开始#######################
    ############shareSDK混淆配置################
    -keep class cn.sharesdk.**{*;}
    -keep class com.sina.**{*;}
    -keep class **.R$* {*;}
    -keep class **.R{*;}
    -keep class com.mob.**{*;}
    #####EventBus混淆配置
    -keepattributes *Annotation*
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    
    # Only required if you use AsyncExecutor
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    }
    
    ###########极光混淆配置
    -dontoptimize
    -dontpreverify
    
    -dontwarn cn.jpush.**
    -keep class cn.jpush.** { *; }
    -keep class * extends cn.jpush.android.helpers.JPushMessageReceiver { *; }
    
    -dontwarn cn.jiguang.**
    -keep class cn.jiguang.** { *; }
    
    
    ###########okhttputils 和okhttp相关的 的混淆####################
    #okhttputils
    -dontwarn com.zhy.http.**
    -keep class com.zhy.http.**{*;}
    
    #okhttp
    -dontwarn okhttp3.**
    -keep class okhttp3.**{*;}
    
    
    #okio
    -dontwarn okio.**
    -keep class okio.**{*;}
    
    -dontwarn com.squareup.okhttp.**
    -dontwarn javax.annotation.**
    -dontwarn com.android.volley.toolbox.**
    -dontwarn com.facebook.infer.**
    -keep class com.squareup.okhttp.** { *;}
    -keep interface com.squareup.okhttp.** { *; }
    
    ######################### Retrofit混淆配置##############################
    -dontnote retrofit2.Platform
    -dontnote retrofit2.Platform$IOS$MainThreadExecutor
    -dontwarn retrofit2.Platform$Java8
    -keepattributes Signature
    -keepattributes Exceptions
    
    #########################友盟的混淆配置################
    
    -keep class com.umeng.** {*;}
    -keepclassmembers class * {
       public <init> (org.json.JSONObject);
    }
    
    -keepclassmembers class * {
       public <init>(org.json.JSONObject);
    }
    -keep public class [com.uutus.huaxia.geography].R$*{
    public static final int *;
    }
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    -keep public class [com.uutus.huaxia.geography].R$*{
    public static final int *;
    }
    
    ###############加密混淆###########
    ########腾讯X5内核浏览器中的的代码不被混淆#####
    -keep class com.tencent.** {*;}
    ########RSA中的代码不被混淆
    -keep class Decoder.** {*;}
    -keep class org.bouncycastle.** {*;}
    
    ################Glide加载图片添加混淆
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
      **[] $VALUES;
      public *;
    }
    ######## glide类库
    ########  com.github.bumptech.glide:okhttp3-integration:1.4.0@aar中的代码不被混淆
    ########  jp.wasabeef:glide-transformations:2.0.1 不被混淆
    -keep class com.bumptech.** {*;}
    -keep class jp.wasabeef.glide.** {*;}
    ##########  保证类库Image 中导入的jar包不被混淆
    -keep class com.davemorrissey.** {*;}
    -keep class com.filippudak.** {*;}
    -keep class am.util.** {*;}
    -keep class com.blankj.** {*;}
    
    #########################################################第三方的配置结束#######################
    
    #==================gson && protobuf==========================
    -dontwarn com.google.**
    -keep class com.google.gson.** {*;}
    -keep class com.google.protobuf.** {*;}
    
    #ProGuard 混淆
    
    # keep住源文件以及行号
    -keepattributes SourceFile,LineNumberTable
    
    
    -keepattributes Signature
    -dontwarn com.jcraft.jzlib.**
    -keep class com.jcraft.jzlib.**  { *;}
    
    -dontwarn sun.misc.**
    -keep class sun.misc.** { *;}
    
    -dontwarn com.alibaba.fastjson.**
    -keep class com.alibaba.fastjson.** { *;}
    
    -dontwarn sun.security.**
    -keep class sun.security.** { *; }
    
    -dontwarn com.google.**
    -keep class com.google.** { *;}
    
    -dontwarn com.avos.**
    -keep class com.avos.** { *;}
    
    -keep public class android.net.http.SslError
    -keep public class android.webkit.WebViewClient
    
    -dontwarn android.webkit.WebView
    -dontwarn android.net.http.SslEr
    -dontwarn android.webkit.WebViewClient
    
    -dontwarn android.support.**
    
    -dontwarn org.apache.**
    -keep class org.apache.** { *;}
    
    -dontwarn org.jivesoftware.smack.**
    -keep class org.jivesoftware.smack.** { *;}
    
    -dontwarn com.loopj.**
    -keep class com.loopj.** { *;}
    
    
    -dontwarn org.xbill.**
    -keep class org.xbill.** { *;}
    
    -keepattributes *Annotation*
    
    
    # Gson
    -keep class com.example.testing.retrofitdemo.bean.**{*;} # 自定义数据模型的bean目录
    #gson
    #如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
    
    ##---------------Begin: proguard configuration for Gson  ----------
    # Gson uses generic type information stored in a class file when working with fields. Proguard
    # removes such information by default, so configure it to keep all of it.
    -keepattributes Signature
    
    # For using GSON @Expose annotation
    -keepattributes *Annotation*
    
    # Gson specific classes
    -dontwarn sun.misc.**
    #-keep class com.google.gson.stream.** { *; }
    
    # Prevent proguard from stripping interface information from TypeAdapterFactory,
    # JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)
    -keep class * implements com.google.gson.TypeAdapterFactory
    -keep class * implements com.google.gson.JsonSerializer
    -keep class * implements com.google.gson.JsonDeserializer
    # Application classes that will be serialized/deserialized over Gson
    
    
    ##---------------End: proguard configuration for Gson  ----------
    
    #基础混淆添加配置
    -keepclassmembers class **.R$* {
        public static <fields>;
        public static final int *;
    }
    -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆
        public void *(android.view.View);
    }
    

    Ps: 这个也是我找的其实蛮全的,基本上常用的像:Gosn fastJson、Okhttp,以及一些初始化配置这里都用。
    但是需要注意的是:

    关于实体类和一些自己常用的混淆命令

    我们知道实体类是不能混淆的,并且每个项目的实体类都不一样的,比如:你的实体类完整包名字:

    com.xxx.xxx.bean
    -keep class com.xxx.xxx.bean.**{*;}
    表示当前路径下全部文件都保持不被混淆

    还有一个常用命令是:
    -dontwarn

    很多时候你会发现有些不能混淆的类你加了keep配置但是打包还是报错,编译不通过,这个时候你不妨用上这个命令比如:
    -keep class com.jianke.ui.{*;}
    -dontwarn com.jianke.ui.

    这个表示不对当前包名下类警告,让编译通过

    还有一些
    -libraryjars class_path 不混淆指定的jar库(android 项目中一般不混淆引入的第三方类库)
    等,具体可以看:
    最全面的混淆规则

    展开全文
  • 混淆配置

    千次阅读 2019-02-28 11:14:20
    1.创建一个混淆配置文件,命名为proguard-rules.pro(项目创建时可能已经包含) -optimizationpasses 5 -dontusemixedcaseclassnames -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!...

    一、应用中使用混淆

    1.创建一个混淆配置文件,命名为proguard-rules.pro(项目创建时可能已经包含)

    -optimizationpasses 5
    -dontusemixedcaseclassnames
    -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 <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.tabButton.View);
    }
    -keepclassmembers enum * {
        public static **[] values();
        public static ** valueOf(java.lang.String);
    }
    
    -keep class * implements android.os.Parcelable {
        public static final android.os.Parcelable$Creator *;
    }
    
    -keepattributes Signature
    -ignorewarnings
    
    
    -keepattributes *Annotation*
    //第三方库不做混淆
    -keepclassmembers class ** {
        @org.greenrobot.eventbus.Subscribe <methods>;
    }
    -keep enum org.greenrobot.eventbus.ThreadMode { *; }
    -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
        <init>(java.lang.Throwable);
    }
    -dontwarn org.greenrobot.eventbus.**
    -keep class org.greenrobot.eventbus.** { *;}
    
    -keep public class * implements com.bumptech.glide.module.GlideModule
    -keep public class * extends com.bumptech.glide.module.AppGlideModule
    -keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
      **[] $VALUES;
      public *;
    }
    //腾讯Bugly
    -dontwarn com.tencent.bugly.**
    -keep public class com.tencent.bugly.**{*;}
    
    -dontwarn com.prtek.**
    -keep public class com.prtek.**{*;}
    //腾讯云统计
    -keep class com.tencent.stat.*{*;}
    
    -keep class com.tencent.mid.*{*;}

    2.在应用模块build.gradle下配置混淆文件路径,启用代码压缩 minifyEnabled true

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

    二、库项目配置混淆

    1.和应用项目第一步一致

    2.要指定库模块的配置文件名称,请将其添加到 consumerProguardFiles 方法中,此方法位于库模块的 build.gradle 文件的 defaultConfig 块内。

    android {
        defaultConfig {
            consumerProguardFiles 'proguard-rules.pro'
        }
        ...
    }

    三、混淆问题

    1.将library项目改成App项目时,记得检查一下build.gradle 文件,出问题先按着这两个步骤来排查

    2.混淆过apk如何追踪问题及查看已移除的文件和mapping文件

    展开全文
  •  * 混淆文件的位置 * proguard-android.txt 默认的混淆文件(SDK目录/tools/proguard/) * proguard-rules.pro 让我们自行添加混淆规则文件(相应module的目录下) */ proguardFiles getDefaultProguardFile('...
  • 混淆打包Android library工程的混淆配置文件
  • # 优化不优化输入的类文件 -dontoptimize # 预校验 -dontpreverify # 混淆时是否记录日志 -verbose # 混淆时所采用的算法 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # ...
  • allatori第二代Java代码混淆器Maven打包配置,依赖库,以及配置文件。示例运行,可行。
  • 通过输入一个apk文件和签名文件,输出相关的配置文件及资源文件被混淆的apk(带签名),注意是资源文件混淆不是代码混淆噢.
  • Android常用混淆配置

    2019-08-22 15:21:10
    为了应用的安全,通常...混淆配置文件图 1. 混淆配置 在AS中可以通过配置proguard-rules.pro文件,对生成的apk和jar进行加密,另外还需要配置项目中 app下的 build.gradle 来开启混淆功能。 buildTypes { debu...
  • 刚好程序报错中的com.b.a.a.a 就是指的idea/libraries中的一个包中的类,即为com.loopj.android.http.AsyncHttpClient,不知道怎么在混淆配置文件中忽略这些包的混淆。最后通过配置,发现这些包还是被混淆了,不知道...
  • 流程不过多说了…可以按照这位程序猿的...我主要说下,配置文件中一些配置细节 : 不混淆lib下jar包里面的class文件 -keep class WebRoot.WEB-INFO.lib.* 不混淆action包里面的类名,字段名,方法名 在界面上会...
  • 为了防止自己的APP被轻易反编译,我们...本文说说android 如何配置混淆。 关于如何反编译android apk,见我另外一篇文章:win/mac下反编译Android安装包-APK文件,http://blog.csdn.net/dzsw0117/article/details/51
  • 1,Lib-Module中Gradle文件混淆配置只对当前Lib-Module生成的AAR文件有效 2,同理,App-Module中Gradle文件混淆配置只对当前App-Module生成的APK文件有效 3,getDefaultProguardFile('proguard-android.txt')...
  • Android开发——常用的代码混淆配置

    千次阅读 2018-07-06 22:07:33
    在Android开发当中,必不可少的是混淆配置。可是我们要做代码混淆呢?我来跟大家分享一下我开发的时候做代码混淆文件配置吧! 代码混淆的好处 代码混淆,增加逆向之后的解读的难度; 精简代码,删掉没有用到的...
  • Android Gson 混淆配置(最新)

    千次阅读 2019-07-17 17:22:35
    将下面的配置复制到你的 proguard-rules.pro 文件中: ##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with ...
  • java 源码加密 混淆,proguard 配置文件,很详细,经测试可以用
  • 在打包进行 Android studio 中混淆的时候 有时候会遇到(尤其是初次混淆时) 就会遇到 在不进行混淆的时候 一切正常 但是在混淆之后 就无数据了 下面 我就给大家 介绍一下 混淆文件配置 # Add project specific ...
  • Android 混淆配置

    千次阅读 2019-05-06 11:40:34
    混淆文件基础配置 # 在这里添加项目的代码混淆规则 # 混淆规则请参考:http://proguard.sourceforge.net/index.html#manual/usage.html ##################### 一般使用默认 ##################### # 不使用大小写...
  • Android APK代码混淆和资源文件混淆

    千次阅读 2017-11-08 15:46:15
    Android项目在完工发布时,需要对代码和资源文件进行混淆,目的有两个: 1⃣️减小压缩包的体积 2⃣️防止代码被反编译后恶意利用 Android Apk混淆分两步走: 1⃣️混淆代码 2⃣️混淆资源文件 本人的开发环境为...
  • 压缩包根目录下有我修改的安卓JAVA项目混淆配置文件,proguard自带的混淆配置文件在SAMPLE目录下,但混淆后运行经常报错,因此根据查阅网上资料做了修改,测试通过。可以作为个性化混淆配置的基础版
  • 混淆代码就能删除这些调试信息,并用无意义字符替换所有名字,增加反编译难度!ProGuard是一个混淆代码的开源项目,主要作用如下: 混淆Obfuscate 用无意义字符替换类名/字段名/属性名/方法名等 压缩Shrink 移除...
  • android studio配置打包混淆的aar库文件

    千次阅读 2018-05-22 14:01:56
    最近项目中有用到发布混淆aar的需求,网上有很多方法,但都不够全面,这里把自己整理的结果做个汇总,避免重复收集浪费时间 环境要求 android studio(该方法是针对AS的) 初始需求 把你项目中的某一个...
  • 压缩包根目录下有我修改的安卓JAVA项目混淆配置文件,proguard自带的混淆配置文件在SAMPLE目录下,但混淆后运行经常报错,因此根据查阅网上资料做了修改,测试通过。可以作为个性化混淆配置的基础版
  • 已解决 Android Studio 混淆配置后 应该输出的mapping 文件 seed 文件 unused 文件

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 91,492
精华内容 36,596
关键字:

文件混淆配置