记一下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包的封装_第1张图片

配置基础设置记一下jar包的封装_第2张图片

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 interface  com.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包的封装_第3张图片

你可能感兴趣的:([android项目])