博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 代码混淆之部分类不混淆的技巧
阅读量:6464 次
发布时间:2019-06-23

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

在编写Android程序之后,我们通常要代码进行混淆编码,这样才能保证市场上我们的应用不会被别人进行反编译,然后破解,所以此时需要在发布正式版本的时候,有一些类事不能混淆的,比如实现了 Serializable 接口的,否则反序列化时会出错,这种情况下,我们可以简单的通过在proguard.cfg(Eclipse)添加配置来解决:

-keepnames class * implements java.io.Serializable-keepclassmembers class * implements java.io.Serializable {static final long serialVersionUID;private static final java.io.ObjectStreamField[] serialPersistentFields;!static !transient 
;private void writeObject(java.io.ObjectOutputStream);private void readObject(java.io.ObjectInputStream);java.lang.Object writeReplace();java.lang.Object readResolve();}
上面的配置表示所有实现了 Serializable 接口的类及其成员都不进行混淆。
 
再比如JS调用的Android的JavaScriptInterface代码的方法,比如个别控制层类需要反射、个别实体类需要JSON化保存在本地,这些都是要防止没有明显共同特征的类被混淆,这时候,我们怎么做呢,一个个添加到proguard.cfg里面吗?这样会导致proguard配置文件杂乱无章,同时需要团队所有的成员对其语法有所了解.
下面针对这个问题,分享一个小技巧,通过给这些类、属性、函数添加共同的标识,然后统一过滤,最后解决上面所说的问题

1. 新建表示统一标识的注解 NotProguard

package cn.trinea.android.common.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/*** NotProguard, Means not proguard something, like class, method, field
*/@Retention(RetentionPolicy.CLASS)@Target({ElementType.TYPE, ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD})public @interface NotProguard {}
NotProguard 是个编译时注解,不会对运行时性能有任何影响。可修饰类、方法、构造函数、属性。
 
这里,可能会对注解(Annotation)有一些模糊,想了解更多关于注解相关的知识可以点击链接:
 

2. 在 Proguard 配置文件中过滤被这个注解修饰的元素

# keep annotated by NotProguard-keep @cn.trinea.android.common.annotation.NotProguard class * {*;}-keep class * {@cn.trinea.android.common.annotation.NotProguard 
;}-keepclassmembers class * {@cn.trinea.android.common.annotation.NotProguard
;}
表示不混淆被 NotProguard 修饰的类、属性和方法。
 

3. 使用NotProguard让指定的域不进行混淆:

(1) 整个类不混淆
@NotProguard public class User {}
(2) 单个属性不混淆
@NotProguard public int id;
(3) 单个方法不混淆
@NotProguardpublic boolean isValid() {…}
这样我们便解决了每个类都需要在 proguard 配置文件中配置的问题。
 

关于混淆

混淆一般在 Release 模式生效,主要有三个作用:
(1) 压缩、优化、删除代码;
(2) 一定程度上提高反编译后被读懂的难度;
(3) 通过删除代码功能实现的特殊作用。
比如在   中介绍的利用 Progurad 使得线上版本不打印 Log.d 和 Log.v 的技巧,防止调试的敏感信息被泄露。
一些应用的代码可能从来都没混淆过,虽说这些代码实际价值可能不大,本身可能也是开源代码凑起来的,再者该破解的还是能破解,但本着做事要专业的态度,还是混淆吧。
 

其他参考文章

  • 关于 Android Studio 混淆配置的示例及详细说明可参考:
  • 关于 Proguard 基础可参考:、
  • 关于 反编译 的方法可参考:

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

你可能感兴趣的文章
一个action读取另一个action里的session
查看>>
IntelliJ IDEA 注册码
查看>>
String字符串的截取
查看>>
DynamoDB Local for Desktop Development
查看>>
用javascript验证哥德巴赫猜想
查看>>
Shell编程-环境变量配置文件
查看>>
[Unity3d]DrawCall优化手记
查看>>
Struts2和Spring MVC的区别
查看>>
理解Javascript参数中的arguments对象
查看>>
p2:千行代码入门python
查看>>
bzoj1106[POI2007]立方体大作战tet*
查看>>
spring boot configuration annotation processor not found in classpath问题解决
查看>>
团队项目测试报告与用户反馈
查看>>
Mysql中文字符串提取datetime
查看>>
由中序遍历和后序遍历求前序遍历
查看>>
我学习参考的网址
查看>>
easyui的combotree以及tree,c#后台异步加载的详细介绍
查看>>
[Processing]点到线段的最小距离
查看>>
考研随笔2
查看>>
乱码的情况
查看>>