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

前言

在实际开发项目中,我们的工程目录往往是多个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中运行脚本,苹果用户可以直接在命令窗口运行脚本

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/98433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【esp32】解决以太网+mqtt堆栈溢出问题 报错 no mem for receive buffer

本文主要记录了 esp32 + 以太网 +mqtt 功能时遇到的堆栈溢出的情况,千里之堤毁于蚁穴,开发过程的不细心导致多付出了一天多的时间,记录于此,共勉 📋 个人简介 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎📝 个人主页:欢迎访问我的 Ethernet_Comm 博…

小游戏分发平台如何以技术拓流?

2023年,小游戏的发展将受到多方面的影响,例如新技术的引入、参与小游戏的新玩家以及游戏市场的激烈竞争等。首先,新技术如虚拟现实(VR)、增强现实(AR)和机器人技术都可以带来新颖的游戏体验。其…

【Qt学习】10 利用QSharedMemory实现单例运行

问题 让应用程序只有一个运行实例 QSharedMemory除了可以完成进程间通信,还可以实现应用程序单例化。 解法 首先,看看QSharedMemory的几个函数: 1、QSharedMemory(const QString &key, QObject *parent Q_NULLPTR)构造函数 该构造函数…

大模型综述论文笔记6-15

这里写自定义目录标题 KeywordsBackgroud for LLMsTechnical Evolution of GPT-series ModelsResearch of OpenAI on LLMs can be roughly divided into the following stagesEarly ExplorationsCapacity LeapCapacity EnhancementThe Milestones of Language Models Resources…

OPENCV实现计算描述子

1、计算描述子 kp,des = sift.computer(img,kp) 2、其作用是进行特征匹配 3、同时计算关键点和描述 3.1、kp,des = sift.detectAnd Computer(img,...)

Mysql表关联简单介绍(inner join、left join、right join、full join不支持、笛卡尔积)

文章目录 0. 交集、并集、差集含义说明1. 简单演示上图七种情况0. A、B表数据准备1. left outer join 简称 left join 左表所有数据,右表关联数据,没有的以null填充2. right outer join 简称 right join,右表所有数据,左表关联数据…

接口测试json入参,不同类型参数格式书写

接口json入参,不同类型参数格式 1、String 入参:A(String),B(String) 格式:{"A":"值a","B":"值b"} 示例: 接口测试入参这么…

UE 5 实现骨骼物理模拟 乳摇

打开角色的物理资产,如果是下载的或者官方的模型,都会内带物理资产 模拟 可以根据分块模拟当前物体的物理效果 点击右上角的模拟,可以模拟布娃娃系统 Ctrl鼠标右键可以实现对布娃娃施加力的效果。 模拟选中项 模拟选中项可以只模拟一部…

为什么聊天头像ChatGPT是橙色的?

目录 ChatGPT的不同版本及其颜色 了解绿色和橙色的ChatGPT徽标 颜色变化的重要性 橙色标志的原因 故障排除和常见问题解答 常见问题3:如何查看ChatGPT的服务器状态? 常见问题4:如果使用ChatGPT时遇到错误,我该怎么办&#…

linux刻录iso到u盘

需要的工具:Linux系统、U盘、ISO镜像文件。 首先在Linux系统中打开终端,使用dd命令,格式如下: sudo dd ifxxx.iso of/dev/sdb 命令中xxx.iso是你的ISO镜像文件的路径,of后面的你的U盘路径,一般就是/dev/sdb…

说说FLINK细粒度滑动窗口如何处理

分析&回答 Flink的窗口机制是其底层核心之一,也是高效流处理的关键。Flink窗口分配的基类是WindowAssigner抽象类,下面的类图示出了Flink能够提供的所有窗口类型。 Flink窗口分为滚动(tumbling)、滑动(sliding&am…

unity界面上Global 与Local xyz- right up forward

gloabal 如果要沿这个方向移动就比较困难 local下就不一样了

对于需要进行商品价格监控的企业来说,使用淘宝API是一种有效的途径

淘宝是一个广泛使用的在线购物平台,其API可以用于获取各种商品的价格数据。对于需要进行商品价格监控的企业来说,使用淘宝API是一种有效的途径。 以下是使用淘宝API进行商品价格监控的几个步骤: 获取API密钥 在使用淘宝API之前&#xff0c…

Springboot 接口方式硬通知实现 动态刷新配置值,@ConfigurationProperties 、@Value 都可以

前言 看到这个文章标题,也许有的看官就觉得很多余, 因为Nacos 可以设置 NacosValue(value "${XXX}",autoRefreshed true) 实现动态刷新; 又因为cloud config的RefreshScope 实现动态刷新; 还有阿波罗...等 这…

【C++】VS配置OpenCV/Libtorch环境

前言 本文是视频https://www.bilibili.com/video/BV1dp4y177L4的笔记。 OpenCV和Libtorch安装包:https://pan.baidu.com/s/1i3DqTcHFSC1rRDsIgYGCsQ?pwd8888 VS版本:2019 Opencv版本:3.4.1 Libtorch版本:2.0.1cu117 配置Open…

TCP之三次握手四次挥手

在前面的文章中我们了解到http是基于TCP/IP协议的,这篇文章我们来了解一下TCP/IP。 一、TCP与UDP 1、UDP 基于非连接。类似于写信,不能保证对方能不能接收到,接收到的内容是否完整,顺序是否正确。 优缺点:性能损耗小…

el-select实现懒加载

先看一个线上的演示示例:https://code.juejin.cn/pen/7273352811440504889 背景 我们在实际开发中经常遇到这样的需求: el-select实现懒加载,用通俗的话说,为了增加响应速度,就是初始下拉只展示50条数据&#xff0c…

excel 分组排序

excel中会遇到对不同分组数据进行排序,比如对于不同班级里的学生按照分数高低进行升序排序,可以采用如下公式 SUMPRODUCT((A$2:A$12A2)*(C$2:C$12>C2))1 如果需要 进行降序排序,将公式中的大于号替换为小于号即可

Unity UI与粒子 层级问题Camera depth Sorting Layer Order in Layer RenderQueue

Unity游戏开发中,模型、界面、特效等,需要规划好layer的概念,涉及到摄像机(Camera)、画布(Canvas)、Shader等相关内容。 在 Unity 中,渲染顺序是由多个因素共同决定的,大…

【暴力DP】2021 icpc上海 I

Problem - I - Codeforces 题意: 思路: 考虑暴力DP即可 设 dp[i][j][k]表示 前 i 个物品,已经翻倍了 j 次,A点数 - B点数为 k 的最大价值和 然后分为这6种决策分类讨论就好了 注意数组里不能有负数,要加个偏移量 P…