App 混淆

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

一、前言

为了保护自己的劳动成果,几乎多数的 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 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

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

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 618 关注
  • Logseq

    Logseq 是一个隐私优先、开源的知识库工具。

    Logseq is a joyful, open-source outliner that works on top of local plain-text Markdown and Org-mode files. Use it to write, organize and share your thoughts, keep your to-do list, and build your own digital garden.

    7 引用 • 69 回帖 • 5 关注
  • Solo

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

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

    1444 引用 • 10083 回帖 • 508 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 408 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • 印象笔记
    3 引用 • 16 回帖 • 1 关注
  • RemNote
    2 引用 • 16 回帖 • 25 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 313 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 185 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    20 引用 • 37 回帖 • 571 关注
  • 书籍

    宋真宗赵恒曾经说过:“书中自有黄金屋,书中自有颜如玉。”

    84 引用 • 414 回帖
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 181 关注
  • 支付宝

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

    29 引用 • 347 回帖 • 2 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 3 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    5 引用 • 16 回帖
  • 博客

    记录并分享人生的经历。

    273 引用 • 2389 回帖
  • 互联网

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

    98 引用 • 367 回帖
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 117 关注
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    10169 引用 • 46222 回帖 • 65 关注
  • Swagger

    Swagger 是一款非常流行的 API 开发工具,它遵循 OpenAPI Specification(这是一种通用的、和编程语言无关的 API 描述规范)。Swagger 贯穿整个 API 生命周期,如 API 的设计、编写文档、测试和部署。

    26 引用 • 35 回帖 • 2 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 710 关注
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖
  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 642 关注