Android 之混淆打包

作者: AndroidTech | 来源:发表于2016-10-25 17:04 被阅读181次

原文地址:[写给Android开发者的混淆使用手册 ]

为保证移动端数据安全,防止应用被逆向工程师反编译或被不法分子盗用用户信息,Android应用打包发布都需要进行混淆。

混淆其实是包括了代码压缩、代码混淆以及资源压缩等的优化过程。依靠 ProGuard,混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈;同时,将类、类成员、方法重命名为无意义的简短名称,增加了逆向工程的难度。而依靠 Gradle 的 Android 插件,我们将移除未被使用的资源,可以有效减小 apk 安装包大小。

混淆基本配置

一般的混淆为在gradle中进行配置:

混淆配置

minifyEnabled false 开启了代码压缩

proguard-android.txt sdk中的一个混淆文件

proguard-rules.pro 项目module下的一个混淆配置

proguard-android.txt 中的内容:

内容一 内容二

其实这就是一个配置文件

proguard-rules.pro 中常见的配置为:

proguard-rules.pro常见配置

混淆简介(摘自原文)

Android中的“混淆”可以分为两部分,一部分是Java代码的优化与混淆,依靠 proguard 混淆器来实现;另一部分是资源压缩,将移除项目及依赖的库中未被使用的资源(资源压缩严格意义上跟混淆没啥关系,但一般我们都会放一起讲)。

代码压缩

代码混淆是包含了代码压缩、优化、混淆等一系列行为的过程。如上图所示,混淆过程会有如下几个功能:

压缩。移除无效的类、类成员、方法、属性等;

优化。分析和优化方法的二进制代码;根据proguard-android-optimize.txt中的描述,优化可能会造成一些潜在风险,不能保证在所有版本的Dalvik上都正常运行。

混淆。把类名、属性名、方法名替换为简短且无意义的名称;

预校验。添加预校验信息。这个预校验是作用在Java平台上的,Android平台上不需要这项功能,去掉之后还可以加快混淆速度。

这四个流程默认开启。

在 Android 项目中我们可以选择将“优化”和“预校验”关闭,对应命令是-dontoptimize、-dontpreverify(当然,默认的 proguard-android.txt 文件已包含这两条混淆命令,不需要开发者额外配置)。——不明白这里为啥需要 优化和预校验关闭,有知道的同学请在留言回复,谢谢

资源压缩

资源压缩将移除项目及依赖的库中未被使用的资源,这在减少 apk 包体积上会有不错的效果,一般建议开启。具体做法是在 build.grade 文件中,将 shrinkResources 属性设置为 true。需要注意的是,只有在用minifyEnabled true开启了代码压缩后,资源压缩才会生效。

资源压缩包含了“合并资源”和“移除资源”两个流程。

“合并资源”流程中,名称相同的资源被视为重复资源会被合并。需要注意的是,这一流程不受shrinkResources属性控制,也无法被禁止, gradle 必然会做这项工作,因为假如不同项目中存在相同名称的资源将导致错误。

检查混淆结果

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

一方面,需要从代码层面检查。使用上文的配置进行混淆打包后在 /build/outputs/mapping/release/ 目录下会输出以下文件:

dump.txt

描述APK文件中所有类的内部结构

mapping.txt

提供混淆前后类、方法、类成员等的对照表

seeds.txt

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

usage.txt

列出被移除的代码

我们可以根据 seeds.txt 文件检查未被混淆的类和成员中是否已包含所有期望保留的,再根据 usage.txt 文件查看是否有被误移除的代码。

这些文件最好都保存着,以免线上应用出现问题,可以追踪bug。

解出混淆栈

混淆后的类、方法名等等难以阅读,这固然会增加逆向工程的难度,但对追踪线上 crash 也造成了阻碍。我们拿到 crash 的堆栈信息后会发现很难定位,这时需要将混淆反解。

在 /tools/proguard/ 路径下有附带的的反解工具(Window 系统为 proguardgui.bat,Mac 或Linux系统为 proguardgui.sh)。

这里以 Window 平台为例。双击运行 proguardgui.bat 后,可以看到左侧的一行菜单。点击 ReTrace,选择该混淆包对应的 mapping 文件(混淆后在 /build/outputs/mapping/release/ 路径下会生成 mapping.txt 文件,它的作用是提供混淆前后类、方法、类成员等的对照表),再将 crash 的 stack trace 黏贴进输入框中,点击右下角的 ReTrace ,混淆后的堆栈信息就显示出来了。

本文摘自[原文 ]

本文仅作为学习使用,详情请查看原文!!!谢谢

相关文章

  • Android上线事项

    1 ,混淆 混淆相关 点这里 混淆手册 2,签名打包 正式开始打包,首先Android Studio --B...

  • Android 之混淆打包

    原文地址:[写给Android开发者的混淆使用手册 ] 为保证移动端数据安全,防止应用被逆向工程师反编译或被不法分...

  • Android 打包之混淆

    Dex打包关于65536的问题 由于DEX文件格式限制,一个DEX文件中的method个数采用使用原生类型shor...

  • Android 混淆使用入门笔记

    概述 混淆是Android Apk打包过程中的一个重要步骤,默认情况下,打包都是需要混淆过程的。 Android ...

  • Android的多渠道打包|SquirrelNote

    系列文章:Android的反编译和代码混淆Android的打包签名[Android的多渠道打包 前言 本篇包括以下...

  • Android的反编译和代码混淆

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 包括以下内容 ...

  • Android的打包签名

    系列文章:Android的反编译和代码混淆Android的打包签名Android的多渠道打包 前言 从以下几个方面...

  • ProGuard详解

    Android分享:代码混淆那些事Android代码混淆之混淆规则Android-Dev-Favorites An...

  • 优雅的处理 Android 代码混淆 Keep 问题

    为了源码安全以及缩小 APK 体积,Android 应用发布前是必须要进行混淆打包的。而混淆打包并不是全量打包,特...

  • android混淆打包

    # Gson -keepclass com.google.gson.stream.** {*;} -keepatt...

网友评论

  • 慕小晨:不明白为什么要关闭优化和预检验功能!这样混淆后还回减少apk的大小嘛????
    AndroidTech: @慕小晨 我也是从作者那看的,我也很困惑,希望有路过的大神可以解答

本文标题:Android 之混淆打包

本文链接:https://www.haomeiwen.com/subject/gkzluttx.html