App 混淆

本贴最后更新于 2246 天前,其中的信息可能已经物是人非

一、前言

为了保护自己的劳动成果,几乎多数的 app 都会使用代码混淆,尽可能的增加 app 被反编译的难度

在这里记录下常用到的一些混淆规则

二、ProGuard 的作用

Android 提供了 ProGuard 机制对 app 进行混淆、优化、压缩

1、混淆代码

将代码中的包名、类名、方法名、属性改名成一系列没有可读性字母,从而增加阅读难度

2、字节码优化

对代码进行迭代优化,增加运行速度

3、压缩 (在代码优化前后各执行一次)

减少 app 体积,移除未使用的类、变量

三、 ProGuard 的主要命令

1、类和类成员 -keep 防止被移除或重命名 -keepnames 防止重命名 2、仅类成员 -keepclassmembers 防止被移除或重命名 -keepclassmembersnames 防止重命名 3、保留拥有某成员的类和类成员 -keepclasseswithmembers 防止被移除或重命名 -keepclasseswithmembernames 防止重命名

四、主要配置项

混淆和 Java 反射存在冲突,所以反射用到的类需要避免混淆

1、保留类名 -keep class com.whipser.test.* 当前包下的类名会被保留 但不包含子包 -keep class com.whisper.test.** 当前包以及子包的类名都会保留 2、保留类名以及类中的内容 -keep class com.whisper.test.* {*;} 当前包下的类和类中的内容都会保留 3、保留特定类 -keep class public class * extends android.app.Activity 保留所有继承Activity的类 4、保留内部类 -keepclassmembers class com.whisper.test.ui.fragment.TestFragment$InnerClass { public *; } 保留TestFragment中内部类InnerClass的所有public内容 5、保留内容部分内容 <init> 构造方法 <fields> 所有属性 <methods> 所有方法 且可以为其指定private 、public、native、protected等修饰符 如:保留A类中所有public方法 当然类名也会保留 否则无意义 -keep class com.whisper.test.A { public <methods>; } 如保留A参数为String的构造方法 -keep class com.whisper.test.A { public <init>(java.lang.String) }

五、注意
1、反射用到的元素不能混淆

2、jni 方法不能混淆
-keepclasswithmembernames class * {
native ;
}
3、AndroidManifest 中的类不能混淆

4、自定义 view 不能混淆

5、Gson 、fastjson 等 orm 映射对象不能混淆

6、webview js 调用接口方法不能混淆

7、Parcelable 的子类和 Creator 静态成员不混淆,避免 BadParcelableException

8、使用 enum 是,会存在反射调用,需要加入如下混淆:
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}

六、 开启混淆

androidstuidio 环境:
build.gradle 中配置 minifyEnable 为 ture 并指定好混淆文件
另外 zipAlignEnabled 可以设置为 true, app 包中资源按 4 字节对齐,减少运行时内存消耗

七、拓展运用

需求: 有的时候包下的部分类不需要混淆,而需混淆的类也不少,若在文件中配置必然要加入诸多混淆代码,同时当代码中 的类名、方法名、属性名改变时,配置文件亦需要改变,较为繁琐,那么有没有更加灵活易用的防混淆方式呢? 下面介绍使用编译时注解来解决这个问题 第一步: 定义注解 @Retention(RetentionPolicy.CLASS) @Target({ElementType.TYPE,ElementType.METHOD,ElementType.CONSTRUCTOR,ElementType.FIELD}) public @interface NoProguard { } 第二步: 配置混淆代码 对使用该注解的元素保留 # 自定义注解NoProguard的混淆支持 -keep @com.whisper.life.lib.NoProguard class * {*;} -keep class * { @com.whisper.life.lib.NoProguard <fields>;} -keepclassmembers class * { @com.whisper.life.lib.NoProguard <methods>;} 提示: 这三行混淆代码分别支持类、属性、方法的免混淆 第三步: 使用NoProguard注解 结论: NoProguard注解 提供了另一种防混淆的方式,而且使用灵活性好
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    335 引用 • 324 回帖
  • 混淆
    3 引用 • 12 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 639 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 165 关注
  • gRpc
    11 引用 • 9 回帖 • 90 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    7 引用 • 27 回帖 • 2 关注
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 611 关注
  • 心情

    心是产生任何想法的源泉,心本体会陷入到对自己本体不能理解的状态中,因为心能产生任何想法,不能分出对错,不能分出自己。

    59 引用 • 369 回帖 • 1 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    127 引用 • 169 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1115 回帖 • 120 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 2 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 55 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 756 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 216 关注
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 592 关注
  • 前端

    前端技术一般分为前端设计和前端开发,前端设计可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括 HTML、CSS 以及 JavaScript 等。

    245 引用 • 1338 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    172 引用 • 516 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    179 引用 • 408 回帖 • 484 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • 浅吟主题

    Jeffrey Chen 制作的思源笔记主题,项目仓库:https://github.com/TCOTC/Whisper

    1 引用 • 28 回帖 • 2 关注
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    99 引用 • 367 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 76 回帖
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 640 关注