App 混淆

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

一、前言

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

    333 引用 • 323 回帖 • 67 关注
  • 混淆
    3 引用 • 12 回帖

相关帖子

回帖

欢迎来到这里!

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

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

推荐标签 标签

  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    51 引用 • 190 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 4 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    76 引用 • 37 回帖
  • 书籍

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

    76 引用 • 390 回帖
  • OkHttp

    OkHttp 是一款 HTTP & HTTP/2 客户端库,专为 Android 和 Java 应用打造。

    16 引用 • 6 回帖 • 54 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 596 关注
  • 开源中国

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

    7 引用 • 86 回帖
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 592 关注
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    275 引用 • 682 回帖
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    20 引用 • 74 回帖 • 1 关注
  • 学习

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

    161 引用 • 473 回帖
  • Shell

    Shell 脚本与 Windows/Dos 下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比 Windows 下的批处理更强大,比用其他编程程序编辑的程序效率更高,因为它使用了 Linux/Unix 下的命令。

    122 引用 • 73 回帖
  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 684 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 446 关注
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 41 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 318 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 27 关注
  • SVN

    SVN 是 Subversion 的简称,是一个开放源代码的版本控制系统,相较于 RCS、CVS,它采用了分支管理系统,它的设计目标就是取代 CVS。

    29 引用 • 98 回帖 • 692 关注
  • 笔记

    好记性不如烂笔头。

    304 引用 • 777 回帖
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 5 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 499 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 643 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    207 引用 • 2031 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • 新人

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

    51 引用 • 226 回帖
  • Sphinx

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

    1 引用 • 179 关注