服务端apk打包教程

这篇具有很好参考价值的文章主要介绍了服务端apk打包教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文我将给大家介绍一个 apk 打包工具 VasDolly 的使用介绍、原理以及如何在服务端接入 VasDolly 进行服务端打渠道包操作。

使用介绍

VasDolly 是一个快速多渠道打包工具,同时支持基于 V1 和 V2 签名进行多渠道打包。插件本身会自动检测 Apk 使用的签名类别,并选择合适的多渠道打包方式,对使用者来说完全透明。

项目地址:https://github.com/Tencent/VasDolly

项目构建方式:gradle

VasDolly 官方对于 VasDolly 的定位是安卓端多渠道打包工具,由安卓开发接入安卓项目中使用。VasDolly 官方还提供了 jar 包工具通过命令行方式进行打包操作。

在安卓项目中要使用 VasDolly,你需要先在你的项目中添加对 VasDolly 插件和 helper 类库的依赖。具体步骤如下:

  • 在根工程的 build.gradle 中,添加对打包插件的依赖:
dependencies {
    classpath 'com.android.tools.build:gradle:7.0.3'classpath 'com.tencent.vasdolly:plugin:3.0.6'
}
  • 在主 App 工程的 build.gradle 中,添加对 VasDolly 插件的引用:
apply plugin: 'com.tencent.vasdolly'
  • 在主 App 工程的 build.gradle 中,添加读取渠道信息的 helper 类库依赖:
dependencies {
    api 'com.tencent.vasdolly:helper:3.0.6'
}
  • 配置渠道列表。你可以通过两种方式配置渠道列表,一种是在 gradle.properties 文件中指定渠道文件名称,该渠道文件必须位于根工程目录下,一行一个渠道信息。例如:
channel_file=channel.txt

其中 channel.txt 文件内容如下:

yingyongbao
gamecenter
xiaomi
huawei
oppo
vivo

另一种方式是在 channel 或者 rebuildChannel 属性中通过 channelFile 属性指定渠道文件,一行一个渠道信息。例如:

channel {
    //指定渠道文件
    channelFile = file("/Users/leon/Downloads/testChannel.txt")
}
  • 通过 Gradle 生成多渠道包。你可以选择直接编译生成多渠道包,或者根据已有基础包重新生成多渠道包。
    如果你选择直接编译生成多渠道包,你需要配置渠道文件、渠道包的输出目录和渠道包的命名规则。例如:
channel {
    //指定渠道文件
    channelFile = file("/Users/leon/Downloads/testChannel.txt")
    //多渠道包的输出目录,默认为new File (project.buildDir,"channel")
    outputDir = new File(project.buildDir,"xxx")
    //多渠道包的命名规则,默认为:$ {appName}-$ {versionName}-$ {versionCode}-$ {flavorName}-$ {buildType}-$ {buildTime}
    apkNameFormat ='$ {appName}-$ {versionName}-$ {versionCode}-$ {flavorName}-$ {buildType}'//快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)
    fastMode = false//buildTime的时间格式,默认格式:yyyyMMdd-HHmmss
    buildTimeDateFormat = 'yyyyMMdd-HH:mm:ss'//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式
    lowMemory = false
}

然后,通过 gradle channelDebug 或 gradle channelRelease 命令分别生成 Debug 和 Release 的多渠道包。
如果你选择根据已有基础包重新生成多渠道包,你需要配置渠道文件、基础包的路径和渠道包的输出目录。例如:

rebuildChannel {
    //指定渠道文件
    channelFile = file("/Users/leon/Downloads/testReChannel.txt")
    // 已有APK文件地址(必填),如new File (project.rootDir, "/baseApk/app_base.apk"),文件名中的base将被替换为渠道名
    baseApk = new File (project.rootDir, "/baseApk/app_base.apk")
    //默认为new File (project.buildDir, "rebuildChannel")
    outputDir = new File(project.buildDir,"yyy")
    //快速模式:生成渠道包时不进行校验(速度可以提升10倍以上,默认为false)
    fastMode = false//低内存模式(仅针对V2签名,默认为false):只把签名块、中央目录和EOCD读取到内存,不把最大头的内容块读取到内存,在手机上合成APK时,可以使用该模式
    lowMemory = false
}

然后,通过 gradle rebuildChannel 命令生成多渠道包。

原理

VasDolly 实现原理官方讲解地址:https://github.com/Tencent/VasDolly/wiki/VasDolly实现原理

VasDolly 的原理是利用 APK 文件的特殊结构,将渠道信息写入到 APK 文件的空白区域,从而实现无损的多渠道打包。具体来说,VasDolly 根据 APK 文件使用的签名类别,选择不同的多渠道打包方式。

如果 APK 文件使用的是 V1 签名,那么 VasDolly 会将渠道信息写入到 APK 文件的 Zip Comment 区域。Zip Comment 是 Zip 文件格式中的一个字段,用于存储一些注释信息,通常不会被解压缩工具或者系统解析。因此,将渠道信息写入到 Zip Comment 区域,不会影响 APK 文件的完整性和安全性。同时,由于 Zip Comment 区域位于 APK 文件的末尾,所以写入渠道信息的速度非常快,只需要修改一个字节的偏移量即可。

如果 APK 文件使用的是 V2 或者 V3 签名,那么 VasDolly 会将渠道信息写入到 APK Signing Block 区域。APK Signing Block 是 V2 或者 V3 签名引入的一个新区域,用于存储签名相关的数据。每个数据都有一个 ID 来标识其类型,例如 0x7109871a 表示 V2 签名数据。VasDolly 会使用一个自定义的 ID(0x71777777)来标识渠道信息,并将其写入到 APK Signing Block 区域。由于这个区域不会被系统解析,所以不会影响 APK 文件的安全性。同时,由于这个区域位于中央目录和 EOCD 之前,所以写入渠道信息的速度也很快,只需要修改两个字节的偏移量即可。

通过这种方式,VasDolly 可以实现在不重新签名和对齐的情况下,快速生成多个渠道包。在应用运行时,可以通过 VasDolly 提供的 helper 类库来读取渠道信息,并进行相应的处理。

服务端接入 VasDolly 教程

安卓接入了 VasDolly 之后,就该我们服务端出手了,服务端如果能实现渠道打包的操作,运营每次上新渠道就不需要再找安卓进行新渠道打包,运营直接在后台上传母包,选定渠道后即可获取对应的渠道包,可以节约大家的时间,避免耗费人力在渠道打包这一步。由此可见,服务端进行渠道打包操作还是有必要的。

意外发现

一开始我是想用官方提供的 jar 包工具,通过命令行调用的方式来实现服务端打渠道包的,官方提供的 readme 文档如下,

但是由于博主项目是使用容器环境部署,要是用命令行打包的话,需要引入 VasDolly jar 包并且挂载都容器中,感觉比较麻烦。就想能不能直接引入 VasDolly 依赖来实现打包操作。

于是我在 maven 中央仓库搜索了 com.tencent.vasdolly 关键字后,有了如下发现,

可以看到 VasDolly 虽然是一个 Gradle 项目,但是官方也提供了部分模块的在 Maven 中的 pom 坐标。

查看 VasDolly 仓库代码,发现官方定义了 write 模块,

进入其中,发现了 readme 内容如下,

Ok,到这里,我们发现其实官方提供了 pom 依赖接入,直接使用 ChannelWriter 即可实现渠道打包的操作。

具体教程

  • 在后端 maven 项目中引入 VasDolly 的 pom 依赖,当前最新依赖版本如下,
  <dependency>
      <groupId>com.tencent.vasdolly</groupId>
      <artifactId>writer</artifactId>
      <version>3.0.6</version>
  </dependency>
  <dependency>
      <groupId>com.tencent.vasdolly</groupId>
      <artifactId>common</artifactId>
      <version>3.0.6</version>
  </dependency>
  <dependency>
      <groupId>com.tencent.vasdolly</groupId>
      <artifactId>reader</artifactId>
      <version>3.0.6</version>
  </dependency>
  • 然后我们就可以利用 ChannelWriter 类实现渠道打包操作,ChannelWriter 类提供的 V2 签名打渠道包方法如下:
  public static void addChannelByV2(File apkFile, String channel, boolean lowMemory) throws IOException, SignatureNotFoundException {
      addChannelByV2(apkFile, apkFile, channel, lowMemory);
  }

addChannelByV2 方法的 apkFile 参数是母包文件,channel 参数是需要打包的渠道名称,lowMemory 参数是 V2 签名打渠道包提供的参数,默认为 false。该方法会直接将我们传入的 apkFile 母包修改成 V2 签名的渠道包。如此一来,我们就获得了我们需要的渠道包了。

  • 除了利用 ChannelWriter 类实现打渠道包操作,我们还可以利用 ChannelReader 类来实现读取渠道包的渠道参数,ChannelReader 类提供的 V2 签名渠道包参数读取方法如下:
  public static String getChannelByV2(File channelFile) {
      System.out.println("try to read channel info from apk : " + channelFile.getAbsolutePath());
      return IdValueReader.getStringValueById(channelFile, -2012129793);
  }

getChannelByV2 方法的 channelFile 参数就是打包后渠道包,该方法会返回渠道包中的渠道信息。

最后

感谢您的阅读,希望本文能对您有所帮助。

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!文章来源地址https://www.toymoban.com/news/detail-626146.html

到了这里,关于服务端apk打包教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【b站咸虾米】chapter1&2_uniapp介绍与uniapp基础_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

    课程地址:【新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p=12share_source=copy_webvd_source=b1cb921b73fe3808550eaf2224d1c155 目录 一、uniapp和HBuilderX介绍 二、uniapp基础 2.1  新建项目、项目目录、预览uni项目 2.1.1 新建项目 2.1.2 项目

    2024年01月20日
    浏览(54)
  • 工具系列(九) 本文(2万字) | 在ubuntu中安装docker教程 | 在Linux下Docker将镜像导出 | 上传至服务器 | 部署并创建容器 |

    点击进入专栏: 《人工智能专栏》 Python与Python | 机器学习 | 深度学习 | 目标检测 | YOLOv5及其改进 | YOLOv8及其改进 | 关键知识点 | 各种工具教程

    2024年01月19日
    浏览(74)
  • Android APK 签名打包原理分析(一)【APK结构分析】

    最近在看AOSP Apk安装的相关源码时,发现自己对这块知识一直停留到用的层面,并未有深入的了解,例如打包的具体过程、签名的具体过程、渠道打包,最重要的,自己这几年在做系统方面的应用时,也解决过很多apk 安装的问题,修改过部分的系统源码,可是没有把这块知识

    2024年02月02日
    浏览(50)
  • uniapp打包成apk

    为了将uniapp打包成apk,首先要安装Android Studio作为环境,此处放在本文末尾附录中。 自行准备或按附录中准备好安卓环境 下面正式做转换,参考如下 uniapp离线打包安卓APP全过程_uniapp 离线打包_即墨丹青的博客-CSDN博客 HBuilder中找到项目的manfest.json,关注AppID,版本名称和版本

    2024年02月07日
    浏览(31)
  • APK打包和签名

    Build/Make Project编译项目后,会默认生成一个app-debug.apk版本的APK,AS运行就是把这个文件通过adb install 方式安装到手机的 我们可以选择使用release编译版本 再次Build/Make Project编译项目后,就会出现release版本的APK 2-1、生成签名文件 第一步:Build - Generate Signed Bundle / APL 第二步:选

    2024年02月05日
    浏览(35)
  • uniapp 打包成 apk(原生APP-云打包)免费

    根据需求,修改 manifest.json 配置,常见的修改有: 升级版本时, 应用版本名称 和 应用版本号 必须高于上一版的值 点浏览选择png格式的图片后,点击 自动生成所有图标并替换 ,即可便捷更换应用图标 使用 HBuilder X 进行云打包 因云打包人较多,可能需要排队 完成排队,进

    2024年02月01日
    浏览(48)
  • VUE项目打包成apk

    在我们的开发需求中,可能会遇到需要将vue项目中的H5代码打包成一个安卓的app,那么我为大家介绍一套保姆级的解决方案,看完你就会。 VUE + HBuilder 1.准备工作: 需要下载一个HBuilder X编辑器,不过我相信大家身为前端开发工程师,都会有,但是下面我还是会放一个下载地址

    2024年02月13日
    浏览(45)
  • Flutter项目打包生成APK

    flutter实现安卓打包:(以安卓Studio工具为例) (1)创建key.jks文件 在安卓studio中调整至项目路径,例如: 我的项目所在地 然后输入命令: 最后的 alias key , key指的是签名文件的别名。 其中 E:Flutterfluttershuqi 是我希望.jks文件创建的位置, 此时你的key.jks文件就创建成功了,

    2023年04月15日
    浏览(38)
  • uni-app项目打包成apk(本地打包篇)

            最近可能要接一个uni-app的项目,之前没有接触过,因此学习了一下,好在uni-app基本算是vue和微信小程序的结合体,所以写代码方面问题不是太多,不懂的百度一下基本都能处理。写完demo之后,demo的内容应该能告诉客户我可以做,但我一开始是先用手机录制视频

    2024年02月03日
    浏览(48)
  • 【Android篇】APK打包流程浅析

    在面试中,大公司会问你.....(吃饭了吗?)咳咳~ APK打包流程全过程? APK签名在实际业务中能处理什么? APK加固原理是如何实现的,怎么保证安全? APK签名V1,V2,V3的区别于原理,有什么漏洞? 这里只讲解APK打包流程全过程。 现在2023年了,一般都是用Android studio来设计andr

    2024年02月02日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包