Android应用捆绑版本代码突然很高

yzxexxkh  于 2023-08-01  发布在  Android
关注(0)|答案(4)|浏览(89)

我刚刚为我的React Native应用程序做了一个新的Android捆绑包。我在android/app/build.gradle中手动将版本代码从90更新为91,但现在我试图上传到Play Store,版本代码为3145819(我预计会看到91)
build.gradle:

defaultConfig {
        applicationId "com.myapp"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 91
        versionName "4.1.0"
        multiDexEnabled true
        missingDimensionStrategy "RNN.reactNativeVersion", "reactNative57_5"
        resValue "string", "build_config_package", "com.myapp"
    }

字符串
我使用这个命令来绑定:

./gradlew bundleProdRelease --console plain


不确定为什么会发生这种情况,我肯定更喜欢更小的版本代码(用户在报告bug时更容易阅读)。
你知道这是怎么回事吗?

lbsnaicq

lbsnaicq1#

好吧,我终于想通了!不,过去两年我没有拼命地寻找答案...我只是偶然发现了它。
因此,在android/app/build.gradle中,有一个脚本生成bundle版本代码。它是根据版本代码和目标体系结构版本代码计算出来的。例如,在RN 0.64x模板中:

def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)

if (abi != null) {
  output.versionCodeOverride = defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}

字符串
对我来说,arm64-v8a似乎总是在生成版本代码时被用作默认值,所以我得到的输出如下:

versionCode 1 => 1003
versionCode 12 => 12003
versionCode 105 => 105003
you get the idea...


计算通常涉及一个更神秘的数字(1048576♂️,参见RN 0.59x模板),它看起来很随意,并且很难理解这个捆绑包版本代码是如何生成的。
现在更有意义了!

ymdaylpp

ymdaylpp2#

一种可能性是,您的/app/build.gradle配置包含一些转换versionCode的逻辑,可能是因为您正在进行应用程序捆绑。
在react-native的当前master中,可以看到一些版本控制逻辑here
你的build.gradle可能有相同或相似的逻辑。
Google在这里有关于版本控制的解释。

xoefb8l8

xoefb8l83#

我也有同样的问题。每次运行**./gradlew bundleRelease**并更改

def enableSeparateBuildPerCPUArchitecture = false

字符串

def enableSeparateBuildPerCPUArchitecture = true


该函数位于android/app/build.gradle
我不确定如何阻止它这样做,除了将enableSeparateBuildPerCPUArchitecture更改回false

ccrfmcuu

ccrfmcuu4#

又过了两年。正如samzmann所提到的,versionCodeOverride公式在React Native的新版本中发生了变化。下面是commitpull request的具体讨论。

output.versionCodeOverride =
-        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
+        defaultConfig.versionCode * 1000 + versionCodes.get(abi)

字符串
OP很可能使用了旧版本的React Native和之前的公式。向后看,我们可以看到设置versionCode 91如何变成3145819

versionCodeOverride = ABI * 1048576 + versionCode
3145819 = ABI * 1048576 + 91
ABI = (3145819 - 91) / 1048576
ABI = 3. <--- "arm64-v8a": 3


为了获得更小的版本代码,有意义(人类可读),您需要使用使用更新后的公式的React Native版本。如果在Play商店中上传并部署了版本为3145819的构建版本,您可能需要使用新的捆绑包ID。这是因为新版本必须单调递增versionCode值以防止降级。
如果这对任何人有帮助的话,我在调试我自己的versionCode与32位整数溢出相关的问题时偶然发现了这个问题。Android开发者文档状态:
Google Play允许versionCode的最大值是210000000。
由于android/app/build.gradle中的versionCodeOverride公式,我相信我们应该保留defaultConfig.versionCode < 2100000。这实际上只给了我们6位数字来使用semantic versioning的版本代码方案。

相关问题