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,如需转载请自行联系原作者

相关文章
|
26天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
35 4
|
28天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【2月更文挑战第31天】 在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。随着Kotlin语言的流行,其异步编程解决方案——协程(Coroutines),为Android应用带来了革命性的并发处理能力。本文将深入探讨Kotlin协程的核心概念、设计原理以及在Android应用中的实际应用案例,旨在帮助开发者掌握这一强大的工具,从而提升应用的性能和响应能力。
|
30天前
|
移动开发 调度 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,尤其是针对Android平台,性能优化和应用流畅度始终是开发者关注的重点。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的热门选择。其中,Kotlin协程作为一种轻量级的线程管理解决方案,为异步编程提供了强大支持,使得编写非阻塞性代码变得更加容易。本文将深入分析Kotlin协程的核心优势,并通过实际案例展示如何有效利用协程提升Android应用的性能和响应速度。
|
1月前
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
1月前
|
数据库 Android开发 开发者
构建高性能微服务架构:从理论到实践构建高效Android应用:探究Kotlin协程的优势
【2月更文挑战第16天】 在当今快速迭代和竞争激烈的软件市场中,微服务架构以其灵活性、可扩展性和独立部署能力而受到企业的青睐。本文将深入探讨如何构建一个高性能的微服务系统,涵盖从理论基础到具体实现的各个方面。我们将重点讨论服务拆分策略、通信机制、数据一致性以及性能优化等关键主题,为读者提供一个清晰、实用的指南,以便在复杂多变的业务环境中构建和维护健壮的微服务体系结构。 【2月更文挑战第16天】 在移动开发领域,性能优化和流畅的用户体验是至关重要的。随着技术的不断进步,Kotlin作为一种现代编程语言,在Android开发中被广泛采用,尤其是其协程特性为异步编程带来了革命性的改进。本文旨在深入
239 5
|
3月前
|
人工智能 IDE 开发工具
Studio Bot - 让 AI 帮我写 Android 代码
Studio Bot - 让 AI 帮我写 Android 代码
153 1
|
18天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
12天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
29天前
|
移动开发 安全 Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【2月更文挑战第30天】 在移动开发领域,性能优化和应用流畅度始终是开发者追求的核心目标。特别是对于Android平台,由于设备多样性和系统资源限制,如何提升应用的响应速度和处理效率成为关键挑战。近年来,Kotlin语言因其简洁、安全且易于阅读的特性而广受欢迎。其中,Kotlin协程作为一种轻量级的线程管理方案,提供了异步编程的强大能力,使得编写非阻塞性代码变得简单高效。本文将深入探讨Kotlin协程在Android开发中的应用优势,并通过实例演示如何在实际项目中有效利用协程来改善应用性能。
|
1月前
|
Java 定位技术 Android开发
安卓应用性能优化实践
【2月更文挑战第26天】在竞争激烈的应用市场中,一个高效流畅的安卓应用是吸引和留住用户的关键。本文将深入探讨安卓应用性能优化的多个方面,包括内存管理、多线程处理、UI渲染效率以及电池使用优化。通过实例分析和最佳实践的分享,旨在帮助开发者构建更快、更稳定、更节能的安卓应用。