Android 多渠道打包及VasDolly使用
目录
- 1.添加productFlavors的配置
- buildConfigField
- manifestPlaceholders
- resValue
- 2.设置apk文件的名称,便于识别
- 3.添加vasdolly、添加gradle脚本(windows)
作用:一次性可以打多个apk包,名字、包名、logo等可以不相同。解决了每次发版都要手动修改代码的问题,例如:名字、logo等。
配置build.gradle(app)
1.添加productFlavors的配置
android{.....
//设置风味的维度flavorDimensions = ["release"]//productFlavors中有两套配置,huawei、oppo。productFlavors {huawei {versionCode 8versionName "1.7.33"dimension "release"applicationId "test.test.abc"resValue "string", "file_provider_name_personal", applicationId + ".provider"manifestPlaceholders = [apkName: '语文',apkIcon: '@drawable/yuwen']ndk {abiFilters "arm64-v8a"//"armeabi-v7a" , "arm64-v8a"}buildConfigField "int", "COMPANY", "1"}oppo {versionCode 7versionName "1.6.30"dimension "release"applicationId "test.test.abc"resValue "string", "file_provider_name_personal", applicationId + ".provider"manifestPlaceholders = [apkName: '数学',apkIcon: '@drawable/yuwen']ndk {abiFilters "arm64-v8a"//"armeabi-v7a" , "arm64-v8a"}buildConfigField "int", "COMPANY", "4"}}
}
buildConfigField "int", "COMPANY", "1"
buildConfigField
buildConfigField申明了一个常量,方便在代码中进行使用。
BuildConfig文件:
public final class BuildConfig {public static final int COMPANY = 1;
}
使用buildConfigField
public class MyApplication extends Application {@Overridepublic void onCreate() {Constant.URL_PROTOCOLUSE = "http://xxx.xxx.cn/api/pro.jsp?company=" + BuildConfig.COMPANY + "&apptype=" + getString(R.string.app_name);}
}
manifestPlaceholders
设置在manifest中数据
manifestPlaceholders = [apkName: '数学',apkIcon: '@drawable/yuwen']
<applicationandroid:name=".MainApplication"android:allowBackup="false"android:icon="${apkIcon}"android:label="${apkName}"></application>
resValue
声明一个在Strings.xml中的字符串。
resValue "string", "file_provider_name_personal", applicationId + ".provider"
声明后,会自动生成。
<?xml version="1.0" encoding="utf-8"?>
<resources><!-- Automatically generated file. DO NOT MODIFY --><string name="file_provider_name_personal" translatable="false">test.test.abc</string></resources>
2.设置apk文件的名称,便于识别
static def releaseTime() {SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");return formatter.format(new Date())
}
android {....applicationVariants.all { variant ->variant.outputs.all { output ->def outputFile = output.outputFiledef fileNameif (outputFile != null && outputFile.name.endsWith('.apk')) {if (variant.buildType.name.equals('release')) {//如果是release包fileName = "${productFlavors.name}-${buildType.name}-${productFlavors.versionName}-" +"${productFlavors.versionCode}-${releaseTime()}.apk"} else if (variant.buildType.name.equals('debug')) {//如果是debug包fileName = "${productFlavors.name}-${buildType.name}-${productFlavors.versionName}-" +"${productFlavors.versionCode}.apk"}outputFileName = fileName}}}
}
打出的apk,名字-包类型-版本名称-版本号
一次性打多个包,使用assemble
assemble执行完毕后,在app/build/outputs/apk中寻找。大致样子如下
3.添加vasdolly、添加gradle脚本(windows)
vasdolly使用
https://github.com/Tencent/VasDolly
在build.gradle(app)文件中加入如下
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def sdkDir = properties.getProperty("sdk.dir")
def buildToolsVersion = '33.0.1'//工具版本
def consolidatePath = "./build/consolidate/"
def storePwd = " "//keystore文件密码
def alias = " "//keystore文件alias
def keyPwd = " "//keystore文件密码def jksPath = "C:\\Users\\xxx\\Desktop\\资料\\app.keystore"//keystore文件路径
/*** 优化加签名*/
task batchSign {doLast {File consolidateDir = new File(project.buildDir, "consolidate/")consolidateDir.eachFile { apkFile ->def unsignedFileName = apkFile.getName()def lastchar = unsignedFileName.indexOf(".apk")def fileName = unsignedFileName.substring(0, lastchar)def zipalignedFileName = "${fileName}_zipaligned.apk"def signedFileName = "${fileName}_signed.apk"def buildToolsPath = "${sdkDir}\\build-tools\\${buildToolsVersion}"def command = "${buildToolsPath}\\zipalign -f -p 4 ${consolidatePath}${unsignedFileName} ${consolidatePath}${zipalignedFileName} && " +"del ${project.buildDir}\\consolidate\\${unsignedFileName} && " +"${buildToolsPath}\\apksigner sign --ks ${jksPath} --ks-pass " +"pass:${storePwd} --ks-key-alias ${alias} --key-pass pass:${keyPwd} --out " +"${consolidatePath}${signedFileName} ${consolidatePath}${zipalignedFileName} && " +"del ${project.buildDir}\\consolidate\\${zipalignedFileName} && " +"del ${project.buildDir}\\consolidate\\${fileName}_signed.apk.idsig"println(command)exec {ExecSpec execSpec ->executable 'cmd'args '/c', command}}}
}
/*
将apk优化和签名后,添加渠道
打渠道包*/
task makeChannel {def publishPath = "./build/publish/"doLast {def channels = "./channels.txt" //vasdolly的相关文件File consolidateDir = new File(project.buildDir, "consolidate/")consolidateDir.eachFile { apkFile ->def command = "java -jar D:\\android\\gitdown\\VasDolly.jar put -c ${channels} ${apkFile.getAbsolutePath()} ${publishPath}"try {exec {commandLine 'cmd', '/c', command}} catch (Exception e) {e.printStackTrace()}}}
}
task bundleAndChannel {dependsOn(batchSign)dependsOn(makeChannel)
}
编译之后面,在gradle中就会出现bundleAndChannel
准备加固、签名、渠道
在app/build/目录下,创建consolidate和publish文件。
将360加固后的apk,复制到app/build/consolidate文件中。
双击bundleAndChannel ,等待编辑,就可以了。
相关文章:

Android 多渠道打包及VasDolly使用
目录 1.添加productFlavors的配置buildConfigFieldmanifestPlaceholdersresValue 2.设置apk文件的名称,便于识别3.添加vasdolly、添加gradle脚本(windows) 作用:一次性可以打多个apk包,名字、包名、logo等可以不相同。…...

LeetCode 42题:接雨水
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,…...
spring boot 提示:程序包不存在,解决方法总结
背景: 之前出现过这样的问题,打包安装父项目就好了,今天改了一下代码,重新编译的时候,又出现了这样的情况,决定深度挖掘一下这里面的问题 spring boot 提示:程序包不存在,解决方法总…...

docker项目实战
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘 1)拉取mysql:5.6和owncloud镜像 [rootmaster ~]# docker pull mysql:5.6 5.6: Pulling from library/mysql 35b2232c987e: Pull complete fc55c00e48f2: Pull complete 0030405130e3: Pull compl…...

银行客户关系管理系统springboot财务金融进销存java jsp源代码
本项目为前几天收费帮学妹做的一个项目,Java EE JSP项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 银行客户关系管理系统springboot 系统有1权限&#x…...
Maven 插件 maven-antrun-plugin 执行 ant 脚本
Ant 相信大家都不陌生,你可以把它理解为使用 xml 格式描述的一系列命令处理工具。它是一种基于Java的build工具。理论上来说,它有些类似于(Unix)C中的make、有些类似于基于shell命令编写的sh脚本文件。Ant 用 Java 的类来扩展。&a…...

【仿写框架之仿写Tomact】四、封装HttpRequest对象(属性映射http请求报文)、HttpResponse对象(属性映射http响应报文)
文章目录 1、创建HttpRequest对象2、创建HttpResponse对象 1、创建HttpRequest对象 HttpRequest对象中的属性与HTTP协议中的内容对应,用于后序servlet从request中获取请求中的参数。 参照http请求报文: import java.io.BufferedReader; import java…...
LeetCode 41题:缺失的第一个正数
目录 题目 思路 代码 题目 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3示例 2ÿ…...
学单片机有什么用?
单片机简而言之就是一个小计算机系统,它已经应用到了我们生活中的方方面面。单片机比专用处理器适合应用于嵌入式系统,因此它得到了多的应用,事实上单片机是世界上数量多的计算机。 现代人类生活中所用的几乎每件电子和机械产品中都会集成有单…...
Go 1.21新增的 slices 包详解(二)
Go 1.21新增的 slices 包提供了很多和切片相关的函数,可以用于任何类型的切片。 slices.Delete 定义如下: func Delete[S ~[]E, E any](s S, i, j int) S 从 s 中删除元素 s[i:j],返回修改后的切片。如果 s[i:j] 不是 s 的有效切片&#…...

解决charles无法抓取localhost数据包
我们有时候在本地调试的时候,使用charles抓取向本地服务发送的请求的,发现无法抓取。 charles官方也作了相应说明: 大概意思就是 某些系统使用的是硬编码不能使用localhost进行传输,所以当我们连接到 localhost的时候,…...
基于注解优雅的实现接口幂等性
一、什么是幂等性 简单来说,就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的,听起来非常容易理解,但要真正的在系统中要始终保持这个目标,是需要很严谨的设计的,在实际的生产环境下&…...

flutter:webview_flutter和flutter_inappwebview的简单使用
前言 最近在研究如何在应用程序中嵌入Web视图,发现有两个库不错。 一个是官方维护、一个是第三方维护。因为没说特别的需求,就使用了官方库,实现一些简单功能是完全ok的 webview_flutter 不建议使用,因为效果不怎么样…...

opencv进阶09-视频处理cv2.VideoCapture示例(打开本机电脑摄像头)
视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取…...

大语言模型与语义搜索;钉钉个人版启动内测,提供多项AI服务
🦉 AI新闻 🚀 钉钉个人版启动内测,提供多项AI服务 摘要:钉钉个人版正式开始内测,面向小团队、个人用户、高校大学生等人群。该版本具有AI为核心的功能,包括文生文AI、文生图AI和角色化对话等。用户可通过…...

小程序-基于vant的Picker组件实现省市区选择
一、原因 因vant/area-data部分的市/区数据跟后台使用的高德/腾讯省市区有所出入,故须保持跟后台用同一份数据,所以考虑以下几个组件 1、Area 2、Cascader 3、Picker 因为使用的是高德地图的省市区json文件,用area的话修改结构代价太大&…...

智慧水利利用4G物联网技术实现远程监测、控制、管理
智慧水利工业路由器是集合数据采集、实时监控、远程管理的4G物联网通讯设备,能够让传统水利系统实现智能化的实时监控和远程管理。工业路由器利用4G无线网络技术,能够实时传输数据和终端信息,为水利系统的运维提供有效的支持。 智慧水利系统是…...
sql server Varchar转换为Datetime
将Varchar转换为Datetime是一个常见的需求,在处理日期和时间数据时特别有用。在SQL Server中,可以使用CONVERT函数或CAST函数将Varchar转换为Datetime。 使用CONVERT函数 CONVERT函数可以将一个值从一个类型转换为另一个类型。以下是使用CONVERT函数将…...

什么文件传输协议才能保障跨国文件传输安全又稳定
在当今的全球化时代,跨国文件传输是一种常见而又重要的需求,无论是个人还是企业,都需要通过网络来分享和交换各种类型和大小的文件。但是,跨国文件传输也面临着许多挑战和风险,如何选择一个合适的文件传输协议…...
LeetCode笔记:Weekly Contest 359
LeetCode笔记:Weekly Contest 359 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 解题思路2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-359 1. 题目一 …...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...