AAB上传GooglePlay下载APK缺失语言资源文件问题

1,869 阅读5分钟

一、背景

  1. 由于我们的项目是面向海外市场,需要借助Google Play进行应用分发。而项目编译的安装包体积已经接近150M上限。考虑到Google官方对于AAB方式的普及推广等其他多方面因素,我们选择采用AAB的方式进行商店应用分发。
  2. 由于海外市场的特性,我们的APP需要支持多国语言适配,且APP内部已经支持应用内语言切换功能。
  3. AAB分发方式原理:

Google Play 会基于用户设备的配置和语言,借助App Bundle 来生成和优化 APK,使下载到手机中的应用占用空间更小。这种优化意味着通过 AAB 分发的应用比传统 APK 格式平均占用空间少 15%。终端用户也能获得更快的安装速度和更多的可支配存储空间。

二、故障点

  • 故障场景:在某个版本内部测试阶段,已经进行到测试后期的线上验证阶段。
  • 故障环境:Vivo某机型,从Google Play下载内测版本APP。
  • 故障点说明:不管是应用外还是应用内,切换除中文、中文简体和英文以外的语种,APP均只展示默认语种英文。

三、故障定位

1.版本代码变更排查

由于测试同学反馈前几轮均未出现此种问题,优先排查从上个正常现象版本到现在的代码变更。 本版本并没有多语言切换相关的需求和代码变更,从其他模块引入变更来看,也没有可以影响到多语言切换功能的相关因素和代码逻辑。 由此,可以缩小范围到此次打包环境的差异带来的影响。

2.构建环境排查

从线上流程化打包环境来看,并没有和以往的打包方式有变更,需要进一步缩小问题定位的范围。 我们提取了此次上架到Google Play的内测安装包的构建流程,提取了AAB文件、Release版APK文件和Debug文件,从AAB本地转APK、Release包和Debug包三个场景进行问题复现,发现均没有复现故障。

因此,我们排除了本地构建环境这一原因。故障范围进一步缩小到了,本地APK文件和线上商店AAB分发后的差异性。

3.商店包和本地包对比定位

上传到Google Play的AAB文件分发下来的安装包,和本地AAB文件转化的通用APK有什么差异呢? 首先要先从Google Play控制台下载一个通用APK来复现。

image.png

这是一个经过Google Play转化的APK通用文件,我们需要比对本地jar工具转换和商店转换的差异,判断问题点是否出在这里。

经过比对,也没有复现故障,问题范围进一步缩小到,Google Play下载到手机的APK和通用APK的差异。问题排查到这里,基本上心里也就有一个猜想的答案了。

从Google Play分发机制原理来看,Google主要是针对手机机型和硬件架构,判断手机必需的底层库组件和资源包,剔除了手机不需要的冗余资源。

那么问题点应该就在于手机告诉Google Play,它需要的多语言资源文件仅有中英文。

为了验证猜想,我们需要把手机从Google Play下载的安装包提取出来,和我们本地构建的通用全量资源安装包做比对。

附上安装包提取方式:

// 根据包名定位安装包路径
adb shell pm path com.xxx.xxx

// 根据上一步获取到的路径,提取apk到本地
adb pull 路径

在提取过程中我们发现,我们的包名下对应了三个apk文件:

package:/data/app/com.ezviz-kih9yoXfHhrAtd0sSQTcjQ==/base.apk
package:/data/app/com.ezviz-kih9yoXfHhrAtd0sSQTcjQ==/split_config.arm64_v8a.apk
package:/data/app/com.ezviz-kih9yoXfHhrAtd0sSQTcjQ==/split_config.zh.apk

image.png 而我们本地通用安装包在手机安装后,提取出来是仅含有base.apk这一个文件的,这里是第一个差异点。

接着我们需要反编译提取出来的apk文件,看看里面的多语言资源差异性。从apk名称可以判断,从Google Play安装的 包我们只需要base.apk和split_config.zh.apk来验证。

反编译需要下载一个apktool的jar包工具,这里附上反编译命令:

java -jar apktool.jar d base.apk

image.png

反编译结束后,可以在res目录下发现,从Google Play安装的APP只包含了values、values-zh、values-zh-rHK、values-zh-rTW四种多语言资源文件,对于其他语种是没有下载对应的资源文件。

在我们本地通用apk反编译文件中,提取出来的多语言文件是全量的数据。

image.png

进而验证了我们的猜想:手机告诉Google Play,它需要的多语言资源文件仅有中英文。

image.png

四、故障原因

从Google Play下载的安装包是APP资源重组后剔除无用资源的结果,该机型在获取资源时,仅获取到了部分多语言文案资源,导致其他语种切换后不成功的现象。

五、解决方案

上报问题给手机厂商,推动和Google一起解决问题。