含有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')

打完收工

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