当前位置: 首页 > 工具软件 > Dream Studio > 使用案例 >

Android Studio - 导出jar包

赵驰
2023-12-01

Android Studio - 导出jar包

一般与so配合使用的jar包,其中包含so调用类,以及实体类。本文介绍下如何将实体类导出生成jar包。

生成未混淆jar包

需要注意打包资源所在路径,查看build/intermediates/javac/release/classes/ 下项目包名中是否有.class文件,路径不正确导出jar包中没有所需文件。

方式一:

// 生成未混淆的jar
task makeJar(type: Jar, dependsOn: ['compileReleaseJavaWithJavac']) {
    baseName = 'sdfapi'
//    version = '1.0.1'
//    classifier = 'X'
    //后缀名
    extension = 'jar'
    //需打包的资源所在的路径集
    from(['build/intermediates/javac/release/classes/'])
    //去除路径集下部分的资源
    exclude 'com/test/pcie/BuildConfig.class'
    exclude '**/R.class'
    exclude '**/R\$*.class'
    //只导入资源路径集下的部分资源
    include 'com/test/pcie/**/*.class'
}

方式二:


task makeJar(type: Jar, dependsOn: ['compileReleaseJavaWithJavac']) {
    // appendix = 'demo'
    baseName = 'cc'
    // version = '1.0.1'
    //  classifier = 'X'
    //后缀名
    extension = 'jar'
    //需打包的资源所在的路径集
    def srcClassDir = [project.buildDir.absolutePath + "/intermediates/classes/release"]
    //初始化资源路径集
    from srcClassDir
    //去除路径集下部分的资源
    exclude 'com/test/**/BuildConfig.class'
    exclude '**/R.class'
    exclude '**/R\$*.class'
    //只导入资源路径集下的部分资源
    include 'com/test/**/**/*.class'
}

生成的jar包目录:app/build/libs

生成混淆的jar包

task proJar(dependsOn: ['clearJar', 'makeJar'], type: proguard.gradle.ProGuardTask) {
    //Android 默认的 proguard 文件
    configuration android.getDefaultProguardFile('proguard-android.txt')
    //manifest 注册的组件对应的 proguard 文件
    configuration 'proguard-rules.pro'
    String inJar = makeJar.archivePath.getAbsolutePath()
    //输入 jar
    injars inJar
    //输出 jar
    outjars inJar.substring(0, inJar.lastIndexOf(File.separator)) + "/pg-${makeJar.archiveName}"
    //设置不删除未引用的资源(类,方法等)
    dontshrink
    Plugin plugin = getPlugins().hasPlugin("AppPlugin") ? getPlugins().findPlugin("AppPlugin") : getPlugins().findPlugin("LibraryPlugin")
        if (plugin != null) {
        List<String> runtimeJarList
        if (plugin.getMetaClass().getMetaMethod("getRuntimeJarList")) {
            runtimeJarList = plugin.getRuntimeJarList()
        } else if (android.getMetaClass().getMetaMethod("getBootClasspath")) {
            runtimeJarList = android.getBootClasspath()
        } else {
            runtimeJarList = plugin.getBootClasspath()
        }
        for (String runtimeJar : runtimeJarList) {
            //给 proguard 添加 runtime
            libraryjars(runtimeJar)
        }
    }
}

混淆文件:proguard-rules.pro
注意:对外提供的调用类不能混淆,外部调用的接口回调方法不能混淆。

-ignorewarnings
-keepclassmembers class * {
    native <methods>;
}
// 外部需要调用的类
-keepnames public class com.test.mx.BaseCard {
    public static <fields>;
}
// 外部需要调用的类
-keepnames public class com.test.mx.TestAPI {
    public <methods>;
}
// 接口
-keepclasseswithmembernames public interface  com.test.mx.TmcInterface {
    public static <fields>;
    public <methods>;
}
// 回调
-keepnames class com.test.mx.TMCAPI$TMCAPICallBack { *; }
-keepclassmembers class * {
   public void handleMessage(***);
}
-keepclassmembers class * {
   public void isSupported(***);
}
-keepclassmembers class * {
   public void run();
}
 类似资料: