博客
关于我
Android混淆精炼详解+常用库混淆+通用混淆模板
阅读量:374 次
发布时间:2019-03-05

本文共 3636 字,大约阅读时间需要 12 分钟。

Android混淆文件详解:配置与实践指南

作为一名开发者,我最近在一个项目中遇到了一个棘手的问题:测试手机运行的应用功能正常,但在发布正式包后,上传功能失效。经过一番调试,发现问题出在混淆文件上。原来项目中使用的是开源项目带的混淆文件,而新增的上传功能使用了Gson进行处理,但未对混淆文件进行相应调整。Gson在使用时需要处理混淆文件,这让我深刻认识到混淆文件的重要性。今天就来一探究竟,搞懂混淆文件的配置与使用。


启用混淆文件

在Android Studio中启用混淆文件非常简单。Android Studio内置了ProGuard,这是一个强大的代码优化和混淆工具,支持通过Gradle构建工具轻松配置。具体步骤如下:

  • 打开工程根目录下的build.gradle文件。
  • 修改buildTypes配置,确保release类型的minifyEnabled属性设置为true
  • proguard-rules.pro文件中添加混淆规则。
  • buildTypes {    release {        minifyEnabled true        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'    }}

    ProGuard的作用

    ProGuard主要有以下三个功能:

  • 压缩(Shrinking):移除未被使用的类和成员,减小APK体积。
  • 优化(Optimization):在字节码级别进行优化,提升应用运行速度。
  • 混淆(Obfuscation):通过随机命名保护类和成员,增大反编译难度。
  • 默认情况下,这三项功能都启用。


    ProGuard生成的文件

    在完成混淆后,ProGuard会在build/outputs/mapping/release目录下生成四个重要文件:

  • dump.txt:列出混淆后的APK中所有class文件的内部结构。
  • mapping.txt:详细记录混淆前的java源码与混淆后的命名映射关系。
  • seeds.txt:列出被混淆的类和成员。
  • usage.txt:记录剥离的代码。
  • 特别注意mapping.txt文件,它包含了混淆规则的详细记录。如有心人可据此反推原始代码,因此务必妥善保护这个文件。


    混淆文件的配置

    混淆文件的配置可以分为几个方面:

    1. 通用配置

    • 代码混淆压缩比:建议设置为-optimizationpasses 5
    • 不使用大小写混合类名:避免混淆后的类名包含大小写,设置-dontusemixedcaseclassnames
    • 保留非公共库类:设置-dontskipnonpubliclibraryclasses
    • 避免预校验:Android不需要预校验,设置-dontpreverify
    • 忽略预警信息:设置-ignorewarnings
    • 优化算法过滤:使用谷歌推荐的算法,设置-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

    2. 保护特定元素

    • 保留注解:设置-keepattributes *Annotation*
    • 保留泛型:设置-keepattributes Signature
    • 保留代码行号:设置-keepattributes SourceFile,LineNumberTable
    • 保留四大组件:保留ActivityApplicationServiceBroadcastReceiver等类,设置-keep public class * extends android.app.Activity等。
    • 保留native方法:设置-keepclasseswithmembernames class * { native <methods>; }

    3. 常用库的处理

    许多库和框架在使用时需要进行混淆配置。常见的有:

    • Gson:默认配置即可,但需注意实体类不应混淆。
    • Butterknife:保留注解和内部类,设置-keepattributes Butterknife, InnerClasses
    • SlidingMenu:保留所有成员和类,设置-keepclasseswithmembernames class com.slidingmenu.**

    注意:这些配置不是随意复制的,而需根据文档调整路径名和包名。

    4. 第三方SDK处理

    对于第三方SDK,如支付宝、友盟等,需遵循提供的文档配置混淆文件。例如,支付宝支付保留关键类,设置-keep public class com.alibaba支付.**

    5. 自定义规则

    在项目中使用了自定义功能,如自定义View,需在混淆文件中保留这些类。例如:

    -keep public class com.example.CustomView 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);}

    混淆文件的模板

    以下是一个通用的混淆文件模板:

    # 代码混淆压缩比-optimizationpasses 5# 不使用大小写混合类名-dontusemixedcaseclassnames# 保留非公共库类-dontskipnonpubliclibraryclasses# 不进行预校验-dontpreverify# 忽略预警信息-ignorewarnings# 谷歌推荐算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*# 保护注解-keepattributes *Annotation*# 保留泛型-keepattributes Signature# 保留代码行号-keepattributes SourceFile,LineNumberTable# 允许访问有修饰符的类和成员-allowaccessmodification# 不进行类成员重包装# 保留四大组件及其子类-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.preference.Preference# 保留支持包下的所有类-keep class android.support.** {*}# 保留自定义接口实现-keep public class * implements com.example.Interface# 保留native方法-keepclasseswithmembernames class * { native 
    ; }

    混淆文件的注意事项

  • JNI方法:JNI方法不可混淆,需设置-keepclasseswithmembernames class * { native <methods>; }
  • 反射类:使用反射时,需保留反射类不被混淆。
  • Parcelable:保留Parcelable实现类的CREATOR字段。
  • WebView接口:保留JS接口方法,避免混淆。
  • 枚举类:保留values()valueOf()方法,设置-keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }

  • 通过以上配置和实践技巧,你可以有效管理混淆文件,确保应用在反编译时的安全性和性能。记住,混淆文件的配置需要根据项目需求进行调整,不能一味照搬模板。

    转载地址:http://uqjg.baihongyu.com/

    你可能感兴趣的文章
    Python 判断字符串是否包含子字符串
    查看>>
    python 判断当前时间是否为零点
    查看>>
    python 利用pandas读取本地中CSV文件的指定列 列名重命名 并保存回本地
    查看>>
    python 利用pyspark读取HDFS中CSV文件的指定列 列名重命名 并保存回HDFS
    查看>>
    python 利用pyttsx3文字转语音
    查看>>
    python 利用已有Ner模型进行数据清洗合并
    查看>>
    python 到大数据开发工程师_如何成为一个大数据开发工程师?
    查看>>
    python 加密解密(base64, AES)
    查看>>
    Python 包管理器和 Node.js
    查看>>
    Python 单词字母顺序不变且所有倒排
    查看>>
    python 启动提示IDLE's subprocess didn't make conne...
    查看>>
    python 命令接口_实现“[命令][操作][参数]”样式的命令行接口?
    查看>>
    Python 和 OpenCV.如何检测图像中的所有(填充)圆形/圆形对象?
    查看>>
    Python 和 RabbitMQ - 聆听来自多个渠道的消费事件的最佳方式?
    查看>>
    python编辑器打不开_关于命令ride.py打不开RF,而是打开pycharm编辑器问题解决思路...
    查看>>
    python编译exe同时支持32位_第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe...
    查看>>
    Python 和Java 哪个更适合做自动化测试?
    查看>>
    Python编程:掌握高级语言程序设计。从零基础到精通,收藏这篇就够了!
    查看>>
    python 图片转ico
    查看>>
    python 图片转文字、语音转文字、文字转语音保存音频并朗读
    查看>>