>>分享Android开发相关的技术 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 19447 个阅读者 刷新本主题
 * 贴子主题:  Android代码混淆的实践 回复文章 点赞(0)  收藏  
作者:Jacky    发表时间:2020-03-31 16:21:06     消息  查看  搜索  好友  邮件  复制  引用

       开发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.   -allowaccessmodification
  14.   -repackageclasses ''
  15.   # 记录生成的日志数据,在proguard目录下
  16.   -dump class_files.txt  
  17.   -printseeds seeds.txt  
  18.   -printusage unused.txt  
  19.   -printmapping mapping.txt  
  20.   # 异常都可以忽略就打开
  21.   #-dontwarn
  22.   -keep public class * extends android.app.Activity
  23.   -keep public class * extends android.app.Application
  24.   -keep public class * extends android.app.Service
  25.   -keep public class * extends android.content.BroadcastReceiver
  26.   -keep public class * extends android.content.ContentProvider
  27.   -keep public class * extends android.app.backup.BackupAgentHelper
  28.   -keep public class * extends android.preference.Preference
  29.   -keep public class com.android.vending.licensing.ILicensingService
  30.   -dontnote com.android.vending.licensing.ILicensingService
  31.   -keepnames class * implements java.io.Serializable
  32.   # Explicitly preserve all serialization members. The Serializable interface
  33.   # is only a marker interface, so it wouldn't save them.
  34.   -keepclassmembers class * implements java.io.Serializable {
  35.       static final long serialVersionUID;
  36.       private static final java.io.ObjectStreamField[] serialPersistentFields;
  37.       private void writeObject(java.io.ObjectOutputStream);
  38.       private void readObject(java.io.ObjectInputStream);
  39.       java.lang.Object writeReplace();
  40.       java.lang.Object readResolve();
  41.   }
  42.   # Preserve all native method names and the names of their classes.
  43.   -keepclasseswithmembernames class * {
  44.       native  < methods > ;
  45.   }
  46.   -keepclasseswithmembernames class * {
  47.       public  < init > (android.content.Context, android.util.AttributeSet);
  48.   }
  49.   -keepclasseswithmembernames class * {
  50.       public  < init > (android.content.Context, android.util.AttributeSet, int);
  51.   }
  52.   # Preserve static fields of inner classes of R classes that might be accessed
  53.   # through introspection.
  54.   -keepclassmembers class **.R$* {
  55.     public static  < fields > ;
  56.   }
  57.   # Preserve the special static methods that are required in all enumeration classes.
  58.   -keepclassmembers enum * {
  59.       public static **[] values();
  60.       public static ** valueOf(java.lang.String);
  61.   }
  62.   -keep class * implements android.os.Parcelable {
  63.     public static final android.os.Parcelable$Creator *;
  64.   }
  65.   # 如果你的工程是对外提供方法调用就打开
  66.   #-keep public class * {
  67.   #    public protected *;
  68.   #}
  69.   ##---------------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的参数看起来确实也有点不好理解,打包过程慢,测试也比较浪费时间。东西虽好,但真不是那么容易上手。



----------------------------
原文链接:https://blog.51cto.com/passover/898470

程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-04-18 16:07:12 重新编辑]
  Java面向对象编程-->第一个Java程序
  JavaWeb开发-->JavaWeb应用入门(Ⅰ)
  JSP与Hibernate开发-->第一个helloapp应用
  Java网络编程-->非阻塞通信
  精通Spring-->Vue组件开发基础
  Vue3开发-->Vue CLI脚手架工具
  Android ListView滑动加载
  Android Broadcast receiver 编程
  Android Gallery实现循环显示图像
  Android的Service和广播的讲解
  Android那些事儿之LBS定位
  Android定义的路径全局变量
  Android静默安装的实现
  Android UI学习 - Tab的学习和使用
  Android 4.0 : 复制APK,复制动态库的Android.mk 文件
  Android资源命名规范
  UI渲染机制以及优化
  android 自定义view 实现定制二维码扫描框
  Android 活动(Activity)
  Android 架构
  怎么让软键盘弹出时,部分控件上移
  更多...
 IPIP: 已设置保密
树形列表:   
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。