精华内容
下载资源
问答
  • android混淆

    2021-05-28 01:14:40
    一,开启当您使用 Android Gradle 插件 3.4.0 或更高版本构建项目时,该插件不再使用 ProGuard 来执行编译时代码优化,而是与 R8 编译器协同工作来处理以下编译时任务android {buildTypes {release {// Enables code...

    一,开启

    当您使用 Android Gradle 插件 3.4.0 或更高版本构建项目时,该插件不再使用 ProGuard 来执行编译时代码优化,而是与 R8 编译器协同工作来处理以下编译时任务

    android {

    buildTypes {

    release {

    // Enables code shrinking, obfuscation, and optimization for only

    // your project's release build type.

    minifyEnabled true

    // Enables resource shrinking, which is performed by the

    // Android Gradle plugin.

    shrinkResources true

    // Includes the default ProGuard rules files that are packaged with

    // the Android Gradle plugin. To learn more, go to the section about

    // R8 configuration files.

    proguardFiles getDefaultProguardFile(

    'proguard-android-optimize.txt'),

    'proguard-rules.pro'

    }

    }

    ...

    }

    自定义要保留的资源

    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"

    tools:discard="@layout/unused2" />

    二,关键字

    keep {Modifier} {class_specification} 保护指定的类文件和类的成员

    keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

    keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

    keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

    keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

    keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

    printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

    dontobfuscate 不混淆输入的类文件

    obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

    overloadaggressively 混淆时应用侵入式重载

    useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

    flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

    repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

    dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

    keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

    renamesourcefileattribute {string} 设置源文件中给定的字符串常量

    三,哪些不可混淆

    UI,自定义控件

    序列化对象

    webview调用的JavaScript

    JNI

    反射

    枚举enum

    第三方库

    Gson的java bean

    Parcelable 的子类和 Creator 静态成员变量不混淆

    四,输出报告

    dump.txt 描述apk文件中所有类文件间的内部结构。

    mapping.txt 列出了原始的类,方法,和字段名与混淆后代码之间的映射。(R8 会将此文件保存在 /build/outputs/mapping// 目录中。)

    seeds.txt 列出了未被混淆的类和成员

    usage.txt 列出了从apk中删除的代码。

    要输出 R8 在构建项目时应用的所有规则的完整报告,请将以下代码添加到模块的 proguard-rules.pro 文件中:

    // You can specify any path and filename.

    -printconfiguration tmp/full-r8-config.txt

    五,多模块

    子模块配置:

    release {

    consumerProguardFiles 'proguard-rules.pro'

    }

    只要app模块开了混淆,子模块无论是否打开混淆都是默认开启的

    子模块的混淆规则是无法影响app模块的的。所以建议,在子模块里尽量只放和子模块相关的混淆规则,一些公有的混淆方式请放在app或者公有的模块中。

    参考:

    展开全文
  • Android混淆规则

    2021-05-26 09:54:08
    为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能...

    简介

    Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。

    ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。

    官网地址:http://proguard.sourceforge.net/

    原理

    Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。

    混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

    混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

    Android 混淆

    Android 混淆代码直接在Android Studio 中配置

    android {

    buildTypes {

    release {

    shrinkResources true

    minifyEnabled true

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

    }

    }

    }

    由于混淆会增加编译时间,并且debug时编译器无法定位到具体位置,所以debug环境下不建议打开。

    代码混淆

    配置如 minifyEnabled true。

    代码混淆包括四个步骤,代码压缩,优化,混淆,预校验。

    压缩(shrink) : 移除无效的类,类成员,方法,属性等。

    优化(optimize) : 分析和优化二进制代码,根据proguard-android-optimize.txt中的描述,优化可能会造成一定的风险,不能保证在所有版本的Dalvik上正常运行。因此android项目建议关闭该项。

    混淆(obfuscate) : 把类名,属性名, 方法名替换为简短且无意义的名称。

    预校验(previrfy) : 添加预校验信息。 这个预校验是作用在java 平台的, Android 平台上不需要这项功能,去掉之后还可以加快混淆速度。因此android 项目关闭该项。

    这四个流程默认是开启的, 我们需要在Android混淆配置文件中关闭代码优化,和预校验功能,即-dontoptimize, -dontpreverify. 当然proguard-android.txt中默认已经关闭这两项了。

    ed135ddd5996

    项目混淆工作流程图

    资源混淆

    配置如 shrinkResources true。

    压缩资源将移除项目及依赖库中未被使用的资源,可以减少apk的大小,一般建议开启。

    资源处理包括合并资源,移除资源两个流程。

    Android Studio 打包时会自动进行merge资源,不受该参数控制。

    移除资源,需要配置该参数。不过建议可以使用lint先自行过一遍。

    java 混淆

    如果要将输出的jar包进行混淆,可以用proguard工具进行操作。分为命令行式和图像界面工具。可以去网上下载或者 android sdk提供了一个图形化工具proguard,可以进行混淆。路径如下 /sdk/tools/proguard/lib/proguardgui.jar 双击打开即可。

    在其中配置相关的混淆参数即可。

    代码混淆规则

    Android项目中配置如下proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 。 由android sdk 中提供的默认混淆规则proguard-android.txt 和 用户自定义的混淆规则proguard-rules.pro 两部分组成。

    命令

    作用

    -keep

    防止类和成员被移除或者被重命名

    -keepnames

    防止类和成员被重命名

    -keepclassmembers

    防止成员被移除或者被重命名

    -keepclassmembersname

    防止成员被重命名

    -keepclasseswithmembers

    防止拥有该成员的类和成员被移除或者被重命名

    -keepclasseswithmembernames

    防止拥有该成员的类和成员被重命名

    类通配符 *

    匹配任意长度字符,但不含包名分隔符(.)

    类通配符 **

    匹配任意长度字符,并且包含包名分隔符(.)

    类extends

    即可以指定类的基类

    类implements

    匹配实现了某接口的类

    类$

    内部类

    成员(方法)通配符 *

    匹配任意长度字符,但不含包名分隔符(.)

    成员(方法)通配符 **

    匹配任意长度字符,并且包含包名分隔符(.)

    成员(方法)通配符 ***

    匹配任意参数类型

    成员(方法)通配符 ...

    匹配任意长度的任意类型参数

    成员(方法)通配符 <>

    匹配方法名,eg.

    常见混淆命令

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

    -optimizationpasses 5

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

    # windows下的同学还是加入这个选项吧(windows大小写不敏感)

    -dontusemixedcaseclassnames

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

    # 默认跳过,有些情况下编写的代码与类库中的类在同一个包下,并且持有包中内容的引用,此时就需要加入此条声明

    -dontskipnonpubliclibraryclasses

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

    -dontskipnonpubliclibraryclassmembers

    # 不做预检验,preverify是proguard的四个步骤之一

    # Android不需要preverify,去掉这一步可以加快混淆速度

    -dontpreverify

    # 有了verbose这句话,混淆后就会生成映射文件

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

    # 然后使用printmapping指定映射文件的名称

    -verbose

    -printmapping priguardMapping.txt

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

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

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

    # 保护代码中的Annotation不被混淆

    # 这在JSON实体映射时非常重要,比如fastJson

    -keepattributes *Annotation*

    # 避免混淆泛型

    # 这在JSON实体映射时非常重要,比如fastJson

    -keepattributes Signature

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

    -keepattributes SourceFile,LineNumberTable

    keep 元素不进行混淆规则

    # 保留所有的本地native方法不被混淆

    -keepclasseswithmembernames class * {

    native ;

    }

    # 保留了继承自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 (android.content.Context);

    public (android.content.Context, android.util.AttributeSet);

    public (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 ;

    private void writeObject(java.io.ObjectOutputStream);

    private void readObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

    }

    # 对R文件下的所有类及其方法,都不能被混淆

    -keepclassmembers class **.R$* {

    *;

    }

    # 对于带有回调函数onXXEvent的,不能混淆

    -keepclassmembers class * {

    void *(**On*Event);

    }

    其他自定义混淆规则

    #内部类

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

    *;

    }

    #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);

    }

    #第三方库

    -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

    资源保持规则

    用shrinkResources true开启资源压缩后,所有未被使用的资源默认被移除。假如你需要定义哪些资源必须被保留,在 res/raw/ 路径下创建一个 xml 文件,例如 keep.xml。

    通过一些属性的设置可以实现定义资源保持的需求,可配置的属性有:

    tools:keep 定义哪些资源需要被保留(资源之间用“,”隔开)

    tools:discard 定义哪些资源需要被移除(资源之间用“,”隔开)

    tools:shrinkMode 开启严格模式

    mapping文件

    混淆过的包必须进行检查,避免因混淆引入的bug。

    混淆后会在 路径/build/outputs/mapping/release/ 目录下会输出以下文件:

    dump.txt 描述apk文件中所有类的内部结构

    mapping.txt 提供混淆前后类,方法,类成员等的对照表

    seeds.txt 列出没有被混淆的类和成员

    usage.txt 列出被移除的代码

    一般发布包的时候都要保留mapping.txt 文件。 目的有有两个, 1. 当出现线上crash时候,可以根据该mapping文件对照源码找到对应的位置。2. 当发布补丁包时候,也会指定该mapping文件,已避免补丁包无法使用。

    解出混淆栈

    在sdk/tools/proguard路径下附带了反解工具proguardgui.sh 或者 proguardgui.jar.打开即可,看到左侧的retrace, 选择混淆包对应的mapping.txt 文件, 再将crash 的 stack trace 粘贴到输入框中, 点击retrace 混淆前的堆栈信息即可显示。

    命令行操作为:

    retrace.bat|retrace.sh [-verbose] mapping.txt []

    eg. retace.sh -verbose mapping.txt log.txt

    指定mapping文件

    增加proguard-path-rules.pro , 在其中指定-applymapping mapping.txt.

    展开全文
  • 这里我们直接用Android Studio来说明如何进行混淆Android Studio自身集成Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单,只需要在工程应用目录的gradle文件中设置minifyEnabled为...

    这里我们直接用Android Studio来说明如何进行混淆,Android Studio自身集成Java语言的ProGuard作为压缩,优化和混淆工具,配合Gradle构建工具使用很简单,只需要在工程应用目录的gradle文件中设置minifyEnabled为true即可。然后我们就可以到proguard-rules.pro文件中加入我们的混淆规则了。

    android {

    buildTypes {

    release {

    minifyEnabled true

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

    }

    }

    }

    先看如下两个比较常用的命令,很多童鞋可能会比较迷惑以下两者的区别。

    //一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆

    -keep class cn.hadcn.test.*

    //两颗星表示把本包和所含子包下的类名都保持

    -keep class cn.hadcn.test.**

    用以上方法保持类后,你会发现类名虽然未混淆,但里面的具体方法和变量命名还是变了,这时如果既想保持类名,又想保持里面的内容不被混淆,我们就需要以下方法了

    //一颗星表示只是保持该包下的类名,而子包下的类名还是会被混淆

    -keep class cn.hadcn.test.* {*;}

    //两颗星表示把本包和所含子包下的类名都保持

    -keep class cn.hadcn.test.**{*;}

    注:**可能会报语法错误,不过这对程序运行并不影响,如果想要去除警告可以用:

    Alt+Enter来去掉警告即可

    避免所有继承于?的类被混淆

    -keep public class * extends android.app.Activity

    -keep public class * extends android.app.Appliction

    -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.preference.Preference

    -keep public class * extends android.view.View

    jni方法不可混淆,因为这个方法需要和native方法保持一致;

    -keepclasseswithmembernames class * {

    # 保持native方法不被混淆

    native ;

    }

    Parcelable的子类和Creator静态成员变量不混淆,否则会产生Android.os.BadParcelableException异常;

    -keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆

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

    }

    使用enum类型时需要注意避免以下两个方法混淆,因为enum类的特殊性,以下两个方法会被反射调用,见第二条规则。

    -keepclassmembers enum * {

    public static **[] values();

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

    }

    保持特定类不被混淆,bean应用广泛,需要混淆

    -keep class com.xy.z.HeBean{

    public *;

    }

    保留我们自定义控件(继承自View)不被混淆

    -keep public class * extends android.view.View{

    *** get*();

    void set*(***);

    public (android.content.Context);

    public (android.content.Context, android.util.AttributeSet);

    public (android.content.Context, android.util.AttributeSet, int);

    }

    保留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 ;

    !private ;

    !private ;

    private void writeObject(java.io.ObjectOutputStream);

    private void readObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

    }

    对于带有回调函数的onXXEvent、*OnListener的,不能被混淆

    -keepclassmembers class * {

    void *(**On*Event);

    void *(**On*Listener);

    }

    webView处理,项目中没有使用到webView忽略即可

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

    public *;

    }

    展开全文
  • Android混淆详解

    2021-05-26 10:45:06
    1.混淆的作用利用Proguard或者R8工具,对代码进行...2.混淆的用法2.1 如何开启混淆android {buildTypes {release {minifyEnabled trueshrinkResources trueproguardFiles getDefaultProguardFile('proguard-android...

    1.混淆的作用

    利用Proguard或者R8工具,对代码进行重命名,并删掉没有被引用的类、字段或者方法。对无用资源进行删除。

    2.混淆的用法

    2.1 如何开启混淆

    android {

    buildTypes {

    release {

    minifyEnabled true

    shrinkResources true

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

    }

    }

    }

    只有在启用混淆的前提下开启资源压缩才会有效!

    getDefaultProguardFile('proguard-android.txt') 方法可从 Android SDK tools/proguard/ 文件夹获取默认的 ProGuard规则文件,表示 Android 系统为我们提供的默认混淆规则文件。

    proguard-rules.pro文件用于添加自定义 ProGuard 规则。默认情况下,该文件位于模块根目录。

    我们一般在打 release 包时才启用混淆,因为混淆会增加额外的编译时间,所以不建议在 debug 模式下启用。

    2.2 proguard与R8

    proguard是用于java和android项目的混淆工具。

    Android Gradle插件3.4.0或更高版本时,R8和Proguard 相比,R8 可以更快地缩减代码,同时改善输出大小,R8 默认处于启用状态,你可将以下代码添加到项目的 。gradle.properties 文件以停用 R8:

    android.enableR8=false

    2.3 自定义混淆

    2.3.1 自定义要保持的代码

    2.3.1.1 常用ProGuard规则

    proguard中一共有三组六个keep关键字,很多人搞不清楚它们的区别,这里我们通过一个表格来直观地看下:

    [图片上传失败...(image-554618-1577426814253)]

    除此之外,proguard中的通配符也比较让人难懂,proguard-android.txt中就使用到了很多通配符,我们来看一下它们之间的区别:

    [图片上传失败...(image-a3de12-1577426814253)]

    关闭压缩

    -dontshrink

    关闭混淆

    -dontobfuscate

    保持指定包下的类名,不包括子包下的类名

    -keep class com.xy.myapp*

    保持指定包下的类名,包括子包下的类名

    -keep class com.xy.myapp**

    保持指定包下的类名以及类里面的内容

    -keep class com.xy.myapp.* {*;}

    保持所有继承于指定类的类

    -keep public class * extends android.app.Activity

    如果我们要保留一个类中的内部类不被混淆则需要用$符号,如下例子表示保持MyClass内部类JavaScriptInterface中的所有public内容。

    -keepclassmembers class com.xy.myapp.MyClass$JavaScriptInterface { public *; }

    保持指定类的所有方法

    -keep class com.xy.myapp.MyClass { public ; }

    保持指定类的所有字段

    -keep class com.xy.myapp.MyClass { public ; }

    保持指定类的所有构造器

    -keep class com.xy.myapp.MyClass { public ; }

    保持用指定参数作为形参的方法

    -keep class com.xy.myapp.MyClass { public (java.lang.String); }

    类文件除了定义类,字段,方法外,还为它们附加了一些属性,例如注解,异常,行号等,优化操作会删除不必要的属性,使用-keepattributes可以保留指定的属性

    -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

    使指定的类不输出警告信息

    -dontwarn com.squareup.okhttp.**

    2.3.1.2 keep注解

    2.3.2 自定义要保持的资源

    资源压缩包含了“合并资源”和“移除资源”两个流程。“合并资源”流程中,名称相同的资源被视为重复资源会被合并。需要注意的是,这一流程不受shrinkResources属性控制,也无法被禁止, gradle 必然会做这项工作。

    当我们开启了资源压缩之后,系统会默认替我们移除所有未使用的资源,假如我们需要保留某些特定的资源,可以在我们项目中创建一个被 标记的 XML 文件(如 res/raw/keep.xml),并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。同样,我们可以使用字符 * 作为通配符。

    <?xml version="1.0" encoding="utf-8"?>

    tools:keep="@layout/activity_video*,@layout/dialog_update_v2"

    tools:discard="@layout/unused_layout,@drawable/unused_selector" />

    2.3.3 移除替代资源

    一些替代资源,例如多语言支持的 strings.xml,多分辨率支持的 layout.xml 等,在我们不需要使用又不想删除掉时,可以使用资源压缩将它们移除。我们使用 resConfig 属性来指定需要支持的属性,例如

    android {

    defaultConfig {

    ...

    resConfigs "en", "fr"

    }

    }

    3.混淆的规则

    3.1必须保持的代码

    proguard-android.txt中的默认混淆规则:

    -keepattributes *Annotation* 表示对注解中的参数进行保留。

    不混淆任何包含native方法的类的类名以及native方法名。

    -keepclassmembers public class * extends android.view.View {

    void set*(***);

    *** get*();

    }

    不混淆任何一个View中的setXxx()和getXxx()方法,因为属性动画需要有相应的setter和getter的方法实现,混淆了就无法工作了。

    -keepclassmembers public class * extends android.view.View {

    void set*(***);

    *** get*();

    }

    表示不混淆Activity中参数是View的方法,因为有这样一种用法,在XML中配置android:onClick="buttonClick"属性,当用户点击该按钮时就会调用Activity中的buttonClick(View view)方法,如果这个方法被混淆的话就找不到了。

    -keepclassmembers class * extends android.app.Activity {

    public void *(android.view.View);

    }

    不混淆枚举中的values()和valueOf()方法。因为枚举类在编译后会生成一个继承自Enum的类,枚举类型最后转换成类中的static final属性,并多出了values()和valueOf()两个方法。混淆之后,这两个方法会被重命名。

    -keepclassmembers enum * {

    public static **[] values();

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

    }

    不混淆Parcelable实现类中的CREATOR字段。反序列化的时候,底层会反射获取静态的CREATOR字段,再调用createFromParcel()恢复数据。

    -keepclassmembers class * implements android.os.Parcelable {

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

    }

    不混淆R文件中的所有静态字段,我们都知道R文件是通过字段来记录每个资源的id的,字段名要是被混淆了,id也就找不着了。

    -keepclassmembers class **.R$* {

    public static ;

    }

    注解。

    -keepattributes *Annotation*

    -keep class * extends java.lang.annotation.Annotation {*;}

    其他的混淆点:

    AndroidManifest.xml引用的四大组件。

    反射用到的类。

    WebView中JavaScript调用的java接口方法不被混淆。

    Layout文件引用的自定义View。

    不要混淆第三方库。

    Gson使用到的实体类。因为Gson会反射获取与json同名的字段。

    3.2 输出文件

    启用R8或ProGuard构建项目后会在模块下的build\outputs\mapping\release文件夹下输出下列文件:

    dump.txt:说明 APK 中所有类文件的内部结构。

    mapping.txt:提供原始与混淆过的类、方法和字段名称之间的转换。

    seeds.txt:列出未进行混淆的类和成员。

    usage.txt:列出从 APK 移除的代码。

    3.3 组件化中的混淆文件合并

    主模块的混淆开关配置会直接影响到子模块,也就是说如果你的主模块开启的混淆,就算你的子模块关闭混淆开关,最终子模块还是会被混淆的;

    主模块的混淆配置会影响到子模块,即主模块和子模块同时开启了混淆,主模块的proguard-rules.pro配置生效,子模块的不生效。

    0d1b58e06796

    image.png

    consumerProguardFiles作用:

    proguard.txt会被打包进aar中

    此配置只对aar进行混淆。

    此配置只对库文件有效,对应用程序无效。

    4.如何应对混淆

    4.1mapping映射表+retrace脚本恢复stacktrace

    4.2 如何应对代码混淆

    找到混淆时生成的mapping文件

    jadx反混淆功能

    借助jeb工具的重命名功能+自己分析

    展开全文
  • proguar在Android混淆中的用法发布时间:2020-09-04 16:19:29来源:脚本之家阅读:62作者:laozhang混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比較...
  • 1.混淆的基本原理android平台的混淆原理简单来说就是把代码中原来有具体含义的包名,类名,变量名,方法名等名称全部替换成按顺序排列的无意义的英文字母a、b、c….这样代码结构没有变化,还可以运行得到一样的结果...
  • 安卓混淆文件使用

    2021-07-05 15:59:08
    Android SDK 自带了混淆工具 Proguard。它位于 SDK 根目录 \tools\proguard 下面。如果开启了混淆,Proguard 默认情况下会对所有代码,包括第三方包都进行混淆(可能需要编写混淆规则来保持不能被混淆的部分)。 ...
  • Android混淆冲突解正确解决姿势 背景  话说有一天,客户说用了你们混淆过的aar库,发现与别人的另一个库冲突了,都存在a.a.a.b.a类,让你赶紧修改,经过一顿面向搜索引擎编程,你发现通过自定义混淆字典可以解决...
  • Android混淆

    千次阅读 2021-08-28 19:55:42
    Android中配置混淆,需要在gradle中配置minifyEnabled为true,然后再混淆的配置文件中加入我们的混淆规则就可以。 android { ... buildTypes { release { minifyEnabled true proguardFiles ...
  • Android打包失败出现Proguard returned with error code 1. See console的错误这个问题是由于代码混淆引起的,找不到引用包。只需在你的proguard-project.txt中添加如下两行即可。-libraryjars libs/okio-1.6.0.jar...
  • android混淆代码步骤

    2021-06-11 17:44:46
    第一步:在app下的build.gradle中添加buildTypes {release {//混淆minifyEnabled trueshrinkResources true//去掉不用资源//混淆并去除日志信息proguardFiles getDefaultProguardFile('proguard-android-optimize....
  • android混淆打包

    2021-01-26 14:49:15
    proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 这里的话指定了混淆的基本配置文件proguard-android.txt,和混淆的个性化配置文件proguard-project.txt。这里proguard-...
  • * 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 -...
  • android 混淆 minifyEnabled

    千次阅读 2021-01-05 14:31:29
    代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。 为什么要加代码混淆 --------------------不想开源应用,为了加大反编译的成本,但是并...
  • Android 混淆机制

    2021-06-09 10:47:36
    把原来有具体含义的类名,变量名,方法名,修改成让人看不懂的名字,例如方法名getUserName编程了方法名a二、如何混淆代码Android工程目录下有两个文件,project.properties,proguard-project.txt1、project....
  • android 混淆 讲解

    2021-06-03 09:13:14
    Proguard的作用proguard除了...在app.gradle文件中的buildTypes里写了一段关于app混淆的语句,先看下minifyEnabled trueproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules...
  • # 指定代码的压缩级别 0 - 7(指定代码进行迭代优化的次数,在Android里面默认是5,这条指令也只有在可以优化时起作用。) -optimizationpasses 5 # 混淆时不会产生形形色色的类名(混淆时不使用大小写混合类名) -...
  • Android 代码混淆

    2021-06-04 05:11:58
    一、混淆基本原理及目的:目的:让反编译app后的代码很难看懂,只是让别人很难看的懂而已。基本原理:把代码中原来有具体含义的包名,类名,变量名,方法名等名称全部替换成按顺序排列的无意义的英文字母a、b、c…....
  • Android代码混淆

    2021-05-27 09:53:46
    一、为什么要进行代码混淆?java是一种跨平台的、解释型语言、Java源代码编译成中间”字节码”存储于class文件中。由于跨平台的需要,Java字节码中包括很多源代码信息,如变量名、方法名,并且通过这些名称来访问...
  • 01-03 19:02:52.341 12188-12188/com.zr E/AndroidRuntime: FATAL EXCEPTION: mainProcess: com.zr, PID: 12188java.lang.IllegalArgumentException: username or password is null or empty!at ...
  • Android 代码混淆机制

    2021-06-09 10:49:21
    Android 代码混淆机制由于Android项目是基于java语言的,而java属于高层抽象语言,易于反编译,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息,根据其编译打包后的APK文件,可以非常容易的得到 ...
  • Android代码混淆详解

    2021-05-26 09:53:42
    一、混淆的意义混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字,同时也可以移除未被使用的类、方法、变量等。 所以直观的看,通过混淆可以提高...
  • 浅谈Android混淆

    2021-03-13 14:22:18
    代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。Why?混淆的目的是为了加大反编译的成本,但是并不能彻底防止反编译.2.How?ProGuard由shrink、...
  • android混淆与反射

    2021-02-26 15:54:43
    Android包4.0(好像是4.0)以后混淆更加简单1、在project.properties.txt将以下内容注释去掉proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt2、在proguard-project中加入取消...
  • 代码混淆是每个java程序猿的必修课,但是为项目写混淆配置文件是一件痛苦的事情,关键字比较多不太好记忆,而且一旦配置好很长时间内都不需要修改,也许当时记得,过后慢慢就忘记了。那不配置混淆行不行呢?答案肯定...
  • 以前没感受过android混淆资源,结果给客户整sdk的时候遇到一个怪事,图片明明存在,为什么图片大小变成了空,宽度尺寸变成1了呢?我还以为是会移除图标的,这也是因为我只听说过没感受过所以我和客户因为这个事情...
  • 为了保护代码被反编译,android引入了混淆代码的概念1.设置混淆在工程下找到project.properties文件在文件中加入proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt这个是系统的...
  • Android混淆常规设置

    2021-01-06 23:26:16
    APP在发布之前,为了保证apk的安全,同时尽可能减小apk的大小,我们通常在build时打开混淆和压缩功能,这样做有以下好处: * 代码缩减(即摇树优化):从应用及其库依赖项中检测并安全地移除不使用的类、字段、方法...
  • #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt去掉之前的#,即取消注释修改proguard-project.txt文件(忽略第三方jar)引入第三方库:-libraryjars /libs/umeng_sdk.jar忽略...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 55,099
精华内容 22,039
关键字:

安卓混淆

友情链接: 094766.rar