自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

VasDolly服務端打渠道包教程

開發(fā) 前端
addChannelByV2 方法的 apkFile 參數(shù)是母包文件,channel 參數(shù)是需要打包的渠道名稱,lowMemory 參數(shù)是 V2 簽名打渠道包提供的參數(shù),默認為 false。該方法會直接將我們傳入的 apkFile 母包修改成 V2 簽名的渠道包。如此一來,我們就獲得了我們需要的渠道包了。

本文我將給大家介紹一個 apk 打包工具 VasDolly 的使用介紹、原理以及如何在服務端接入 VasDolly 進行服務端打渠道包操作。

使用介紹

圖片圖片

VasDolly 是一個快速多渠道打包工具,同時支持基于 V1 和 V2 簽名進行多渠道打包。插件本身會自動檢測 Apk 使用的簽名類別,并選擇合適的多渠道打包方式,對使用者來說完全透明。

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

項目構(gòu)建方式:gradle

VasDolly 官方對于 VasDolly 的定位是安卓端多渠道打包工具,由安卓開發(fā)接入安卓項目中使用。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 文件內(nèi)容如下:

yingyongbao
gamecenter
xiaomi
huawei
oppo
vivo

另一種方式是在 channel 或者 rebuildChannel 屬性中通過 channelFile 屬性指定渠道文件,一行一個渠道信息。例如:

channel {
    //指定渠道文件
    channelFile = file("/Users/leon/Downloads/testChannel.txt")
}
  • 通過 Gradle 生成多渠道包。你可以選擇直接編譯生成多渠道包,或者根據(jù)已有基礎包重新生成多渠道包。如果你選擇直接編譯生成多渠道包,你需要配置渠道文件、渠道包的輸出目錄和渠道包的命名規(guī)則。例如:
channel {
    //指定渠道文件
    channelFile = file("/Users/leon/Downloads/testChannel.txt")
    //多渠道包的輸出目錄,默認為new File (project.buildDir,"channel")
    outputDir = new File(project.buildDir,"xxx")
    //多渠道包的命名規(guī)則,默認為:$ {appName}-$ {versionName}-$ {versionCode}-$ {flavorName}-$ {buildType}-$ {buildTime}
    apkNameFormat ='$ {appName}-$ {versionName}-$ {versionCode}-$ {flavorName}-$ {buildType}'//快速模式:生成渠道包時不進行校驗(速度可以提升10倍以上,默認為false)
    fastMode = false//buildTime的時間格式,默認格式:yyyyMMdd-HHmmss
    buildTimeDateFormat = 'yyyyMMdd-HH:mm:ss'//低內(nèi)存模式(僅針對V2簽名,默認為false):只把簽名塊、中央目錄和EOCD讀取到內(nèi)存,不把最大頭的內(nèi)容塊讀取到內(nèi)存,在手機上合成APK時,可以使用該模式
    lowMemory = false
}

然后,通過 gradle channelDebug 或 gradle channelRelease 命令分別生成 Debug 和 Release 的多渠道包。如果你選擇根據(jù)已有基礎包重新生成多渠道包,你需要配置渠道文件、基礎包的路徑和渠道包的輸出目錄。例如:

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//低內(nèi)存模式(僅針對V2簽名,默認為false):只把簽名塊、中央目錄和EOCD讀取到內(nèi)存,不把最大頭的內(nèi)容塊讀取到內(nèi)存,在手機上合成APK時,可以使用該模式
    lowMemory = false
}

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

原理

VasDolly 實現(xiàn)原理官方講解地址:https://github.com/Tencent/VasDolly/wiki/VasDolly%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86

VasDolly 的原理是利用 APK 文件的特殊結(jié)構(gòu),將渠道信息寫入到 APK 文件的空白區(qū)域,從而實現(xiàn)無損的多渠道打包。具體來說,VasDolly 根據(jù) APK 文件使用的簽名類別,選擇不同的多渠道打包方式。

如果 APK 文件使用的是 V1 簽名,那么 VasDolly 會將渠道信息寫入到 APK 文件的 Zip Comment 區(qū)域。Zip Comment 是 Zip 文件格式中的一個字段,用于存儲一些注釋信息,通常不會被解壓縮工具或者系統(tǒng)解析。因此,將渠道信息寫入到 Zip Comment 區(qū)域,不會影響 APK 文件的完整性和安全性。同時,由于 Zip Comment 區(qū)域位于 APK 文件的末尾,所以寫入渠道信息的速度非??欤恍枰薷囊粋€字節(jié)的偏移量即可。

如果 APK 文件使用的是 V2 或者 V3 簽名,那么 VasDolly 會將渠道信息寫入到 APK Signing Block 區(qū)域。APK Signing Block 是 V2 或者 V3 簽名引入的一個新區(qū)域,用于存儲簽名相關(guān)的數(shù)據(jù)。每個數(shù)據(jù)都有一個 ID 來標識其類型,例如 0x7109871a 表示 V2 簽名數(shù)據(jù)。VasDolly 會使用一個自定義的 ID(0x71777777)來標識渠道信息,并將其寫入到 APK Signing Block 區(qū)域。由于這個區(qū)域不會被系統(tǒng)解析,所以不會影響 APK 文件的安全性。同時,由于這個區(qū)域位于中央目錄和 EOCD 之前,所以寫入渠道信息的速度也很快,只需要修改兩個字節(jié)的偏移量即可。

通過這種方式,VasDolly 可以實現(xiàn)在不重新簽名和對齊的情況下,快速生成多個渠道包。在應用運行時,可以通過 VasDolly 提供的 helper 類庫來讀取渠道信息,并進行相應的處理。

服務端接入 VasDolly 教程

安卓接入了 VasDolly 之后,就該我們服務端出手了,服務端如果能實現(xiàn)渠道打包的操作,運營每次上新渠道就不需要再找安卓進行新渠道打包,運營直接在后臺上傳母包,選定渠道后即可獲取對應的渠道包,可以節(jié)約大家的時間,避免耗費人力在渠道打包這一步。由此可見,服務端進行渠道打包操作還是有必要的。

意外發(fā)現(xiàn)

一開始我是想用官方提供的 jar 包工具,通過命令行調(diào)用的方式來實現(xiàn)服務端打渠道包的,官方提供的 readme 文檔如下,

圖片圖片

但是由于博主項目是使用容器環(huán)境部署,要是用命令行打包的話,需要引入 VasDolly jar 包并且掛載都容器中,感覺比較麻煩。就想能不能直接引入 VasDolly 依賴來實現(xiàn)打包操作。

于是我在 maven 中央倉庫搜索了 com.tencent.vasdolly 關(guān)鍵字后,有了如下發(fā)現(xiàn),

圖片圖片

可以看到 VasDolly 雖然是一個 Gradle 項目,但是官方也提供了部分模塊的在 Maven 中的 pom 坐標。

查看 VasDolly 倉庫代碼,發(fā)現(xiàn)官方定義了 write 模塊,

圖片圖片

進入其中,發(fā)現(xiàn)了 readme 內(nèi)容如下,

圖片圖片

Ok,到這里,我們發(fā)現(xiàn)其實官方提供了 pom 依賴接入,直接使用 ChannelWriter 即可實現(xiàn)渠道打包的操作。

具體教程

  • 在后端 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 類實現(xiàn)渠道打包操作,ChannelWriter 類提供的 V2 簽名打渠道包方法如下:
public static void addChannelByV2(File apkFile, String channel, boolean lowMemory) throws IOException, SignatureNotFoundException {
      addChannelByV2(apkFile, apkFile, channel, lowMemory);
  }

addChannelByV2 方法的 apkFile 參數(shù)是母包文件,channel 參數(shù)是需要打包的渠道名稱,lowMemory 參數(shù)是 V2 簽名打渠道包提供的參數(shù),默認為 false。該方法會直接將我們傳入的 apkFile 母包修改成 V2 簽名的渠道包。如此一來,我們就獲得了我們需要的渠道包了。

  • 除了利用 ChannelWriter 類實現(xiàn)打渠道包操作,我們還可以利用 ChannelReader 類來實現(xiàn)讀取渠道包的渠道參數(shù),ChannelReader 類提供的 V2 簽名渠道包參數(shù)讀取方法如下:
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 參數(shù)就是打包后渠道包,該方法會返回渠道包中的渠道信息。

責任編輯:武曉燕 來源: waynblog
相關(guān)推薦

2016-03-18 09:04:42

swift服務端

2013-03-25 10:08:44

PHPWeb

2012-03-02 10:38:33

MySQL

2016-11-03 09:59:38

kotlinjavaspring

2010-08-03 09:59:30

NFS服務

2021-05-25 08:20:37

編程技能開發(fā)

2010-03-18 18:09:36

Java Socket

2021-04-26 13:20:06

Vue服務端渲染前端

2010-03-19 18:17:17

Java Server

2022-12-29 08:56:30

監(jiān)控服務平臺

2009-08-21 15:22:56

端口偵聽

2010-02-24 15:42:03

WCF服務端安全

2009-08-21 15:59:22

服務端與客戶端通信

2011-09-09 09:44:23

WCF

2009-08-21 16:14:52

服務端與客戶端通信

2024-03-06 14:58:52

客戶端微服務架構(gòu)

2010-03-18 17:47:07

Java 多客戶端通信

2023-03-06 08:01:56

MySQLCtrl + C

2009-08-21 15:36:41

服務端與客戶端

2009-08-21 15:54:40

服務端與客戶端
點贊
收藏

51CTO技術(shù)棧公眾號