曾经有那么一个...的需求放在我面前,我没有好好的吐槽。同一份代码,需要导出有区别的Jar,例如分为三个版本,分别为A.jar,B.jar,C.jar:
- A.jar 正常项目
- B.jar 包含 b.jar(来自另一个项目)
- C.jar 包含 c.jar(来自另一个项目)
本来以为每次改一点,编译出来就行了,反正项目改动不大,结果我错了,由于来自其他项目的jar频繁变动,导致我经常需要导出Jar,每次都要手动去改,很繁琐,还容易出错,
终于在我被多次摧残以后,我决定利用gradle一次生成多个Jar,Google Baidu了一下,没有类似的文章,由于时间关系,我只能用比较暴力的方式了,参考多渠道APK,我在gradle做了如下修改,关键代码如下:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
pure.initWith(buildTypes.release)
pure {
//需要在src下建相应的文件夹,可以在此文件夹写差异化代码
}
im.initWith(buildTypes.release)
im {
//需要在src下建相应的文件夹,可以在此文件夹写差异化代码
}
}
dependencies {
// compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
provided files('libs/android-support-v4.jar')
//以下部分不同的版本依赖不同的Jar
//Debug version
debugCompile files('libs/xxx.jar')
debugCompile files('libs/xxx.jar')
//Integration version
releaseCompile files('libs/xxx.jar')
releaseCompile files('libs/xxx.jar')
//Pure version
pureProvided files('libs/xxx.jar')
pureCompile files('libs/xxx.jar')
//IM version
imProvided files('libs/xxx.jar')
imProvided files('libs/xxx.jar')
}
task makeJar(type: Copy, dependsOn: ['build']) {
//删除存在的
delete 'build/libs/test.jar'
//设置拷贝的文件
from('build/intermediates/bundles/release/')
//打进jar包后的文件目录
into('build/libs')
//将classes.jar放入build/libs/目录下
//include ,exclude参数来设置过滤
exclude "**/R.class"
exclude "**/R\$*.class"
include('classes.jar')
//重命名
rename('classes.jar', 'test.jar')
}
task makeJarPure(type: Copy, dependsOn: ['build']) {
delete 'build/libs/pure.jar'
from('build/intermediates/bundles/pure/')
into('build/libs')
exclude "**/R.class"
exclude "**/R\$*.class"
include('classes.jar')
rename('classes.jar', 'pure.jar')
}
task makeJarIM(type: Copy, dependsOn: ['build']) {
delete 'build/libs/im.jar'
from('build/intermediates/bundles/im/')
into('build/libs')
exclude "**/R.class"
exclude "**/R\$*.class"
include('classes.jar')
rename('classes.jar', 'im.jar')
}
这个task只是为了同时执行以上的三个task(如果jar的版本多的话,可以把上面的task定义成一个函数,然后在下面的方法调用),不用一个一个去执行,只要执行releaseJar就可以生成多个版本的Jar了。
task releaseJar(type: Copy, dependsOn: makeJar) {
dependsOn makeJarPure
dependsOn makeJarIM
from('build/libs')
into('../app/libs')
include('test.jar')
include('pure.jar')
include('im.jar')
//integration version
rename('test.jar', 'xxx' + '_release.jar')
//pure version
rename('pure.jar', 'xxx' + '_release.jar')
//IM version
rename('im.jar', 'xxx' + '_release.jar')
}
网友评论