流程图
第一步 解析apk:
使用cmd命令执行apktool对apk进行反编译操作获取对应的所有文件
cmd = java -jar {apktool路径} d {apk路径} -s -o {decode_apk_dir反编译存放资源文件内容的路径}
第二步 获取apk信息:
在解压后的文件中 通过apktool.yml 获取对应的apk信息
应用SDK信息 sdkInfo: minSdkVersion、targetSdkVersion
应用版本信息 versionInfo: versionCode、versionName
应用资源不压缩信息 doNotCompress
应用包名 通过清单文件AndroidManifest.xml 获取package
第三步 获取资源id:
构建public.txt 即应用资源id配置
将解析后的 res/values/public.xml 文件里的所有资源id按照下方格式组建成的资源文本配置
[packname包名]:[type资源类型]/[name 资源名称]=[id 资源赋予的唯一id值]
第四步 构建资源模块:
由于googleplay政策要求 所有aab里的base主模块大小不能超过 150M 并提供了可以采用资源模块的方式进行资源分配。
资源模块组成部分:
assets 资源目录 manifest清单配置目录 assets.pb 资源模块的组员信息文件
创建module目录
配置对应的清单文件 将其中的$applicationId和$padName 修改成对应的包名和资源模块名
通过正则判断将拷贝assets里的资源文件过大的文件到资源模块目录的assets
第五步 构建主模块base压缩包:
1.采用aapt2将对应的资源构建成compiled_resources.zip 资源压缩文件
cmd = {aapt2 路径} complie -- legacy --dir {res_dir 解析后的资源目录} -o {complied_resources 输出路径}
2.通过aapt2和android.jar 来将compiled_resources.zip和 AndroidManifest.xml 生成中间产物 base.apk
cmd= {aapt2 路径} link --proto-format -o {out_apk_path base.apk路径} -I {android android.jar路径} -- min-sdk-version {对应的apk信息min_sdk_version} --target-sdk-version {对应的apk信息target_sdk_version } --version-code {对应的apk信息version_code} --version-name {对应的apk信息version_name} --manifest {对应的apk信息AndroidManifest.xml} --auto-add-overlay
3.通过zip命令解压base.apk 获取对应的资源目录
4.并将对应需要的资源拷贝过去
拷贝base.apk解压后的AndroidManifest.xml 移动到manifest文件夹
拷贝最初解析后的apk目录里assets、lib、其他文件 unknow、kotlin、META-INF、dex、其他文件或文件夹 (注意事项:META-INF文件 注意先删除apk签名信息 其他文件或文件夹统一放在root文件夹中)
最终构建aab文件目录
5.通过zip命令 将最终aab文件目录压缩成base.zip文件
第六步 整理资源模块:
1.通过aapt2、android.jar 和AndroidManifest.xml 直接生成 资源模块包
cmd = {aapt2路径} link --proto-format -o {out_apk_path资源包路径} -I {android路径} -- manifest{资源模块里的AndroidManifest.xml} --auto-add-overlay
2.通过zip命令解压资源包 获取对应的资源
AndroidManifest.xml 和 resources.pb
3.创建最终压缩模块的资源文件夹
拷贝解压资源部获得的AndroidManifest.xml到manifest文件夹
构建asset.pd文件(待研究)
获取assets里的所有文件夹的路径地址
组成 {'path':'assets/子文件目录','targeting',{}} 数组
写入到asset.pd里
第七步 构建BundleConfig.db 应用资源压缩配置
根据第二步获取的doNotCompress不压缩资源列表进行重新配置处理
第八步 构建aab
通过bundletool.jar工具执行命令行构建aab
cmd = "java -jar {bundletool.jar包资源路径} build-bundle --modules={主模块资源路径} --output={aab_path文件输出路径} --config={bundle_config_json_path 第七步生成的资源压缩配置文件路径}"
第九步 将资源模块压缩进生成的aab中
通过zip命令执行
第十步 最后对aab进行签名操作
根据自己的签名信息配置 通过命令执行签名信息操作
cmd = '"%sjarsigner" -digestalg SHA1 -sigalg %s -keystore "%s" -storepass "%s" -keypass "%s" "%s" "%s" ' % (java环境路径,(签名类型),签名文件路径, password, aliaspwd, apkfile, alias)