Android 的jar混淆踩坑之旅
来源:互联网 发布:淘宝发布宝贝商家编码 编辑:程序博客网 时间:2024/06/14 20:01
最近公司需要将将之前提供个客户的jar进行混淆以保护代码,防止信息泄露。然后在网上搜了一大堆相关的android jar混淆资料,然后实践下来各有各的坑爹!
网上关于android 打jar包,proguard混淆的资料比较多,笔者就赘述了,需要可以的可以google。
本文就记录混淆jar过程中遇到的各种坑及解决办法,希望对遇到同样问题的读者有所帮助。
问题1. 需不需要导入jdk 的jar包?
虽然有些文档提示需要导入jdk的中的rt.jar(正确地址为:/Library/Java/JavaVirtualMachines/jdk1.8.0_91.jdk/Contents/Home/jre/lib)
然后实践下来发现不需要。
问题2. 那些jar 需要libraryjars 上面添加
一般情况下最需添加的是android jar包,地址为/Users/wanny/Library/Android/sdk/platforms/android-25/android.jar,另外就是这个jar所依赖的第三方包,例如常见的gson、okhttp、v7等jar包。
问题3. proguard 混淆时报 Can’t read [/Users/wanny/Library/Android/sdk/platforms/android-25/android.jar] (Can’t process class [java/text/CollationElementIterator.class] (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) 等类似错误
这个问题比较坑爹,错误信息显示我们的jdk版本超过了java 1.7 51.0 版本,等我们去下载jdk 1.7 51.0 版本又是一阵折腾。而且更坑爹的最新的mac 系统不支持jdk 1.7 51.0 这么低的版本,我们都安装不了
出现这个问题的用户很多都是用android SDK toos中自带的proguard,建议到Proguard官网上下载proguard 最新的版本,问题迎刃而解。
问题4. Proguard Load configuration 失败。
当我们将混淆的配置文件写好,load configuration 后,期待着proguard 一次性将我们jar 混淆好,可悲他竟然报错,加载不了我们辛辛苦苦写的配置文件。
一般出现这个问题肯定是我们的proguard 配置文件写的有问题。可能原因
- 地址injars,outjars,libraryjars 等地址有误
- proguard keep 语句写错,注意keep 语句开头一定记得加上-
- 其他注释语句没有用# 注释起来
···
当然类似出现此问题,唯一的解决途径就是仔细再仔细的检查proguard 的配置文件。
问题5,混淆后未找到混淆后jar文件。
这个问题,是用户没有在proguard 配置文件中写上outjars 地址,或者没有在add output 添加导出后地址,记得添加上去就行
另外注意在这个地方proguard 需要你提供一个已经存在的jar包作为混淆后输出的jar包,可以先用用”touch new.jar”新建了一个空白的jar包,然后将地址添加上去。
问题6,混淆后需要对外提供的class也不见了,只剩下寥寥几个class
这个问题是因为我们对外的提供类没有keep 好,被proguard 当成无用的代码直接优化掉。
因此我们需要对外提供接口需要暴露出来,不需要混淆,可在配置文件加上
-keep public class com.cardinfolink.test{ public <fields>; public <methods>;}
其他的需要对外提供的接口都需要好好的暴露出来,及对外提供的成员变量也需要keep 好防止混淆后不可识别。
另外内部类及内部接口等也不要好好处理
另外顺便提供一份proguard 的配置文件以供参考。
-injars /Users/wanny/Downloads/Android/CILPaySDK.jar -outjars /Users/wanny/Downloads/Android/demo/testdemo/libs/CILPaySDK.jar-libraryjars /Users/wanny/Downloads/Android/demo/testdemo/libs/libammsdk.jar-libraryjars /Users/wanny/Library/Android/sdk/platforms/android-25/android.jar-dontoptimize-dontusemixedcaseclassnames-keepattributes *Annotation*,Signature,InnerClasses,EnclosingMethod-dontpreverify-verbose-dontnote com.android.vending.licensing.ILicensingService,com.google.vending.licensing.ILicensingService,com.google.android.vending.licensing.ILicensingService,android.support.**-dontwarn android.support.**-keep public class com.google.vending.licensing.ILicensingService-keep public class com.android.vending.licensing.ILicensingService-keep public class com.google.android.vending.licensing.ILicensingService# Keep setters in Views so that animations can still work.-keepclassmembers public class * extends android.view.View { void set*(***); *** get*();}# We want to keep methods in Activity that could be used in the XML attribute onClick.-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-keepclasseswithmembernames class * { native <methods>;}-keepclassmembers class * extends android.app.Activity { public void *(android.view.View);}-keepclassmembers class * extends android.os.Parcelable { public static final ** CREATOR;}-keepclassmembers class **.R$* { public static <fields>;}# Preserve annotated Javascript interface methods.-keepclassmembers class * { @android.webkit.JavascriptInterface <methods>;}# Understand the @Keep support annotation.-keep class android.support.annotation.Keep-keep @android.support.annotation.Keep class * { <fields>; <methods>;}-keepclasseswithmembers class * { @android.support.annotation.Keep <methods>;}-keepclasseswithmembers class * { @android.support.annotation.Keep <fields>;}-keepclasseswithmembers class * { @android.support.annotation.Keep <init>(...);}# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native-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);}-keep class com.cardinfolink.view.** { <fields>; <methods>;}-keep public class com.cardinfolink.activity.** { public <fields>; public <methods>;}-keepclassmembers class com.cardinfolink.activity.PayModule{ public <fields>; public <methods>; protected <fields>; } -keep class com.cardinfolink.constants.** {*;}-keep public class com.cardinfolink.engine.CILPayEngine{ public <fields>; public <methods>;}-keep public class com.cardinfolink.util.PayResult{ public <fields>; public <methods>;}-keep public class com.cardinfolink.util.ResultJson{ public <fields>; public <methods>;}
- Android 的jar混淆踩坑之旅
- Android之-android-support-v4.jar的混淆问题
- Android jar包的混淆
- 混淆Android的jar包
- Android代码混淆(第三方jar的混淆)
- android 混淆jar及apk的心得
- android 混淆jar及apk的心得
- android 混淆jar及apk的心得
- 混淆Android JAR包的方法
- Android打包出的jar包混淆
- 混淆Android JAR包的方法
- 混淆Android JAR包的方法
- 混淆Android JAR包的方法
- Android 混淆jar的经验分享
- android studio 生成混淆的jar包
- 关于 android 混淆 怎么去掉 混淆过依赖的jar包(混淆过的jar包不做二次混淆)
- Android 编程下的代码混淆之(android-support-v4.jar)
- 混淆ANDROID JAR包
- 全国政协文史和学习委员会驻会副主任卞晋平莅临汪国新湖北诗书画院
- 机器学习并没有那么深奥,它很有趣(4)
- 排序6:堆排序
- 结构体内存对齐
- ui-sref如何传递参数
- Android 的jar混淆踩坑之旅
- IT的青春饭
- scala map/list/array/的常用内置遍历操作总结
- 【java】强引用、弱引用、软引用、虚引用
- laravel中将session由文件保存改为数据库保存
- Telephony-Uicc双卡管理
- LeetCode刷题(C++)——Convert Sorted List to Binary Search Tree(Normal)
- 1052. 卖个萌 (20)
- 初识HTML/CSS之CSS篇