我的Android应用程序使用了一个自定义的本机库(用C ++编写),我为每种架构armeabi-v7a
,arm64-v8a
,x86
和x86_64
进行了编译。支持64位本机库(arm64-v8a
/ x86_64
)的Android的最早版本是API级别21,但具有32位本机库(armeabi-v7a
/ x86
)我能够支持Android API级别16以下的设备。
由于API级别不同,并且由于编译的库很大,因此我为每种体系结构创建了一个特定的apk文件。因此,最终我有4个不同的apk文件,这些文件使我的应用程序几乎可以在API级别16以下的所有Android设备上运行。这种方法行之有效,并已记录在here中。构建这些apk文件的build.gradle
文件如下所示:
android
{
...
defaultConfig
{
minSdkVersion 16
targetSdkVersion 29
...
}
flavorDimensions "abi"
productFlavors
{
"ARM7"
{
dimension "abi"
ndk.abiFilters 'armeabi-v7a'
versionCode 160000 + android.defaultConfig.versionCode
versionNameSuffix "-arm32"
}
"ARM8"
{
dimension "abi"
ndk.abiFilters 'arm64-v8a'
minSdkVersion 21
versionCode 210000 + android.defaultConfig.versionCode
versionNameSuffix "-arm64"
}
"x86"
{
dimension "abi"
ndk.abiFilters 'x86'
versionCode 160000 + android.defaultConfig.versionCode
versionNameSuffix "-x86"
}
"x86-64"
{
dimension "abi"
ndk.abiFilters 'x86_64'
minSdkVersion 21
versionCode 210000 + android.defaultConfig.versionCode
versionNameSuffix "-x64"
}
}
...
}
现在,Google推送了新的Android捆绑包格式,并且documentation当前处于声明状态
重要提示:2021年下半年,将需要新的应用与Android App Bundle一起在Google Play上发布。大于150 MB的新应用必须使用Play功能交付或Play资产交付。
因此,在某些时候,我将不得不将我的多apk方法转换为该新的Android Bundle格式,但是我基本上不知道这应该如何工作。我的每个apk文件都包含自己的清单和版本号,而minSdkVersion
的Android捆绑包中包含一个统一的清单。
我将如何创建一个最终与我现有的4个apk文件具有相同效果的Android捆绑软件?
答案 0 :(得分:0)
首先,有一种更简单的方法来实现您已经拥有的功能-双向拆分(请参阅https://developer.android.com/studio/build/configure-apk-splits)。此方法为您处理versionCode等。
如该页面上所述-最好为此目的使用应用程序捆绑包。应用程序捆绑包有两个主要目的-最小化(/优化)下载,并允许动态模块。首先,它使Google Play从本质上获取了包含所有内容的庞大应用程序捆绑包,并制作了一个较小的apk,仅包含正在询问的特定设备所需的内容。只有这个最小的APK才能下载到设备。
因此,总结一下:您将一个大应用程序包上传到Google Play,其中包含所有设备的所有内容。然后,Google Play会构建仅包含所需内容的最小apk,并将其仅下载到设备中。从技术上讲,Google play创建了一个.apks
并下载了该文件,它实际上是一个包含多个.apk文件的zip文件,其格式为:,但这主要只是您不需要的实现细节担心。
您可以使用bundletool(https://github.com/google/bundletool/releases)模拟并尝试应用捆绑包的工作方式(.aab
格式),捆绑工具({{3}})根据Google 的规定,Google Play会使用它来处理应用包文件。
此外,您可以降低口味。那些只会挡在现在。