Android APK打包脚本

news2024/9/20 22:34:18

build.gradle版本

同目录创建config.gradle文件写入需要的信息入

在这里插入图片描述

config.gradle文件内容
ext {
/**
 * 自定义APP运行环境
 * dev: 开发
 * test: 测试
 * pro: 生产
 */
env = "pro"
/**
 * 动态参数配置,根据自己需要添加参数
 * APP_ID: 包名
 * VERSION_CODE: 版本号
 * VERSION_NAME: 版本名
 * HOST: 网络请求前缀
 */
dev = [
    APP_ID: "包名",
    APP_NAME: "(开发版)",
    VERSION_CODE: 1,
    VERSION_NAME: "1.0.0",
    HOST: "网络请求前缀"
]
pro = [
    APP_ID: "包名",
    APP_NAME: "正式包",
    VERSION_CODE: 1,
    VERSION_NAME: "1.0.0",
    HOST: "网络请求前缀",
]
//签名文件
sign = [
    STORE_FILE: "文件地址",
    STORE_PASSWORD: "密码",
    KEY_ALIAS: "秘钥名",
    KEY_PASSWORD: "秘钥密码"
	]
}

build.gradle中如何引用


使用 apply from: ‘config.gradle’ 添加脚本文件
将build.gradle文件中的相关信息替换成脚本文件的内容

def env = project.ext.env // 环境
def config = project.ext[env] // 根据环境获取配置信息
def sign = project.ext.sign
//noinspection GradleCompatible
compileSdkVersion 31
buildToolsVersion "29.0.3"

defaultConfig {
    applicationId config.APP_ID
    minSdkVersion 21
    //noinspection ExpiredTargetSdkVersion
    targetSdkVersion 29
    versionCode config.VERSION_CODE
    versionName config.VERSION_NAME

    resValue "string", "app_name", config.APP_NAME

    buildConfigField "String", "HOST", "\"${config.HOST}\""
    buildConfigField "String", "PATH", "\"${config.PATH}\""
    buildConfigField "String", "HALL_OID", "\"${config.HALL_OID}\""

    manifestPlaceholders = [FILE_PROVIDER_AUTHORITIES: config.APP_ID + ".fileProvider"]
    signingConfigs {
    release {
        storeFile file(sign.STORE_FILE)
        storePassword sign.STORE_PASSWORD
        keyAlias sign.KEY_ALIAS
        keyPassword sign.KEY_PASSWORD
        v1SigningEnabled true
        v2SigningEnabled true
    }
}

//设置打包生成的apk命名
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        applicationVariants.all { variant ->
            variant.outputs.all { output ->
                if(!variant.buildType.isDebuggable()) {
                    outputFileName = "${config.APP_NAME}_V${variant.versionName}_${new Date().format("yyyyMMddHHmm")}.apk"
                }
            }
        }
        signingConfig signingConfigs.release
    }
}

build.gradle.kts版本

创建的config.gradle文件,内容见上方config.gradle文件内容

build.gradle和build.gradle.kts的区别在于前面是常规的写法,后面是kotlin写法。

添加脚本文件

apply(from = "config.gradle")

替换内容

val env = extra["env"] as String
val config = extra[env] as Map<*, *>
val sign = extra["sign"] as Map<*, *>
namespace = config["APP_ID"] as String

compileSdk = 34

defaultConfig {
    applicationId = config["APP_ID"] as String
    minSdk = 21
    targetSdk = 34
    versionCode = config["VERSION_CODE"] as Int
    versionName = config["VERSION_NAME"] as String

    testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"

    resValue("string", "app_name", config["APP_NAME"] as String)
    buildConfigField("String", "HOST", "\"${config["HOST"] as String}\"")
    buildConfigField("String", "WEBSOCKET", "\"${config["WEBSOCKET"] as String}\"")
    buildConfigField("String", "APP_KEY", "\"${config["APP_KEY"] as String}\"")
    buildConfigField("String", "APP_SECRET", "\"${config["APP_SECRET"] as String}\"")

    manifestPlaceholders["FILE_PROVIDER_AUTHORITIES"] = applicationId + ".fileProvider"
}

signingConfigs {
    getByName("debug") {
        storeFile = file(sign["STORE_FILE"] as String)
        storePassword = sign["STORE_PASSWORD"] as String
        keyAlias = sign["KEY_ALIAS"] as String
        keyPassword = sign["KEY_PASSWORD"] as String
    }
    create("release") {
        storeFile = file(sign["STORE_FILE"] as String)
        storePassword = sign["STORE_PASSWORD"] as String
        keyAlias = sign["KEY_ALIAS"] as String
        keyPassword = sign["KEY_PASSWORD"] as String
    }
}
//编写打包生成的apk名是使用了日期个时间的类型,kotlin不像build.gradle可以直接使用需要引入相关类
//import java.text.SimpleDateFormat
//import java.util.Date

buildTypes {
    release {
        isMinifyEnabled = false
        proguardFiles(
            getDefaultProguardFile("proguard-android-optimize.txt"),
            "proguard-rules.pro"
        )
        applicationVariants.all {
            outputs.all {

                if (this is com.android.build.gradle.internal.api.ApkVariantOutputImpl)
                    outputFileName = "${config["APP_NAME"] as String}_V${config["VERSION_NAME"] as String}_${ SimpleDateFormat("yyMMdd").format(
                        Date()
                    ) }.apk"

            }
        }
    }
}

项目中使用脚本字段,先编译项目,生成BuildConfig
直接在项目中使用 BuildConfig.VERSION_CODE 获取包名或者项目版本。

其中 manifestPlaceholders = [FILE_PROVIDER_AUTHORITIES: config.APP_ID + “.fileProvider”] 创建的是FileProvider中的authorities属性

<provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${FILE_PROVIDER_AUTHORITIES}"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

项目中使用

FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", apk);

需要修改的话只需要在config.gradle脚本文件中修改相关字段并重新编译项目即可

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Ubuntu20.04】配置深度学习环境

参考 Ubuntu20.04配置深度学习环境&#xff08;全网最细最全&#xff09; NVIDIA显卡驱动安装安装CUDA 通过终端nvidia-smi查看自己能安装的最高CUDA版本&#xff0c;在官方网址下载需要的版本。安装cuDNN 在官方网址选择适配于自己安装的CUDA版本的cuDNN安装Anaconda &#x…

Logrus IT的质量评估门户如何提高游戏本地化质量:案例研究

确保高质量的游戏本地化对于全球成功至关重要&#xff0c;特别是对于玩家在设置和游戏许可证上投入巨资的AAA和AA游戏。这些球员往往要求苛刻&#xff0c;一丝不苟。尽管客户公司通过严格控制配音人才的选拔、录音质量等&#xff0c;尽最大努力在所有语言中保持高标准&#xff…

Superset 连接elasticsearch

官方文档 https://superset.apache.org/docs/databases/elasticsearch/ 安装elasticsearch-dbapi库 pip install elasticsearch-dbapi 安装成功后 有账号密码填入&#xff1a; elasticsearchhttp://{user}:{password}{host}:9200/

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM

时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 文章目录 前言时序分解预测|基于变分模态分解VMD双向长短期记忆网络BiLSTM的单变量时间序列预测Matalb程序VMD-BiLSTM 一、VMD-BiLSTM模型VMD-BiLSTM模型详细原理和流程1. …

顺序表和链表知识点

1 顺序表 顺序表是指用一段物理地址连续的空间去存储数据的线性结构。 顺序表有两种&#xff1a;静态顺序表&#xff0c;动态顺序表。 1.1 静态顺序表结构体定义 typedef int ElemDataSL;typedef struct SequeList {ElemDataSL arr[100];int size; }SL; 静态顺序表在创建结构体…

c++11的学习

1.初始化列表 在C98中&#xff0c;标准允许使用花括号{}对数组或者结构体元素进行统一的列表初始值设定。 struct Fun {int x;int y; }; struct Date {Date(int _year, int _month, int _day):year( _year),month(_month),day(_day){}int year 2005;int month 01;int day …

【unity实战】Cinemachine虚拟相机+Character Controller实现俯视角、第三人称角色控制,复制粘贴即用

最终效果 文章目录 最终效果一、前言二、Character Controller参数介绍三、添加虚拟相机四、2.5D俯视角人物操作五、自带重力的SimpleMove 移动六、第三人称角色控制1、移动2、添加重力3、 加地面检测&#xff0c;限制在地面重力不要累加3.1、自定义球形区域检测3.2、使用isGro…

MMGPL: 基于图提示学习的多模态医学数据分析 文献速递-大模型与多模态诊断阿尔茨海默症与帕金森疾病应用

Title 题目 MMGPL: Multimodal Medical Data Analysis with Graph Prompt Learning MMGPL: 基于图提示学习的多模态医学数据分析 01 文献速递介绍 神经系统疾病&#xff0c;包括自闭症谱系障碍&#xff08;ASD&#xff09;&#xff08;Lord 等&#xff0c;2018&#xff09…

Socket【网络】

文章目录 源端口号和目的端口号端口号&&进程pid TCP协议和UDP协议网络字节序socket 接口sockaddrsocket代码 源端口号和目的端口号 端口号&#xff1a; 端口号是传输层协议的内容。端口号是一个2字节16位的整数。端口号用来标识一个进程&#xff0c;告诉操作系统&…

【SpringCloud应用框架】GateWay网关

Spring Cloud Alibaba 之初识GateWay网关 文章目录 一、网关介绍二、网关对比三、GateWay基本概念&#xff1a;执行流程&#xff1a; 总结 一、网关介绍 在微服务架构中&#xff0c;一个系统会被拆分为多个微服务。如果没有网关存在&#xff0c;我们只能在客户端记录梅哥为服务…

Windows下创建FTP服务器,实现文件共享

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 创建FTP服务器 在【启用和关闭 Windows 功能】中选中【FTP服务】【IIS管理控制台】 应用更改完成后&#xff0c;重启电脑。 执行 ipconfig 命令查看当前电脑…

LeetCode刷题:3.无重复字符的最长子串

问题&#xff1a;首先分析问题得出需求 1.要求得到一个唯一最长子串的序列的长度。 子串&#xff1a;依据其形式是拥有一段长度的&#xff0c;所以考虑滑动窗口 唯一&#xff1a;考虑使用HashSet 需求描述&#xff1a;要求得到滑动窗口的大小&#xff0c;也就是左右指针的距离&…

STC89C52 串口浅谈

文章目录 1. 串口1.1 串口概述1.2 串口相关概念1.3 UART1.4 STC89C52串口1.4.1 串口相关寄存器1.4.2 串口模式图 1.5 串口配置简单代码示例1.5.1 UART串口初始化1.5.2 串口中断函数模板 1. 串口 1.1 串口概述 串口&#xff08;serial&#xff09;是一种通讯接口&#xff0c;可…

如何在Mac电脑上本地部署Stable Diffusion:详细教程(webUI)

Stable Diffusion是一款强大的AI生成图像模型&#xff0c;它可以基于文本描述生成高质量的图像。对于想要在本地运行此模型的用户来说&#xff0c;使用Mac电脑部署Stable Diffusion是一个非常吸引人的选择&#xff0c;特别是对于M1或M2芯片的用户。本文将详细介绍如何在Mac上本…

【图像去噪】论文精读:Spatial-Adaptive Network for Single Image Denoising(SADNet)

请先看【专栏介绍文章】&#xff1a;【图像去噪&#xff08;Image Denoising&#xff09;】关于【图像去噪】专栏的相关说明&#xff0c;包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总&#xff08;更新中…

数据结构(邓俊辉)学习笔记】串 15——BM_GS算法:综合性能

1.BM之性能 接下来&#xff0c;针对已经综合了 bc 和 gs 两种策略的 BM 算法&#xff0c;标定它对应的复杂度&#xff0c;并将这种算法与此前的 KMP 以及蛮力算法在性能上做一个综合的对比分析。 首先是 BM 算法本身的性能。 在空间方面&#xff0c;除了模式串和文本串本身&a…

Qt:玩转QPainter序列十

前言 最后的一个解读QPainter源码的系列&#xff0c;剩下的源码全部都是内联函数&#xff0c;自己看看就好。 正文 渲染相关 void setRenderHint(RenderHint hint, bool on true); 功能: 启用或禁用特定的渲染提示。参数: hint&#xff1a;指定要设置的渲染提示&#xff0c;…

基于Leaflet Legend的图例数据筛选实践-以某市教培时空分布为例

目录 前言 一、关于Leaflet.Legend组件 1、Legend组件的主要参数 2、相关参数 二、Legend图例可视化控制 1、违规教培信息的管理 2、违规培训信息时空可视化及图例渲染控制 3、成果展示 三、总结 前言 在很多的地理时空分析系统中&#xff0c;我们经常会遇到一些需求。…

运维-3.分库分表

分库分表 1.介绍2.Mycat概述3.Mycat入门4.Mycat配置4.1 schema.xml4.1.1 schema标签4.1.2 dataNode标签4.1.3 dataHost标签 4.2 rule.xml4.3 server.xml4.3.1 system标签4.3.2 user标签 5.Mycat分片5.1 垂直拆分5.2 水平拆分5.3 分片规则5.3.1 范围分片5.3.2 取模分片5.3.3 一致…

若依微服务Admin控制台不显示ruoyi-file问题解决

本地启动完若依微服务,发现Admin控制台只显示了6个服务,其中ruoyi-file启动成功,但是没有在Admin控制台中显示处理,本章问题,给出这个问题的解决办法。 一、什么是服务监控 监视当前系统应用状态、内存、线程、堆栈、日志等等相关信息,主要目的在服务出现问题或者快要出…