一般与so配合使用的jar包,其中包含so调用类,以及实体类。本文介绍下如何将实体类导出生成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
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();
}