作者
大家好,我是怡寶;
本人于18年毕业于湖南农业大学,于2021年6月加入37手游安卓团队;
目前负责于海外游戏发行安卓开发。
背景
上篇文章已经介绍了如何从apk转aab,适用于大部分的应用,但对于高质量的游戏以及大型应用来说google强制的150MB以上的包“无法上传”成了另外一个挑战。需要使用Google 提供Play Asset Delivery 来扩展包体的大小。
Play Asset Delivery (PAD) 是什么?
Play Asset Delivery (PAD) 将 app bundle 的优势带到游戏中。它允许超过 150 MB 的游戏替换旧版扩展文件 (OBB),方法是将包含游戏所需的所有资源的单个工件发布到 Play。PAD 提供了灵活的分发模式、自动更新、压缩和增量修补功能,并且可免费使用。使用 PAD,所有资源包均在 Google Play 上托管和提供,因此您无需使用内容分发网络 (CDN) 向玩家提供游戏资源。
Play Asset Delivery 使用资源包,资源包由资源(如纹理、着色器和声音)组成,但不包含可执行代码。通过 Dynamic Delivery,您可以按照以下三种分发模式自定义如何以及何时将各个资源包下载到设备上:安装时分发、快速跟进式分发和按需分发。
Android Studio 提供了pad的生成方式,现状是,我们已经使用了apk转化,已经抛弃了Android Studio带来的集成环境,那么我们如何自己构建pad呢?
本文向大家介绍如何用命令的方式pad模块,文末提供本文所使用到的工具&python脚本源码
默认大家已经看过上篇文章 政策工具类-谷歌Android App Bundle(aab)政策海外发行 已经了解了apk转aab的过程。
需要工具
-
bundletool-all-1.6.1.jar
bundletool.jar 是google提供生成&测试aab的工具,gradle打包里面也是使用的这个工具。
获取方式github: github.com/google/bund…
详细文档&使用方法: developer.android.com/studio/comm…
-
aapt2
aapt全称Android Asset Packaging Tool是Android资源打包工具。
获取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/aapt2
获取方式google maven: dl.google.com/dl/android/…
详细文档&使用方法:developer.android.com/studio/comm…
-
apktool_2.5.0.jar
反编译安卓apk工具。
获取方式github: github.com/iBotPeaches…
-
android.jar
android framework,提供了系统的资源和api。
获取方式ANDROID SDK: $ANDROID_SDK/platforms/android-30/android.jar
-
d8
将java字节码编译成dex字节码
获取方式ANDROID SDK: $ANDROID_SDK/build-tools/30.0.3/d8.bat
详细文档&使用方法:developer.android.com/studio/comm…
构建pad
-
pad目录解析
从Android studio创建一个带有pad module的工程,生成aab,解压aab我们可以发现,pad的目录结构和base的目录结构几乎一样,由AndroidManifest.xml 决定 module 的性质。 那么我们是不是就可以构建一个一模一样的目录结构然后打进aab里面应该就可以了?
经过测试发现,以下的文件是在构建中必须要的 (assets可以不用,但是我们的目的是为了扩展资源,所以也算必要)
pad/ ├── assets ├── dex ├── manifest
这个目录看过上篇文章的应该很熟悉,他就是上一遍文章构建base.zip前所需物料的简版(少了一些非必要文件夹),既然这样,那么我们构建他最开始的目录结构和源物料,目录结构应该是这样的
pad/ ├── assets ├── AndroidManifest.xml ├── classes.dex
-
构建AndroidManifest.xml
上面说了AndroidManifest.xml是决定module性质的文件,我们可以根据pad官方给到的配置信息创建一个自己的AndroidManifest.xml,也可以复制Android Studio中自动创建的。大概是这样的:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dist="http://schemas.android.com/apk/distribution" android:isFeatureSplit="true" split="$padName" package="$applicationId"> <dist:module dist:instant="false" dist:title="$padName"> <dist:delivery> <dist:install-time/> </dist:delivery> <dist:fusing dist:include="true"/> </dist:module> </manifest>
split ,dist:title : 为模块的名。
package: 包名,需要和apk的一样,否则编译不通过
install-time
资源包在用户安装应用时分发。这些资源包以拆分 APK(APK 集的一部分)的形式提供。它们也称为“预先”资源包;您可以在应用启动时立即使用这些资源包。这些资源包会增加 Google Play 商店上列出的应用大小。用户无法修改或删除这些资源包。 -
构建dex
通过AndroidManifest.xml生成R.java
aapt2 link --proto-format -o R_base.apk -I android_30.jar --min-sdk-version 19 --target-sdk-version 30 --version-code 1 --version-name 1.0 --manifest AndroidManifest.xml --auto-add-overlay --java java
通过javac编译R.java
javac -source 1.7 -target 1.7 java\wang\i333\pad_demo\R.java
通过d8生成dex
d8 java/wang/i333/pad_demo/R.class
-
构建assets
通过从base里面的assets里面剪切,或者从其他地方拷贝获得assets目录
构建pad.zip
经过上面的步骤,我们会得到一个
pad/
├── assets
├── AndroidManifest.xml
├── classes.dex
其实可以把 classes.dex 和AndroidManifest.xml 提取成一个模板,每次拷贝的时候修改AndroidManifest.xml里面的包名,这样就不用每次去构建dex了,每次只需要把assets文件夹修改就可以了。
将这些目录构建成pad.zip ,没有的文件夹不需要在去创建。省略构建步骤,可以阅读上一篇文章。
生成aab+pad的包
通过上篇文章我们获取到一个base.zip ,这篇文章获取到一个pad.zip ,通过bundletool构建就生成了带pad的aab包了
java -jar bundletool-all-1.6.1.jar build-bundle --modules=base.zip,pad.zip --output=pad_demo.aab
--modules:多个module打包成aab。
测试
省略测试步骤,可以阅读上一篇文章。
也可以通过解析查看aab里面的模块有哪些
java -jar bundletool-all-1.6.1.jar validate --bundle pad_demo.aab
获取工具&源码
源码中有提供windows可执行工具,配合bat脚本可以直接在电脑上操作。
后续也会提供web在线转换工具,敬请期待………
结束语
过程中有问题或者需要交流的同学,可以扫描二维码加好友,然后进群进行问题和技术的交流等