好长时间没有写技术博客了,转眼间已经有5年没有写,最近有点时间,打算把这几年里积累都发表贡献出来,希望广大博友多支持和拍砖,进入正题。
android 开发过程中会遇到自己开发(封装)的jar包需要提供给别人使用,这时候又不想把源码暴露给他人,所以就会用到jar包混淆 。再有就是网络提共的很多示例或者其它人写的方法都不起作用,经过小弟一周多来的努力,终于成功了,以下就是经验之谈。
1、下载最新的混淆工具
如果jdk 是1.8及以上的,下载地址:http://proguard.sourceforge.net/index.html#downloads.html
如果jdk 是1.8以下的,用sdk 自带的就可以,路径在“你的sdk路径\tools\proguard”
2、接下来就是编写pro文件了。
相信很多人都试过N多个混淆文件,但是虽然混淆成功了最终运行还是失败了,以下是我的文件, 以下文件可以正常混淆且运行无错,可以放心的修改吧,记住一定要把注释去掉才能使用。
//需要混淆的jar包 -injars 'D:\ProGuard\acquireurlhistory.jar' //混淆成功后生成的jar包 -outjars 'D:\ProGuard\output\mj_sdk_20160425.jar' //你开的的jar包里需要引用的第三方jar包,这些jar包我都放在我的D盘上 -libraryjars 'D:\Program Files\Java\jdk1.8.0_73\jre\lib\rt.jar' -libraryjars 'D:\ProGuard\libs\android.jar' -libraryjars 'D:\ProGuard\libs\annotations.jar' -libraryjars 'D:\ProGuard\libs\dbutil.jar' -libraryjars 'D:\ProGuard\libs\mjoysmaster.jar' -libraryjars 'D:\ProGuard\libs\protobuf-java-2.5.0.jar' -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizationpasses 5 -dontusemixedcaseclassnames //原数据 不能混淆 -keepattributes *Annotation* -verbose //你开发的jar包里引用到的R文件 不需要混淆 -dontwarn com.androld.tools.R* -keep class org.apache.3rdparty.stuff.** -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 //这是我开放出来给别人调用的sdk 入口 ,要排除掉,不能混淆 -keep class com.androld.tools.mjoys.MjoysSdkAgent { <fields>; <methods>; } //同理,DB 的初始化要开放出来 -keep class com.androld.tools.common.MJDBHelper { <fields>; <methods>; } //开放接口里的方法也不能混淆 -keepclassmembers public class com.androld.tools.mjoys.MjoysSdkAgent { public static <fields>; } //同上 -keepclassmembers public class com.androld.tools.common.MJDBHelper { public static <fields>; } -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); } -keep class * extends android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -keepclasseswithmembers,allowshrinking class * { native <methods>; } # Also keep - Enumerations. Keep the special static methods that are required in # enumeration classes. -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
以上用注释的地方就是我自己的需要,所以我做了修改,其它没有加注释的,就是不要修改了,相信大家看其它人写的和我这的都一样,所以不作多解释。
3、进入proGuard的bin目录
看到以下界面 :
如果文件编写错误,就会提示错吴,仔细观察文件是不是那里注释没有删除掉还是那里语法写错误。之后点击左边的process 进入混淆界面,点击右下角的process 开始混淆,如果内容里看到successfully 说明混淆成功,但是不一定运行不报错,所以要测试混淆好的jar包是否可用,也可以看看你的代码里那里出错,再按以上方法,把你的类或者方法排除不混淆,直到成功。
至此,已经完成,我搞了一周才能搞好,大家加油吧,我把我的proGuard文件放到附件里供大家下载。