android 实现本地一键打包,告别繁琐的studio操作

前言

在实际开发项目中,我们的工程目录往往是多个app在一个工程下的,每次打包都需要手动的用studio点击Build->Generate Signed Bundle or APK->APK 选择app,签名等,甚至有的app签名还不一样,还需要手动的来回切换,非常麻烦。所以,我就考虑采用多渠道打包+shell脚本的方式,来实现一行命令打包。

先来看看我的工程目录结构,有11个app,且签名还不一样。用android studio打包,操作非常繁琐。

android 实现本地一键打包,告别繁琐的studio操作_第1张图片

然后最终实现的效果是:

在git bash 里面输入 sh package.sh 

android 实现本地一键打包,告别繁琐的studio操作_第2张图片

android 实现本地一键打包,告别繁琐的studio操作_第3张图片

或者是指定输出目录:

android 实现本地一键打包,告别繁琐的studio操作_第4张图片

android 实现本地一键打包,告别繁琐的studio操作_第5张图片

下面我们来看看实现过程:

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中运行脚本,苹果用户可以直接在命令窗口运行脚本

单个程序的打包和上面的一键打包是一样的,这里就不再详说了。

你可能感兴趣的:(android)