1.前景
现公司的产品主要是做SDK,因为有需求,需要打包出不同配置和不同包名的SDK,而SDK的功能是一样的。
开始的想法是复制多一份library,需改一下配置,修改一下包名,然后再多执行几次 gradlew makeJar 。
...这个方法有点out,操作起来有点麻烦,而且SDK的需求会不断变化,处理配置和包名其他功能需要同步,一不小心就出错了。
有没有办法同一份library,通过配置,来满足产品的需求呢?
于是有了这篇文章! 下面我将用一个demo来为大家,
要求打出两个jar,区别(参考下边图片):
jar1:包名:"eli.com.library" ,配置:EConfig.webUrl=“http://baidu.com”(EConfig.java中的一个静态变量)
jar2:包名:"eli.com.google",配置:EConfig.webUrl=“http://google.com”
2.动态配置参数
a.在SDK目录下的build.gradle中为其建立productFlavors,并进行webUrl配置。
library.gradle:
defaultConfig {
minSdkVersion 9
targetSdkVersion 28
flavorDimensions "releaseType"
}
//动态配置webUrl值
productFlavors {
baidu {
dimension "releaseType"
buildConfigField "String", "WEB_URL", '"http://baidu.com"'
}
google {
dimension "releaseType"
buildConfigField "String", "WEB_URL", '"http://google.com/"'
}
}
EConfig.java
public class EConfig {
public static String webUrl = BuildConfig.WEB_URL;
}
3.动态修改SDK包名(利用jarjar-1.4.jar进行jar包名修改)
a.在项目根目录新建一个jarjar文件夹
b.添加jarjar-1.4.jar 下载地址
c.新建rule_google.txt
rule_google.txt
rule eli.com.library.** eli.com.google.@1
将jar的包名由eli.com.library修改为eli.com.google
d.在library.gradle中添加两个task(makeGoogleJar和changePackGoogle)
def SDK_BASENAME = "EliSDK"
def SDK_VERSION = "_V1.0.0"
def sdkDestinationPath = "build/outputs/jar/"
task deleteBuild(type: Delete) {
delete sdkDestinationPath
}
task makeJar(type: Jar) {
def zipFile = file('build/intermediates/classes/baidu/release/')
from fileTree(zipFile)
from fileTree(dir: 'src/main', includes: ['assets/**'])
baseName = SDK_BASENAME + SDK_VERSION + "_baidu"
destinationDir = file(sdkDestinationPath)
}
//打出webUrl修改了的jar包
task makeGoogleJar(type: Jar) {
def zipFile = file('build/intermediates/classes/google/release/')
from fileTree(zipFile)
from fileTree(dir: 'src/main', includes: ['assets/**'])
baseName = SDK_BASENAME + SDK_VERSION + "_google"
destinationDir = file(sdkDestinationPath)
}
//修改包名
task changePackGoogle(type: Exec) {
def appBuildDir = file("build/outputs/jar/")
workingDir appBuildDir
//执行修改包名的命令
commandLine 'java', '-jar', '../../../../jarjar/jarjar-1.4.jar', 'process', '../../../../jarjar/rule_google.txt', SDK_BASENAME + SDK_VERSION + "_google" + ".jar", SDK_BASENAME + SDK_VERSION + "_google" + ".jar"
}
changePackGoogle.dependsOn makeGoogleJar//执行changePackGoogle Task前先执行makeGoogleJar Task
makeJar.dependsOn(deleteBuild, build)
makeJar.finalizedBy changePackGoogle//执行makeJar Task后执行changePackGoogle Task
e.最后clean——>gradlew makeJar 会生成两个jar包
Demo地址:GitHub
参考文章:
Android Studio 打包时动态修改aar 包名称
https://blog.csdn.net/MyLero/article/details/78969586?utm_source=blogxgwz8
jar包冲突解决--jarjar工具修改jar包名
https://blog.csdn.net/weixin_42310890/article/details/81261831
写个Gradle脚本来干活--遍历&执行java命令
https://blog.csdn.net/MyLero/article/details/78969586?utm_source=blogxgwz8
Gradle tip #3-Task顺序