前言
在实际开发项目中,我们的工程目录往往是多个app在一个工程下的,每次打包都需要手动的用studio点击Build->Generate Signed Bundle or APK->APK 选择app,签名等,甚至有的app签名还不一样,还需要手动的来回切换,非常麻烦。所以,我就考虑采用多渠道打包+shell脚本的方式,来实现一行命令打包。
先来看看我的工程目录结构,有11个app,且签名还不一样。用android studio打包,操作非常繁琐。
然后最终实现的效果是:
在git bash 里面输入 sh package.sh
或者是指定输出目录:
下面我们来看看实现过程:
1,配置groovy脚本
在app下的build.gradle 里面配置如下:
plugins {
id 'com.android.application'
}
android {
namespace 'com.yuanzhen.packageapplication'
compileSdk 33
defaultConfig {
applicationId "com.yuanzhen.packageapplication"
minSdk 24
targetSdk 33
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
flavorDimensions "pack" //配置多渠道
}
productFlavors {
test1 {
applicationId "com.yuanzhen.packageapplication"
dimension "pack"
manifestPlaceholders = [appName: "packageapplication"]
}
}
signingConfigs {
release {
storeFile file("keystore/release.jks")
storePassword '123456'
keyAlias 'code'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
debug {
storeFile file("keystore/debug.jks")
storePassword '123456'
keyAlias 'code'
keyPassword '123456'
v1SigningEnabled true
v2SigningEnabled true
}
}
buildTypes {
release {
buildConfigField("boolean", "API_DEBUG", "false")
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField("boolean", "API_DEBUG", "true")
minifyEnabled false
signingConfig signingConfigs.debug
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
applicationVariants.all {
def buildType = it.buildType.name
if(buildType =="release"){
if(project.hasProperty('OUT_PUT_PATH')){//自定义输出路径
it.getPackageApplication().outputDirectory = new File("${OUT_PUT_PATH}")
}else {//as工具默认的路径
it.getPackageApplication().outputDirectory = new File(project.rootDir.absolutePath+ "/output_apk")
}
}
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
其他app配置和上面相同,根据实际情况自己调整
从上面的配置情况,我们可以知道,使用命令
gradle assembletest1Release -POUT_PUT_PATH=D:/out_apk
可以将packageapplication这个应用打包出来
2,配置gradle环境变量
这个就不多说了,不会的可以百度
3,编写shell脚本
新建一个package.sh脚本放在项目根目录下
shell 脚本有不熟悉的可以参考Android需要掌握的shell脚本基础
package.sh如下:
echo 开始clean
gradle clean
echo clean结束
if [ ! -n "$1" ] ;then
echo 开始app1打包
gradle assembletest1Release -POUT_PUT_PATH=D:/out_apk
echo app1打包完成
echo 开始app2打包
gradle assembletest2Release -POUT_PUT_PATH=D:/out_apk
echo app2打包完成
echo 开始app3打包
gradle assembletest3Release -POUT_PUT_PATH=D:/out_apk
echo app3打包完成
echo 全部打包完成 请在D:/out_apk查看打包内容
else
echo 开始app1打包
gradle assembletest1Release -POUT_PUT_PATH=$1
echo app1打包完成
echo 开始app2打包
gradle assembletest2Release -POUT_PUT_PATH=$1
echo app2打包完成
echo 开始app3打包
gradle assembletest3Release -POUT_PUT_PATH=$1
echo app3打包完成
echo 全部打包完成 请在$1查看打包内容
fi
4,打包
因为Linux中sh是链接到bash上的,所以sh与bash在功能上是没有区别的,相当于bash解析器是sh的增强版本,所以Windows用户可以在 git bash中运行脚本,苹果用户可以直接在命令窗口运行脚本
单个程序的打包和上面的一键打包是一样的,这里就不再详说了。