一、背景
寫完SDK,還有JNI的加密,還要加密第三方的JNI,頭疼
二、科普知識點(關於混淆含有JNI代碼的注意事項)
1、絕對不能混淆含有JNI的代碼,例如 native 修飾的方法
2、看情況,如果在做到1的情況下,還出現找不到類(ClassNotFound)或者方法的情況,不混淆JNI代碼裏面使用的實體類或者一些方法
對於上述2點的解釋:假如你混淆了JNI代碼塊,那麼在調用的時候,因爲混淆了,是找不到對應的native方法或者對應的JNI的類的,所以纔會出現找不到類或者方法的情況。
三、操作步驟
1、首先打開proguard(android的sdk裏面有:sdk\tools\proguard\bin,這個路徑)
2、準備好對應的混淆加密配置文件proguard.txt和要混淆加密的jar(加密詳見這篇android打包SDK具體操作)
#導入的要混淆的jar包的名字叫做 printer.jar
-injars printer.jar
#在當前目錄下導出混淆加密的jar的名字叫做 printPro.jar
-outjars 'printerPro.jar'
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose
-dontoptimize
-dontpreverify
#下面是保留的一些組件,例如annotation,activity等等
-keepattributes *Annotation*
-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 * extends android.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService
#不混淆 native 的方法, 這個是很重要的,理由如上 二 所述
-keepclasseswithmembers 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 *;
}
-keepattributes *Annotation*
-keep class * extends java.lang.annotation.Annotation { *; }
-keep interface * extends java.lang.annotation.Annotation { *; }
-keepattributes Signature
-dontwarn android.support.**
#The library must use of this jar,引入的第三方 我需要 的jar,android.jar和rt.jar是有版本的,我這裏的是jdk7
-libraryjars 'D:\libs\commons-net-3.1.jar'
-libraryjars 'D:\libs\httpmime-4.4.jar'
-libraryjars 'D:\libs\httpclient-android-4.3.3.jar'
-libraryjars 'D:\libs\android.jar'
-libraryjars 'D:\libs\rt.jar'
#The entrance of this printer.jar
#只公開保留public 方法,其餘的均混淆加密
-keep public class com.maigao.printer.PrinterService{
public <methods>;
}
-keep public class com.maigao.printer.PrinterReceiver{
public <methods>;
}
#不混淆加密這個類裏面的所有的代碼
-keep public class com.maigao.printer.status.**{
*;
}
#這裏是我們編寫的JNI代碼,不能混淆,理由如上 二 所述
-keep public class com.maigao.jni.**{
*;
}
-keep public class com.hiti.printer.PrintPara {
*;
}
3、點開 proguardgui.bat 這個軟件,導入配置
4、然後一直next就好了,最後看見有success的提示就好了,如果沒有成功就爆什麼錯,如果是找不到類的話,那麼就去找對應的jar導入就好(例如:-libraryjars 'D:\libs\commons-net-3.1.jar')
打完收工