[Android初级]关于Android使用Proguard混淆打包的那些事
16lz
2021-01-25
我在业余时间想看看android是如何混淆打包的,现在的android SDK都是带有Proguard工具的,这个工具的作用个人感觉其实就是为了时别人反编译你的apk文件后,无法轻松的阅读你的代码而使用的障眼法,功能有限,但是总比没有的好,哈哈。
现在开始正题吧。
(1)在Eclipse开发的项目下,会自动生成一个project.properties文件,里面的内容加上这么一句:
proguard.config=proguard.cfg这个proguard.cfg文件是在sdk2.3之前的版本中会自带的,2.3以后就是叫proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
这个其实是差不多的,不要在意,内容和性质一致。
(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 <methods>;}-keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet);}-keepclasseswithmembers class * { public <init>(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 *;}-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;} -keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}-libraryjars libs/android-support-v4.jar-dontwarn android.support.**
以上的很多命令都来自我们的Proguard工具,大概有以下的意思,先大概了解一下: ===================================这是分割线==========================================
(3)现在有个问题,如果项目中存在第三方jar文件,如果被混淆的话,肯定是会出问题,可能在生成apk文件时报错,或者是无法安装和运行程序等等奇怪的错误。
通常上的方法,第三方jar文件,你可以在proguard.cfg文件中如下类似的配置:
-libraryjars /libs/nineoldandroids-2.4.0.jar-dontwarn com.nineoldandroids.**-keep class com.nineoldandroids.** { *;}
特使的,如果存在谷歌的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.* { *;}
android.library.reference.1=../projectNamex1跟第三方jar的处理很相似,在配置文件中增加
-libraryjars ../projectNamex1-dontwarn com.projectNamex1.**-keep class com.projectNamex1.** { *;}
以上可总结,用以下的方式处理第三方的jar.
-libraryjars ..\第三方库的工程名--------引入的第三方库-dontwarn 包名.** --------告诉ProGuard不要警告找不到包名.**这个包里面的类的相关引用-keep class 包名.** { *;} --------对这个包里面的所有类和所有方法不进行混淆
接下来,你可用用eclipse的android tools 打包了。
。。。。。。
。。。。
。。。
。。
。
经测试,使用proguard混淆后,我再反编译看源代码就有点难懂了。
更多相关文章
- 一款常用的 Squid 日志分析工具
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- Android本地存储目录研究
- 【Android(安卓)- V】之Toolbar的使用
- Android(安卓)开发之多线程处理——Handler 详解
- Android得不到对话框里的值问题
- Android(安卓)Studio自带数据库SQLite的用法部分总结