如果我们使用多个APK,BuildConfig.VERSION_CODE是否会被更改

时间:2018-01-05 10:11:10

标签: android performance android-layout android-gradle android-version

我为每个ABI创建multiple apk's,我这样做是为每个apk分配单独的版本代码。

ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]

import com.android.build.OutputFile
android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def baseAbiVersionCode =
                project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))

        if (baseAbiVersionCode != null) {
            output.versionCodeOverride =
                    baseAbiVersionCode * 1000 + variant.versionCode
        }
    }
} 

这是我的dafaultConfig,以下versionCode适用于universalApk

 defaultConfig {
        versionCode 74
        versionName "1.0.2"
}

我在versionCode附加了每个服务请求,我还在其中一个活动中显示versionCode。所以我需要正确的versionCode来执行这些操作,我使用此代码来获取versionCode

int versionCode = BuildConfig.VERSION_CODE;

现在的问题是,它显示versionCode中陈述的defaultConfig而不是实际代表构建的versionCode

我需要知道如何获得分配给此版本的1000,可能是某个大于dafaultConfig的数字,而不是{ linkId: 960, link: 8, text: individuals } 中分配的数字<span *ngFor="let item of items" (click)="triggerClick()" [attr.data-link-id]="item.linkId" [attr.data-link]="item.link" class="level_modal"> {{ item.text }} </span> }

3 个答案:

答案 0 :(得分:3)

要检查版本代码,您可以使用PackageInfo和PackageManager

try {
    PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
    String version = pInfo.versionName;   //version name
    int verCode = pInfo.versionCode;      //version code
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

答案 1 :(得分:2)

您不应该阅读构建配置文件,构建配置文件将显示默认配置。

您应该使用PackageInfo

  try {
            PackageInfo pInfo = this.getPackageManager().getPackageInfo(getPackageName(), 0);
            String version = pInfo.versionName;
            Log.e("name","name"+version);
            Log.e("Code","code"+pInfo.versionCode);
        }catch (Exception e){
            e.printStackTrace();
        }

对于armeabi-v7a将显示1001,对于mips将显示1002,对于x86显示1003

答案 2 :(得分:1)

我问了类似的here

由于访问BuildConfig.VERSION_CODE似乎比访问PackageInfo便宜,因此我认为,在一种变通方法中,可以在这些情况下继续使用BuildConfig.java来检索versionCode,这并不是与我们之前使用mergedFlavor.versionCode并优于BuildConfig.VERSION_CODE的情况一样好,但是由于进行了此更改是为了缩短构建时间,因此我非常乐意接受它。

首先,您应在每种口味中设置versionCode,而不是defaultConfig,例如:

flavorDimensions 'default'

productFlavors {
    hellotest {
        versionCode 20
    }

    hellotest1 {
        versionCode 10
    }
}

然后从上方更新代码:

ext.abiCodes = ['armeabi-v7a':1, mips:2, x86:3]

import com.android.build.OutputFile
android.applicationVariants.all { variant ->
    // Get the versionCode statically defined in each flavor.
    def versionCode = variant.productFlavors.get(0).versionCode
    // Create a custom buildConfigField with the versionCode
    variant.buildConfigField('int', 'OVERRIDEN_VERSION_CODE', "${versionCode}")
    variant.outputs.each { output ->
        def baseAbiVersionCode =
                project.ext.abiCodes.get(output.getFilter(OutputFile.ABI))

        if (baseAbiVersionCode != null) {
            output.versionCodeOverride =
                    baseAbiVersionCode * 1000 + variant.versionCode
                    // Update the BuildConfig.OVERRIDEN_VERSION_CODE with the new versionCode.
                    // OVERRIDEN_VERSION_CODE is just an example name, you can give the name you want.
                    variant.buildConfigField('int', 'OVERRIDEN_VERSION_CODE', "${output.versionCodeOverride}") 
        }
    }
} 

此后,您将可以通过项目中任何地方的versionCode访问正确的BuildConfig.OVERRIDEN_VERSION_CODE