浅谈Android保护技术__代码混淆

浅谈Android保护技术__代码混淆

代码混淆

代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名字猜测其用途。对于支持反射的语言,代码混淆有可能与反射发生冲突。代码混淆并不能真正阻止反向工程,只能增大其难度。因此,对于对安全性要求很高的场合,仅仅使用代码混淆并不能保证源代码的安全。但是可以在一定程度上保护自己的劳动成果。(例子在末尾)

 

Android 程序如何混淆

启动Android程序的混淆功能: 
  • 修改Android工程的配置文件project.pro[erties 的 “#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”  去除 “#”
 
  • 修改配置文件proguard-project.txt文件,设置混淆规则
 

 

忽略混淆的文件(规则):

  • Android系统组件,系统组件有固定的方法被系统调用。
  • 被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。
  • Android Parcelable ,需要使用android 序列化的。
  • 其他Anroid 官方建议 不混淆的,如
  • android.app.backup.BackupAgentHelper
  • android.preference.Preference
  • com.android.vending.licensing.ILicensingService
  • Java序列化方法,系统序列化需要固定的方法。
  • 枚举 ,系统需要处理枚举的固定方法。
  • 本地方法,不能修改本地方法名
  • annotations 注释
  • 数据库驱动
  • 有些resource 文件
  • 用到反射的地方

使用混淆的常见问题及解决方案

  • grade构建必须没有warn和error,不然刷入的版本依旧是上一个版本,这里要特别注意warn!
  • ClassNotFoundException,NoSuchMethodError

原因:这种异常会在好多情况下出现,比如:本地代码通过反射调用其他的类,但是经过了混淆之后,就会出现如上异常;调用了JNI之后,C或者C++和java代码进行交互的时候找不到java的类或者方法,导致发生了异常......等等,还有好多。

解决办法:只需要将被调用的Java类标注为不混淆即可。 -keep class package.classname{*;}

  • ExceptionInInitializerError

原因:这是由于类初始化的时候发生了异常。
   解决办法:找到具体是哪里的类哪个方法哪个类初始化的时候发生的异常,然后解决问题。
   注:遇到这个错误,首先要确认是不是因为第三方的jar包导致的。如果不是的话,就找本地代码,看是不是写的有问题。如果确实是因为第三方jar包的代码导致的,尽量找到源码或者反编译,查看问题到底是什么引起的,然后找到相应的配置在proguard里面配置。
   例如:我们项目中碰到过一个问题,就是因为第三方的jar包里面有一个字段初始化的时候报了空指针,然后导致我们的代码报了上面的错。当时很奇怪,为什么第三方的jar包还能报错,最后调查了之后才发现,是因为人家用到了类的注解,而proguard在混淆优化的时候把注解去掉了,所以报了空

   指针,只需要在proguard里面加上保护注解就可以了-keepattributes *Annotation*

  • ClassCastException

原因:类强制转换的时候出错。

解决办法:找到代码,看是代码写的问题,还是混淆后的问题。如果没有混淆正常运行的话,一般都是因为混淆后遇到了各种问题才报的错。我们项目中遇到的问题是因为没有让proguard保持泛型,所以强转的时候报错。只需要在proguard文件里面加上泛型即可-keepattributes Signature

  • Resources$NotFoundException(resource not found) 资源没有找到,是因为第三方jar包或者自己的代码是通过反射获得R文件中的资源,所以需要将R文件屏蔽掉

原因:代码进行了混淆,R文件没有了,所以通过反射获取的R文件找不到

解决办法:在proguard文件里设置不混淆R文件    -keep class **.R$* { *; }

  • Missing type parameter. or java.lang.ExceptionInInitializerError

  可能是泛型混淆了 泛型即可-keepattributes Signature

混淆例子;

  1 <span style="font-family:FangSong_GB2312;font-size:12px;color:#333333;">
  2 #指定代码的压缩级别
  3 -optimizationpasses 5
  4
  5 #包明不混合大小写
  6 -dontusemixedcaseclassnames
  7
  8 #不去忽略非公共的库类
  9 -dontskipnonpubliclibraryclasses
 10
 11  #优化  不优化输入的类文件
 12 -dontoptimize
 13
 14  #预校验
 15 -dontpreverify
 16
 17  # 混淆时所采用的算法
 18 -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 19
 20 #保护注解
 21 -keepattributes *Annotation*
 22
 23  # 保持哪些类不被混淆
 24 -keep public class * extends android.app.Fragment
 25 -keep public class * extends android.app.Activity
 26 -keep public class * extends android.app.Application
 27 -keep public class * extends android.app.Service
 28 -keep public class * extends android.content.BroadcastReceiver
 29 -keep public class * extends android.content.ContentProvider
 30 -keep public class * extends android.app.backup.BackupAgentHelper
 31 -keep public class * extends android.preference.Preference
 32 -keep public class com.android.vending.licensing.ILicensingService
 33
 34 #如果有引用v4包可以添加下面这行
 35
 36 #-keep public class * extends android.support.v4.app.Fragment
 37 -keep public class * extends android.support.** { *; }
 38
 39 #如果引用了v4或者v7包
 40 -dontwarn android.support.*
 41
 42 #忽略警告
 43 -ignorewarning
 44
 45 #####################记录生成的日志数据,gradle build时在本项目根目录输出################
 46  #混淆时是否记录日志
 47 -verbose
 48 #apk 包内所有 class 的内部结构
 49 -dump class_files.txt
 50 #未混淆的类和成员
 51 -printseeds seeds.txt
 52 #列出从 apk 中删除的代码
 53 -printusage unused.txt
 54 #混淆前后的映射
 55 -printmapping mapping.txt
 56
 57
 58 #####################记录生成的日志数据,gradle build时 在本项目根目录输出-end################
 59
 60
 61 #####混淆保护自己项目的部分代码以及引用的第三方jar包library - start #######
 62
 63
 64 #如果不想混淆 keep 掉  保留一个完整的包
 65 #-keep class com.lippi.recorder.iirfilterdesigner.** {*; }
 66 #项目特殊处理代码
 67 #忽略警告
 68 #-dontwarn com.lippi.recorder.utils**
 69
 70
 71 #如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
 72 #//原因分析,可能是高版本的 sdk 通过 proguard 混淆代码时默认已经将 lib目录中的 jar 都已经添加到打包脚本中,所以不需要再次手动添加
 73 # 混淆jar
 74 #-libraryjars libs/gson-2.2.4.jar
 75 # 混淆类
 76 #-keep class sun.misc.Unsafe { *; }
 77 # 混淆包
 78 #-keep class com.google.gson.examples.android.model.** { *; }
 79 #dialog
 80 -keep class me.drakeet.materialdialog.** { *; }
 81 #加载框
 82 -keep class com.kaopiz.kprogresshud.** { *; }
 83 #下拉刷新
 84 -keep class in.srain.cube.views.ptr.** { *; }
 85 #实体类不混淆
 86
 87
 88 -keep class com.ousrslook.shimao.commen.ioc.** { *; } #不能混淆 否则注解无效
 89 -keep class com.ousrslook.shimao.model.** { *; } #不能混淆
 90 -keep class com.ousrslook.shimao.net.XaResult{ *; }#统一返回的实体类泛型不能混淆
 91 #-keep class com.ousrslook.shimao.net.** { *; }
 92
 93
 94 ####混淆保护自己项目的部分代码以及引用的第三方jar包library-end####
 95
 96
 97 -keep public class * extends android.view.View {
 98     public <init>(android.content.Context);
 99     public <init>(android.content.Context, android.util.AttributeSet);
100     public <init>(android.content.Context, android.util.AttributeSet, int);
101     public void set*(...);
102 }
103
104
105 #保持 native 方法不被混淆
106 -keepclasseswithmembernames class * {
107     native <methods>;
108 }
109
110
111 #保持自定义控件类不被混淆
112 -keepclasseswithmembers class * {
113     public <init>(android.content.Context, android.util.AttributeSet);
114 }
115
116
117 #保持自定义控件类不被混淆
118 -keepclassmembers class * extends android.app.Activity {
119    public void *(android.view.View);
120 }
121
122
123 #保持 Parcelable 不被混淆
124 -keep class * implements android.os.Parcelable {
125   public static final android.os.Parcelable$Creator *;
126 }
127
128
129 #保持 Serializable 不被混淆
130 -keepnames class * implements java.io.Serializable
131
132
133 #保持 Serializable 不被混淆并且enum 类也不被混淆
134 -keepclassmembers class * implements java.io.Serializable {
135     static final long serialVersionUID;
136     private static final java.io.ObjectStreamField[] serialPersistentFields;
137     !static !transient <fields>;
138     !private <fields>;
139     !private <methods>;
140     private void writeObject(java.io.ObjectOutputStream);
141     private void readObject(java.io.ObjectInputStream);
142     java.lang.Object writeReplace();
143     java.lang.Object readResolve();
144 }
145
146
147 #保持枚举 enum 类不被混淆 如果混淆报错,建议直接使用上面的 -keepclassmembers class * implements java.io.Serializable即可
148 -keepclassmembers enum * {
149   public static **[] values();
150   public static ** valueOf(java.lang.String);
151 }
152
153
154 -keepclassmembers class * {
155     public void *ButtonClicked(android.view.View);
156 }
157
158
159 #不混淆资源类
160 -keepclassmembers class **.R$* {
161     public static <fields>;
162 }
163  -keep class **.R$* { *; }
164 #避免混淆泛型 如果混淆报错建议关掉
165 -keepattributes Signature</span>  

posted on 2017-03-12 11:03 蕉下客--) 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/jiaoxiake/p/6537258.html

浅谈Android保护技术__代码混淆相关推荐

  1. 浅谈android hook技术

    前言 在测试android过程中,能对函数进行hook能帮助更加深入的进行测试,本文简单介绍了hook框架xposed和frida,从简单的小例子做了简单的演示,算是自己的学习的过程,是个入门的过程. ...

  2. android hook 第三方app_【MiSRC】技术分享-浅谈android hook技术

    注:本文为"小米安全中心"原创,转载请联系"小米安全中心" 前言 xposed框架 xposed,主页:http://repo.xposed.info/modu ...

  3. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

  4. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  5. 浅谈Android中的MVP与动态代理的结合

    浅谈Android中的MVP与动态代理的结合 本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布 在Android开发平台上接触MVP足足算起来大概已经有一个年头左右.从最开始到现在经 ...

  6. 浅谈Android SDK开发

    目录 浅谈Android SDK开发 SDK开发的原则 SDK设计 功能与职责边界设计 接口设计 兼容性设计 发布输出设计 SDK文档设计 SDK项目架构 组件化.模块化 统一资源管理 第三方依赖管理 ...

  7. android 存储空间监控,浅谈 Android 内存监控(中)

    前言 在上篇 浅谈 Android 内存监控(上) 中,我们聊了 LeakCanary,微信的 Matirx 和美团的 Probe,它们各自有不同的应用场景,例如,在开发测试环境,我们会偏向用 Lea ...

  8. android fps 垂直同步,浅谈Android流畅度

    原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...

  9. android分屏模式_浅谈 Android 7.0 多窗口分屏模式的实现

    从 Android 7.0 开始,Google 推出了一个名为"多窗口模式"的新功能,也就是我们常说的"分屏模式".那么,这个功能有什么用呢?作为开发者,我们又 ...

最新文章

  1. android 牛人必修 ant 编译android工程
  2. BZOJ 1084: [SCOI2005]最大子矩阵
  3. “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。”...
  4. 如何安装boost库
  5. COJ 1079 树上的查询 (离线LCA)
  6. ArcGIS Engine开发前基础知识(3)
  7. 函数无法识别_Halcon OCR识别
  8. 设计模式——组合设计模式
  9. 机器学习入门——MINST
  10. 惠普103a微信打印服务器,惠普发布微信打印小程序,丰富云打印解决方案
  11. DOTA 104个英雄416个技能、104首情诗
  12. 基于北斗观测值的智能手机GNSS定位研究
  13. xmind新手入门教程,xmind怎么用?
  14. 不吸电子烟也请别吸电子咖啡!我们向雪加电子咖啡发起了挑战
  15. jmeter参数化之函数助手
  16. 985在读硕士晓文大数据学习之路1:出发
  17. 【渝粤教育】电大中专跨境电子商务理论与实务 (6)作业 题库
  18. 时代中的软件开发:基于BS架构的低代码
  19. cocos 2dx C++ 获取tmx文件里对象的坐标。
  20. 科大讯飞车辆贷款违约

热门文章

  1. 实战 Docker+Kubernetes 微服务容器化(二)-微服务带来的问题及解决方案分析
  2. PathMatchingResourcePatternResolver通过适配符寻找符合条件的java类
  3. RHEL 5基础篇—了解系统的引导过程
  4. RabbitMQ详细文档
  5. 请求一个action,将图片的二进制字节字符串在视图页面以图片形式输出
  6. Angular 中得 scope 作用域梳理
  7. cocos2d-x-3.2 lua命名空间前缀
  8. Silverlight 5 深入理解 - TechEd2011葡萄城讲师课程
  9. 韩寒:出了国才知道,外国是多么的落后(写的真委婉~不愧是韩寒)
  10. C 语言编程 — 程序的装载与运行