Android 多渠道打包及VasDolly使用

news2024/11/26 11:38:38

目录

    • 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 8
            versionName "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 7
            versionName "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 {

    @Override
    public 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'
            ]
 <application
        android: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.outputFile
            def fileName
            if (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 ,等待编辑,就可以了。
在这里插入图片描述

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

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

相关文章

掌控未知:项目中如何巧妙应对突发与紧急

引言 在项目管理的领域中&#xff0c;每一个项目都伴随着一系列的不确定性和挑战。这些不确定性可能源于外部环境的变化、团队内部的动态或技术的快速迭代。而在这些不确定性中&#xff0c;突发和紧急事件尤为考验项目经理的应变能力和决策智慧。那么&#xff0c;如何在项目中…

【排排站:探索数据结构中的队列奇象】

本章重点 队列的概念及结构 队列的实现方式 链表方式实现栈接口 队列面试题 一、队列的概念及结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#x…

休息刷一下周赛

7004.判断字母缩略词&#xff08;字符串&#xff09; 思路&#xff1a;1.判断字符串个数是否跟缩略词长度相同 2.定位比较 class Solution { public:bool isAcronym(vector<string>& words, string s) {int nwords.size();if(n!s.size()) return false;for(int i0…

solidworks(3)

两个方法 sr&#xff1a;代表半径&#xff08;画图时记得换成直径&#xff09;

700. 二叉搜索树中的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3], val 2 输出&#xff1a;[2,1,3]…

窗口看门狗

从下往上看: 1. 时钟设置 RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);//使能独立看门狗时钟 WWDG_SetPrescaler(WWDG_Prescaler_8);//看门狗预分频器WWDG counter clock (PCLK1/4096)/8 2.设置窗口值 实际就是设置WWDG_CR的低七位值, 但是这个值要大于0x40(也就是…

Docker容器:docker镜像的创建及dockerfile案例

文章目录 一.docker镜像的三种创建方法1.基于现有镜像创建1.1 启动镜像1.2 生成新镜像 2.基于本地模板创建2.1 OPENVZ 下载模板2.2 导入容器生成镜像 3.基于dockerfile创建3.1 dockerfile结构及分层3.2 联合文件系统3.3 docker镜像加载原理及过程 4.dockerfile操作常用的指令4.…

16.ingress

文章目录 ingress外部访问externalIP组成Ingress-Nginx部署 nginx-ingress-controllerDaemonSetHostNetwork创建 ingress控制器创建ingress资源 DeploymentNodePort模式Ingress HTTPS 代理访问生成证书和私钥创建secret资源创建Ingress资源 Nginx 进行 BasicAuthnginx进行重写总…

18----注释

本节是markdown教程的最后一节&#xff0c;也是最简单的一节----注释。 我们常见的注释可能是这样的&#xff1a; 也可能是这样的&#xff1a; 注释无处不在&#xff0c;就让我们抱着一丝期待&#xff0c;来看看markdown的注释吧&#xff01; 一、基本用法&#xff1a; Ma…

深入AQS原理(我在一开始学的时候就把非公平锁和公平锁给弄混了)

谈到并发&#xff0c;我们不得不说AQS(AbstractQueuedSynchronizer)&#xff0c;所谓的AQS即是抽象的队列式的同步器&#xff0c;内部定义了很多锁相关的方法&#xff0c;我们熟知的ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore等都是基于AQS来实现的。 …

13.实现业务功能--板块信息

目录 获取在首页中显示的版块 1. 实现逻辑 2. 创建扩展 Mapper.xml 3. 修改 DAO 4. 创建 Service 接口 5. 实现 Service 接口 6. 生成测试方法 7. 实现 Controller 8. 实现前端页面 在数据库中执行以下 SQL 语句&#xff1a; INSERT INTO t_board (id, name, article…

Dockerfile制作Web应用系统nginx镜像

目录 1.所需实现的具体内容 2.编写Dockerfile Dockerfile文件内容&#xff1a; 默认网页内容&#xff1a; 3.构建镜像 4.现在我们运行一个容器&#xff0c;查看我们的网页是否可访问 5.现在再将我们的镜像打包并上传到镜像仓库 1.所需实现的具体内容 基于centos基础镜像…

GAN:对抗生成网络,前向传播和后巷传播的区别

目录 GAN&#xff1a;对抗生成网络 损失函数 判别器开始波动很大&#xff0c;先调整判别器 生成样本和真实样本的统一&#xff1a;真假难辨​编辑 文字专图片​编辑 头像转表情包​编辑 头像转3D​编辑 后向传播 1. 前向传播&#xff08;forward&#xff09; 2. 反向传播&…

自我管理篇--“90%的简历会被刷掉”这个现象背后的原因

以上简历模板资源的排版可能不是最优&#xff0c;但工作经历可以借鉴 文章目录 一、简历问题出在什么地方二、如何提升简历的质量三、如何避免常见的简历错误四、如何让你的简历脱颖而出五、如何准备面试 为什么90%的简历会被淘汰 在当今竞争激烈的就业市场中&#xff0c;求职者…

OCR扫描仪应该怎么选?

选择OCR扫描仪时&#xff0c;以下几个因素需要考虑&#xff1a; 1. 扫描质量&#xff1a;确保选购的OCR扫描仪能够提供高质量的扫描结果。关注分辨率&#xff08;通常以dpi表示&#xff09;&#xff0c;辨识度和颜色深度等技术指标&#xff0c;以满足您的需求。 2. 扫描速度&a…

电脑报错vcomp100.dll丢失怎样修复?这三个方法可以解决

vcomp100.dll是微软Visual C 2005 Redistributable Package的一部分&#xff0c;它包含了运行某些程序所需的C运行时库。当电脑中的vcomp100.dll文件丢失或损坏时&#xff0c;可能会导致一些程序无法正常运行&#xff0c;甚至出现系统崩溃等问题。 那么&#xff0c;当遇到这样的…

openpnp - 自动换刀的设置

文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…

Laravel 框架构造器的排序分组.子查询 JOIN 查询 构造器的增删改 ⑦

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; THINK PHP &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

go1.21.0.windows-amd64.msi

go1.21.0.windows-amd64.msi Windows 10 or greater required.

漏洞指呗-VluFocus靶场专栏-番外篇

漏洞指呗-VluFocus靶场专栏-番外篇奇技淫巧 &#x1f338;struts2漏洞扫描工具&#x1f338;step1 修改ip和端口step2 验证漏洞是否存在step3 执行cmd命令&#xff0c;获取flag &#x1f338;Goby插件工具headshot&#x1f338;step1 输入ip和端口 检测step2 cmd 输入指令 &…