记一下jar包的封装

前言:最近公司提出个这么个需求,app作为一个内嵌功能性模块提供给第三方调用使用,需求直接调用,不需要做其他任何二次开发,同时保证交出去的代码的安全性。


通过以下方法解决了需求,moudle依赖的方式去提供入口,api及部分逻辑代码封装jar混淆保证核心代码的安全性。不过jar包的方式并不能完全的保证安全性,只是提高了破译的难度。


简要记下
jar提取步骤
1.新建moudle并设为android library,需要封装进jar的逻辑代码及api放进moudle。build.gradle中添加下面的代码(jar配置)

task makeJar(type: Copy) { from('build/intermediates/bundles/release/') into('build/libs/')//导出后jar所在目录 include('classes.jar') rename ('classes.jar', 'haokan_sdk.jar')//前者原文件名,后者重命名文件 }makeJar.dependsOn(build)


注:逻辑代码及api放进jar包内需要考虑到调用的场景,做相应的逻辑更改。公共方法需要暴露出来。常量不可直接调用
2.命令行运行./gradlew makeJar导出jar包
3.在build/libs/文件夹下即可找到jar包


jar混淆
1.打开sdk自带工具proguardgui.jar路径/Users/sung/android-sung/tools/android-sdk-macosx/tools/proguard/lib/proguardgui.jar
2.运行proguardgui.jar,首次运行先生成配置文件记一下jar包的封装
文章图片

配置基础设置记一下jar包的封装
文章图片

Process -》Save configuration 保存.pro混淆规则文件,下次打开就可以直接从ProGuard选项卡load。保存完了之后用txt打开.pro文件根据项目需要编辑混淆规则(贴出我的,规则不做赘述)默认生成的一些部分没有贴上来,只贴了我自定义的部分,混淆规格和项目中的混淆规则的使用是一样的
-injars /Users/sung/AndroidStudioProjects/MyLiveApplication/haokanlivelib/build/libs/haokan_sdk.jar -outjars /Users/sung/Desktop-libraryjars /Users/sung/AndroidStudioProjects/MyLiveApplication/haokanlivelib/libs/gson-2.2.2.jar -libraryjars /Users/sung/AndroidStudioProjects/MyLiveApplication/haokanlivelib/libs/org.apache.http.legacy.jar-dontshrink -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizationpasses 5 -dontusemixedcaseclassnames -keepattributes *HaokanSDK*,Signature -dontpreverify -verbose -dontnote org.apache.**,com.feiyu.haokanlivelib.** -dontwarn com.google.gson.**,com.android.volley.jar.**,org.apache.**,com.feiyu.haokanlivelib.**-keep class **.R$* { ; ; }-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 com.android.vending.licensing.ILicensingService-keep class com.lidroid.xutils.** { ; ; }-keepclasseswithmembers public class com.feiyu.haokanlivelib.HaokanMgr//**重点说明 一定要保留一个jar包引用的入口以防使用报错 **-keepclasseswithmembers public class com.feiyu.haokanlivelib.network.*-keepclasseswithmembers public class com.feiyu.haokanlivelib.utils.*-keepclasseswithmembers public final class com.mzc.demo.MyDemo { public (android.content.Context,java.lang.String,android.widget.LinearLayout); public void openDoor(); }-keep interface* { ; ; }-keep public interfacecom.feiyu.haokanlivelib.network.ResponseListener { ; ; }# Gson specific classes -keep class sun.misc.Unsafe { ; ; }# -keep class com.google.gson.stream.** { *; } -keep class com.google.gson.** { ; ; }# Application classes that will be serialized/deserialized over Gson -keep class com.google.gson.examples.android.model.** { ; ; }-keep class com.android.volley.** { ; ; }-keep class com.android.volley.toolbox.** { ; ; }-keep class com.android.volley.Response$* { ; ; }-keep abstract class com.android.volley.Response { ; ; }-keep class com.android.volley.Request$* { ; ; }-keep class com.android.volley.RequestQueue$* { ; ; }-keep class com.android.volley.toolbox.HurlStack$* { ; ; }-keep class com.android.volley.toolbox.ImageLoader$* { ; ; }-keep class org.apache.** { ; ; }-keep class com.mediatek.common.featureoption.* { ; ; }-keepclasseswithmembers,allowshrinking public class com.feiyu.haokanlivelib.HaokanMgr { ; }-keepclasseswithmembers,allowshrinking public class com.feiyu.haokanlivelib.network.* { ; }-keepclasseswithmembers,allowshrinking public class com.feiyu.haokanlivelib.utils.* { ; }

3.Process-》Process!成功后输出目录找到混淆后的jar包即可使用
混淆过程中可能遇到的问题
混淆规则书法不规范会导致load原.pro文件失败
【记一下jar包的封装】记一下jar包的封装
文章图片

    推荐阅读