gpt4 book ai didi

服务端apk打包教程

转载 作者:我是一只小鸟 更新时间:2023-08-05 22:34:08 31 4
gpt4 key购买 nike

本文我将给大家介绍一个 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】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力! 。

最后此篇关于服务端apk打包教程的文章就讲到这里了,如果你想了解更多关于服务端apk打包教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com