当前位置: 首页 > news >正文

Android APK打包脚本

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_IDminSdkVersion 21//noinspection ExpiredTargetSdkVersiontargetSdkVersion 29versionCode config.VERSION_CODEversionName config.VERSION_NAMEresValue "string", "app_name", config.APP_NAMEbuildConfigField "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_PASSWORDkeyAlias sign.KEY_ALIASkeyPassword sign.KEY_PASSWORDv1SigningEnabled truev2SigningEnabled true}
}//设置打包生成的apk命名
buildTypes {release {minifyEnabled falseproguardFiles 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 StringcompileSdk = 34defaultConfig {applicationId = config["APP_ID"] as StringminSdk = 21targetSdk = 34versionCode = config["VERSION_CODE"] as IntversionName = config["VERSION_NAME"] as StringtestInstrumentationRunner = "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 StringkeyAlias = sign["KEY_ALIAS"] as StringkeyPassword = sign["KEY_PASSWORD"] as String}create("release") {storeFile = file(sign["STORE_FILE"] as String)storePassword = sign["STORE_PASSWORD"] as StringkeyAlias = sign["KEY_ALIAS"] as StringkeyPassword = sign["KEY_PASSWORD"] as String}
}
//编写打包生成的apk名是使用了日期个时间的类型,kotlin不像build.gradle可以直接使用需要引入相关类
//import java.text.SimpleDateFormat
//import java.util.DatebuildTypes {release {isMinifyEnabled = falseproguardFiles(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属性

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

项目中使用

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JavaScript练习(二)
  • TCP数据包——报文头部组成
  • golang zap日志模块封装sentry
  • 【 html+css 绚丽Loading 】 000027 旋风破云扇
  • C++学习,指针空指针
  • 万亿低空经济:无人机飞手考证正当时
  • ArcGIS栅格裁剪与合并,制作等高线
  • 使用对象池优化 C++ 程序性能的实用指南
  • 虚幻引擎(Unreal Engine)技术使得《黑神话悟空传》大火,现在重视C++的开始吃香了,JAVA,Go,Unity都不能和C++相媲美!
  • 使用 ip route 命令配置 Linux 路由表的详细指南
  • java基础之 静态代码块、实例代码块、构造方法执行顺序问题
  • udp可靠传输中ACK与NACK的选择
  • 用 CSS 实现太阳系运行效果
  • REGTR: End-to-end Point Cloud Correspondences with Transformers 论文解读
  • 解题-写一个程序判断当前机器的大小端存储模式 #两种方法
  • 自己简单写的 事件订阅机制
  • C++回声服务器_9-epoll边缘触发模式版本服务器
  • JavaScript实现分页效果
  • Python - 闭包Closure
  • SAP云平台里Global Account和Sub Account的关系
  • SQLServer之索引简介
  • TypeScript实现数据结构(一)栈,队列,链表
  • 大型网站性能监测、分析与优化常见问题QA
  • 精彩代码 vue.js
  • 前端攻城师
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 世界上最简单的无等待算法(getAndIncrement)
  • 新书推荐|Windows黑客编程技术详解
  • 用Canvas画一棵二叉树
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 阿里云移动端播放器高级功能介绍
  • ###STL(标准模板库)
  • #14vue3生成表单并跳转到外部地址的方式
  • (0)Nginx 功能特性
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (13)DroneCAN 适配器节点(一)
  • (Java入门)抽象类,接口,内部类
  • (八十八)VFL语言初步 - 实现布局
  • (二)windows配置JDK环境
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (四)React组件、useState、组件样式
  • **python多态
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .gitignore文件---让git自动忽略指定文件
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net 知识杂记
  • .net8.0与halcon编程环境构建
  • .Net转前端开发-启航篇,如何定制博客园主题
  • []sim300 GPRS数据收发程序
  • [12] 使用 CUDA 进行图像处理