android混淆打包经验分享!
2013-11-15 10:07
471 查看
以下为我此期项目中的关于混淆打包的总结: (本人第一次混淆打包,呵呵,错误很多!列了一些比较头疼的) 一、项目混淆过程中注意事项: 由于我的sdk版本较高,因此新建android项目下只有proguard-project.txt和project.properties这两个文件夹,而网上一些所谓混淆的方法我均试验了下,都有或多或少的问题,以下是一些混淆总结: 1、如果你的项目没有其他第三方包的话,那么进行混淆很简单,只需要将project.properties文件夹下面的注释解开就行,一点区别在于:如果您是2.3之前的sdk版本,那么就用这个proguard.config=proguard.cfg 如果是之后的则为:proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt(当然视您生成项目时候该文件具体生成情况所定)。 2、如果有第三方lib包的话,则混淆时需要注意了,以下是常用的一些lib包的混淆配置: 1)、友盟sdk: -libraryjars libs/umeng_sdk.jar -keepclassmembers class * { public (org.json.JSONObject); } -keep public class [您的应用程序名].R$*{ public static final int ; } 2)、gson -ibraryjars libs/gson-2.2.2.jar -keep class sun.misc.Unsafe { *; } -keep class com.google.gson.stream.* { ; } -keep class com.google.gson.examples.android.model.* { ; } -keep class com.google.gson.* { *;} 3)、support-v4包 -libraryjars libs/android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { ; } 4)、nineoldandroids动画lib包 -libraryjars libs/nineoldandroids-2.4.0.jar -dontwarn com.nineoldandroids.* -keep class com.nineoldandroids.** { *;} 注解: -braryjars libs/nineoldandroids-2.4.0.jar----指明lib包的在工程中的路径 而-dontwarn com.xx.bbb.**和-keep class com.xx.bbb.** { ;} 这两个参数用来保持第三方库中的类而不乱,将-dontwarn和-keep 结合使用,意思是保持com.xx.bbb.*这个包里面的所有类和所有方法而不混淆,接着还叫ProGuard不要警告找不到com.xx.bbb.**这个包里面的类的相关引用。 具体介绍参考:http://blog.sina.com.cn/s/blog_644c92c90101o3f8.html 3、本人采用的方式为:直接将项目生成的proguard-project.txt删掉,然后直接找原来2.3版本生成的proguard.cfg复制到项目中来,以下为我两个混淆文件的配置:(为了让大家看的更加清楚,原文粘贴) 1)project.properties文件里面的内容: # This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. proguard.config=proguard.cfg target=android-11 2)proguard.cfg 文件的内容: -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native ; } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public (android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -libraryjars libs/umeng_sdk.jar -keepclassmembers class * { public (org.json.JSONObject); } -keep public class com.smile.android.R$*{ public static final int *; } -libraryjars libs/gson-2.2.2.jar -keep class sun.misc.Unsafe { ; } -keep class com.google.gson.stream.* { ; } -keep class com.google.gson.examples.android.model.* { ; } -keep class com.google.gson.* { *;} -libraryjars libs/android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -libraryjars /libs/nineoldandroids-2.4.0.jar -dontwarn com.nineoldandroids.** -keep class com.nineoldandroids.** { *;} 注:(对呀lib包的混淆配置,一般放到此文件的最后面!注意红字部分) 二、混淆打包后的错误收集: 1、如果项目中含有数据库并且数据库的创建方式为通过实现BaseColumns类来依次创建数据库表的话,那么在混淆之后会出现no such table这类的错误,这个错误困扰我一晚上了,实在想不通,后面觉得应该是混淆过程中将包名混淆了导致编译器找不到该表。 解决办法:换数据库的创建方式:直接在继承自SQLiteOpenHelper中执行表格创建即:db.execSQL(DB_CREAT);这样一来就不会出错了!很奇葩的解决方法,还是回归原始比较好! 2、项目中libs包中有gson的话,混淆后出现java.lang.IllegalArgumentException: class com.smile.android.open.c.a declares multiple JSON fields named a at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(Unknown Source) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(Unknown Source) 经过一番搜索:此译文说的是我的实体对象类中有重名的变量名,后面发觉是不是我此对象有太多嵌套的原因,试了下将父类对象的变量全部移植到子类中,再重新混淆打包编译,发现解决了!哈哈!哎!同样苦逼的问题! 看来以后实体对象还是不要有太多的嵌套了! |
相关文章推荐
- android混淆打包经验分享!+自己体会
- Android Proguard混淆打包经验总结
- Android应用程序的混淆打包分享
- Android Proguard混淆打包经验总结
- Android 混淆jar的经验分享
- ANDROID应用程序的混淆打包分享
- Android Proguard混淆打包经验总结
- Android应用程序签名打包,混淆代码时报错的处理方法
- Android混淆打包时遇到的问题
- 转载分享:Android APP二次打包操作步骤介绍
- 【腾讯Bugly干货分享】Android 新一代多渠道打包神器
- Android手动混淆打包(com.android.library类型工程项目打包jar包)
- 安装包立减1M--微信Android资源混淆打包工具
- [Android] 内存泄漏调试经验分享
- android代码混淆和打包签名
- 关于shareSDK遇到的坑 Android微信分享,打包前可以分享,打包后不能分享。
- [android]代码打包混淆
- AndroidAPK混淆打包以及反编译技巧
- Android 学习经验之分享
- Android截屏与WebView长图分享经验总结