Android代码混淆的实践

简介:

开发apk的时候当然要考虑保护好自己的代码,Android环境就提供了proguard来进行代码混淆,确实是一个非常有用的工具,但用起来也确实够折腾的。

1. 基本配置

   eclipse下建立android工程,就会生成proguard.cfg和project.properties,在后面的文件追加proguard.config=proguard.cfg即可让前面的配置文件在export时生效。默认的那个文件有一些内容,这里给一个更通用点的。

 
  1. ##---------------Begin: proguard configuration common for all Android apps ---------- 
  2. -optimizationpasses 5 
  3. -dontusemixedcaseclassnames 
  4. -dontskipnonpubliclibraryclasses 
  5. -dontskipnonpubliclibraryclassmembers 
  6. -dontpreverify 
  7. -verbose 
  8. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
  9. -keepattributes *Annotation* 
  10. -renamesourcefileattribute SourceFile 
  11. -keepattributes SourceFile,LineNumberTable 
  12.  
  13. # 以下两个命令配合让类的路径给删除了 
  14. -allowaccessmodification 
  15. -repackageclasses '' 
  16.  
  17. # 记录生成的日志数据,在proguard目录下 
  18. -dump class_files.txt  
  19. -printseeds seeds.txt  
  20. -printusage unused.txt  
  21. -printmapping mapping.txt  
  22.  
  23. # 异常都可以忽略就打开 
  24. #-dontwarn 
  25.  
  26. -keep public class * extends android.app.Activity 
  27. -keep public class * extends android.app.Application 
  28. -keep public class * extends android.app.Service 
  29. -keep public class * extends android.content.BroadcastReceiver 
  30. -keep public class * extends android.content.ContentProvider 
  31. -keep public class * extends android.app.backup.BackupAgentHelper 
  32. -keep public class * extends android.preference.Preference 
  33. -keep public class com.android.vending.licensing.ILicensingService 
  34. -dontnote com.android.vending.licensing.ILicensingService 
  35.  
  36.  
  37. -keepnames class * implements java.io.Serializable 
  38.  
  39. # Explicitly preserve all serialization members. The Serializable interface 
  40. # is only a marker interface, so it wouldn't save them. 
  41. -keepclassmembers class * implements java.io.Serializable { 
  42.     static final long serialVersionUID; 
  43.     private static final java.io.ObjectStreamField[] serialPersistentFields; 
  44.     private void writeObject(java.io.ObjectOutputStream); 
  45.     private void readObject(java.io.ObjectInputStream); 
  46.     java.lang.Object writeReplace(); 
  47.     java.lang.Object readResolve(); 
  48.  
  49. # Preserve all native method names and the names of their classes. 
  50. -keepclasseswithmembernames class * { 
  51.     native <methods>
  52.  
  53. -keepclasseswithmembernames class * { 
  54.     public <init>(android.content.Context, android.util.AttributeSet); 
  55.  
  56. -keepclasseswithmembernames class * { 
  57.     public <init>(android.content.Context, android.util.AttributeSet, int); 
  58.  
  59. # Preserve static fields of inner classes of R classes that might be accessed 
  60. # through introspection. 
  61. -keepclassmembers class **.R$* { 
  62.   public static <fields>
  63.  
  64. # Preserve the special static methods that are required in all enumeration classes. 
  65. -keepclassmembers enum * { 
  66.     public static **[] values(); 
  67.     public static ** valueOf(java.lang.String); 
  68.  
  69. -keep class * implements android.os.Parcelable { 
  70.   public static final android.os.Parcelable$Creator *; 
  71.  
  72. # 如果你的工程是对外提供方法调用就打开 
  73. #-keep public class * { 
  74. #    public protected *; 
  75. #} 
  76.  
  77. ##---------------End: proguard configuration common for all Android apps ---------- 

2. 解决export打包的报错

    这个时候export提示“conversion to Dalvik format failed with error 1”错误,网上说法有好多种,最后我还是把proguard从4.4升级到4.8就解决了。官方地址是http://proguard.sourceforge.net。上面的配置文件参数可以在这里查阅。

    升级办法很简单,就是把android sdk目录下的tool/proguard目录覆盖一下即可。

3. 打包出来的程序如何调试

    一旦打包出来,就不能用eclipse的logcat去看了,这里可以用android sdk中ddms.bat的tool来看,一用就发现和logcat其实还是一个东西,就是多了个设备的选择。

    在android上最好去下载一个logcat阅读器,这样在手机上运行崩溃了,不用连电脑也能查看日志了。可以再这里下载http://static.apk.hiapk.com/html/2012/03/438120.html。

4. 使用 gson 需要的配置

    当Gson用到了泛型就会有报错,这个真给郁闷了半天,提示“Missing type parameter”。最后找到一个资料给了一个解决办法,参考:http://stackoverflow.com/questions/8129040/proguard-missing-type-parameter

    另外我又用到了JsonObject,提交的Object里面的members居然被改成了a。所以上面给的东西还不够,还要加上

 
  1. # 用到自己拼接的JsonObject 
  2. -keep class com.google.gson.JsonObject { *; } 

    我个人建议减少这些依赖包混淆带来的麻烦,干脆都全部保留不混淆。例如

 
  1. -keep class com.badlogic.** { *; } 
  2. -keep class * implements com.badlogic.gdx.utils.Json* 
  3. -keep class com.google.** { *; } 

5. 使用libgdx需要的配置

    参考http://code.google.com/p/libgdx-users/wiki/Ant

6. 验证打包效果

    我是利用了apktool的反编译工具,把打包文件又解压了看了一下,如果包路径、类名、变量名、方法名这些变化和你期望一致,那就OK了。命令:

 
  1. apktool.bat d xxx.apk destdir 

 

    总结:这个东西用起来也不是很简单,特别是你程序用到的高级特性多,就更容易出问题。另外proguard的参数看起来确实也有点不好理解,打包过程慢,测试也比较浪费时间。东西虽好,但真不是那么容易上手。



本文转自passover 51CTO博客,原文链接:http://blog.51cto.com/passover/898470,如需转载请自行联系原作者

相关文章
|
4天前
|
安全 数据处理 Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第26天】 在面对现代Android开发时,性能优化和流畅的用户体验成为了开发者们追求的目标。Kotlin作为一种现代化的编程语言,通过其协程特性为Android应用带来了前所未有的并发处理能力。本文将深入探讨如何利用Kotlin协程提升Android应用的响应性和效率,同时保持代码的简洁性。我们将从协程的基础概念出发,逐步揭示如何在实际应用中运用这些强大的工具,以及它们如何改善应用架构和用户交互体验。
|
9天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第22天】 在移动开发领域,性能优化和响应性是衡量应用程序质量的关键指标。近年来,Kotlin语言因其简洁性和功能性在Android社区中获得了广泛认可。特别是Kotlin协程,作为一种新的并发处理机制,正在改变开发者编写异步和后台任务的方式。本文将探讨Kotlin协程的核心优势,并通过实例展示如何在Android应用中实现它们以提高性能和用户体验。
|
11天前
|
API 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第20天】 在现代Android开发中,Kotlin协程以其轻量级线程管理和非阻塞I/O操作的优势成为提升应用性能和响应性的重要工具。本文深入分析Kotlin协程的核心原理,探讨其在Android平台上实现高效并发编程的方法,并通过具体实例演示如何利用协程改进应用架构。我们将从协程的基本概念出发,逐步解析其与线程、回调和异步任务的关系,最终展示如何通过协程简化代码结构,提高运行效率,并确保用户界面的流畅性。
21 11
|
29天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
2天前
|
移动开发 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第29天】在移动开发领域,尤其是Android平台上,性能优化一直是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的并发处理机制,为编写异步代码、网络请求和数据库操作提供了极大的便利。本文将深入探讨Kotlin协程在Android应用中的性能优化技巧,帮助开发者构建更加高效的应用程序。
|
3天前
|
API 调度 Android开发
构建高效Android应用:Kotlin协程的实践之路
【4月更文挑战第28天】随着移动应用开发的不断深入,开发者们追求更高效的编码方式和性能优化。Kotlin作为一种现代的编程语言,其协程特性提供了异步编程的新范式,使得处理并发任务更加简洁高效。本文将探讨如何在Android应用开发中利用Kotlin协程提升性能和用户体验,同时确保代码的可读性和可维护性。通过实例分析和代码演示,我们将深入了解协程在Android中的实际应用及其带来的优势。
8 1
|
3天前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第28天】 在移动开发领域,尤其是针对Android平台,性能优化和异步处理一直是开发者关注的焦点。随着Kotlin语言的普及,其提供的协程功能已经成为处理异步任务的强大工具。本文将深入探讨Kotlin协程在Android应用开发中的优势,并通过实例展示如何利用协程提升应用性能和响应能力。我们将分析协程与传统线程和AsyncTask的对比,以及如何在实际项目中有效集成和调试协程。
|
7天前
|
调度 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第24天】随着移动开发技术的不断演进,提升应用性能和用户体验已成为开发者的核心任务。在Android平台上,Kotlin语言凭借其简洁性和功能性成为主流选择之一。特别是Kotlin的协程功能,它为异步编程提供了一种轻量级的解决方案,使得处理并发任务更加高效和简洁。本文将深入探讨Kotlin协程在Android开发中的应用,通过实际案例分析协程如何优化应用性能,以及如何在项目中实现协程。
|
9天前
|
Java 数据库 Android开发
构建高效Android应用:探究Kotlin协程的优化实践
【4月更文挑战第22天】 随着移动开发技术的不断进步,Android平台上的性能优化已成为开发者们关注的焦点。在众多优化手段中,Kotlin协程以其轻量级线程管理和异步编程的优势,为提高应用性能和响应性提供了新的思路。本文将深入探讨Kotlin协程在Android开发中的具体应用,通过实例演示如何利用协程进行网络请求、数据库操作和UI线程的非阻塞更新,以期达到提升应用性能的目的。
12 2
|
13天前
|
API 调度 Android开发
构建高效Android应用:探究Kotlin协程的实践之路
【4月更文挑战第17天】 随着移动开发技术的不断演进,Android平台的性能优化已成为开发者关注的焦点。Kotlin协程作为一种新型的轻量级线程管理方案,在简化异步编程和提升应用响应性方面展现出巨大潜力。本文将深入探讨Kotlin协程在Android开发中的应用实践,从基本概念到实际案例,为开发者提供一条清晰、高效的学习路径,旨在帮助读者掌握协程技术,优化应用性能,提升用户体验。
11 0