含有JNI的SDK通過proguard混淆加密 原 薦

一、背景

寫完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')

打完收工

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章