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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NC后端扩展开发

前言 在日常的工作中,会遇到各种各样的需要进行扩展开发的需求,可以使用系统预留的扩展开发机制来实现,避免修改源码。因NC产品已迭代至BIP版本,所以前端扩展方式就再进行不赘述了,本文主要介绍后端扩展开发方式&…

【FreeRTOS】【应用篇】消息队列【下篇】

前言 本篇文章主要对 FreeRTOS 中消息队列的概念和相关函数进行了详解消息队列【下篇】详细剖析了消息队列中发送、接收时队列消息控制块中各种指针的行为,以及几个发送消息和接收消息的函数的运作流程笔者有关于 【FreeRTOS】【应用篇】消息队列【上篇】——队列基…

redis 数据结构(二)

整数集合 整数集合是 Set 对象的底层实现之一。当一个 Set 对象只包含整数值元素,并且元素数量不时,就会使用整数集这个数据结构作为底层实现。 整数集合结构设计 整数集合本质上是一块连续内存空间,它的结构定义如下: typed…

nginx使用详解

文章目录 一、前言二、nginx使用详解2.1、nginx特点2.2 静态文件处理2.3 反向代理2.4 负载均衡2.5 高级用法2.5.1 正则表达式匹配2.5.2 重定向 三、总结 一、前言 本文将详细介绍nginx的各个功能使用,主要包括 二、nginx使用详解 2.1、nginx特点 高性能&#xff…

Unity中Shader的面剔除Cull

文章目录 前言一、Unity中Shader的面是否剔除,是由我们自己决定的二、暴露一个属性来控制 剔除模式三、如何区分正反面 前言 Unity中Shader的面剔除 Cull Off | Back | Front 一、Unity中Shader的面是否剔除,是由我们自己决定的 使用 Cull Off | Back |…

Pygame中Trivia游戏解析6-3

3.3 Trivia类的show_question()函数 Trivia类的show_question()函数的作用是显示题目。主要包括显示题目框架、显示题目内容和显示题目选项等三部分。 3.3.1 显示题目的框架 在show_question()函数中,通过以下代码显示题目的框架。 print_text(font1, 210, 5, &q…

【AI】数学基础——数理统计(概念参数估计)

概率论 文章目录 3.6 数理统计概念与定理3.6.1 概率论与数理统计区别3.6.2 基本定理大数定理马尔科夫不等式切比雪夫不等式中心极限定理 3.6.3 统计推断的基本问题 3.7 参数估计3.7.1 频率派点估计法矩阵估计法极大似然估计点估计量的评估 区间估计 3.7.2 贝叶斯派贝叶斯定理条…

Spring Boot 整合 Shiro(后端)

1 Shiro 什么是 Shiro 官网: http://shiro.apache.org/ 是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 …

【ARM CoreLink CCI-400 控制器简介】

文章目录 CCI-400 介绍 CCI-400 介绍 CCI(Cache Coherent Interconnect)是ARM 中 的Cache一致性控制器。 CCI-400 将 Interconnect 和coherency 功能结合到一个模块中。它支持多达两个ACE master 点的interface,例如: Cortex-A…

[Mac软件]Adobe After Effects 2023 v23.5 中文苹果电脑版(支持M1)

After Effects是动画图形和视觉效果的行业标准。由运动设计师、平面设计师和视频编辑用于创建复杂的动画图形和视觉上吸引人的视频。 创建动画图形 使用预设样式为文本和图形添加动画效果,或逐帧调整它们。编辑、添加深度、制作动画或转换为可编辑的路径&#xff…

【Python】pytorch,CUDA是否可用,查看显卡显存剩余容量

CUDA可用,共有 1 个GPU设备可用。 当前使用的GPU设备索引:0 当前使用的GPU设备名称:NVIDIA T1000 GPU显存总量:4.00 GB 已使用的GPU显存:0.00 GB 剩余GPU显存:4.00 GB PyTorch版本:1.10.1cu102 …

【C++】C++面向对象编程三大特性之一——继承

❤️前言 本篇博客主要是关于C面向对象编程中的三大特性之一的继承,希望大家能和我一起共同学习进步! 正文 我们刚刚学习一块全新的知识,首先简单关注一下它的概念和简单的使用方法。 继承的概念及定义 继承的概念 继承的概念:…

HDFS HA 高可用集群搭建详细图文教程

目录 一、高可用(HA)的背景知识 1.1 单点故障 1.2 如何解决单点故障 1.2.1 主备集群 1.2.2 Active、Standby 1.2.3 高可用 1.2.4 集群可用性评判标准(x 个 9) 1.3 HA 系统设计核心问题 1.3.1 脑裂问题 1.3.2 数据状…

从C++98到C++26,经历了什么?

作为一名程序员,2023年最应该关注的话题就是C的标准更新。 C标准遵循3年开发周期,并以发布年份命名。C在临发布的一年前会进入“功能冻结期(feature freeze)”,即版本开发进入半稳定状态,不再添加重大功能及…

【RPC 协议】序列化与反序列化 | lua-cjson | lua-protobuf

文章目录 RPC 协议gRPCJSON-RPC 数据序列化与反序列化lua-cjsonlua-protobuf RPC 协议 在分布式计算,远程过程调用(英语:Remote Procedure Call,缩写为 RPC)是一个计算机通信协议。该协议允许运行于一台计算机的程序调…

机器学习部分知识点总结

文章目录 基本概念N与NP泛化能力性能度量比较检验 线性回归逻辑回归神经网络 基本概念 N与NP P问题:一个问题可以在多项式(O(n^k) 的时间复杂度内解决 例如:n个数的排序(不超过O(n^2)) NP问题:一个问题的解…

Leetcode 16.07 最大数值

编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。 示例: 输入: a 1, b 2 输出: 2 我的答案: 为了找出两个数中的较大者,而不使用比较或条件语句,我们可以…

常见的几种排序算法

目录 一、插入排序 1、直接插入排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、希尔排序 2.1、排序方法 2.2、图解分析 2.3、代码实现 二、选择排序 1、直接选择排序 1.1、排序方法 1.2、图解分析 1.3、代码实现 2、堆排序 2.1、排序方法 2.2、图解分析 …

视频监控/视频汇聚/视频云存储EasyCVR平台接入国标GB协议后出现断流情况,该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。安防监控平台EasyCVR既具备传统安防视频监控的能…

优思学院|亲和图案例:寻找六西格玛的项目

什么是亲和图? 亲和图(Affinity Diagram)主要功能在於分类归纳,协助在一堆杂乱无章的资料之中,有系统的归纳出几个大类,以利后续作业。通常先利用头脑风暴(Brainstorming)方式得到大…