前言
在实际开发项目中,我们的工程目录往往是多个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 33defaultConfig {applicationId "com.yuanzhen.packageapplication"minSdk 24targetSdk 33versionCode 1versionName "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 truev2SigningEnabled true}debug {storeFile file("keystore/debug.jks")storePassword '123456'keyAlias 'code'keyPassword '123456'v1SigningEnabled truev2SigningEnabled true}}buildTypes {release {buildConfigField("boolean", "API_DEBUG", "false")minifyEnabled falsesigningConfig signingConfigs.releaseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}debug {buildConfigField("boolean", "API_DEBUG", "true")minifyEnabled falsesigningConfig signingConfigs.debugproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}applicationVariants.all {def buildType = it.buildType.nameif(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_8targetCompatibility 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 开始cleangradle cleanecho 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中运行脚本,苹果用户可以直接在命令窗口运行脚本
单个程序的打包和上面的一键打包是一样的,这里就不再详说了。