Что такое versionCodeMajor?И в чем разница с versionCode? - PullRequest
0 голосов
/ 03 октября 2018

Я только что обнаружил, что PackageInfo.versionCode устарело в Android Pie.Они указывают вам использовать PackageInfo.getLongVersionCode() вместо.JavaDoc этого нового метода:

Return versionCode и versionCodeMajor, объединенные вместе в одно длинное значение.versionCodeMajor помещается в старшие 32 бита.

Но что такое versionCodeMajor?Как я должен использовать это?В чем разница между versionCodeMajor и старым versionCode?

В документации почти ничего не сказано:

Внутренний основной код версии.Это по существу дополнительные старшие биты для кода базовой версии;это не имеет никакого другого значения, кроме того, что более высокие числа более недавние.Это не номер версии, обычно показанный пользователю, который обычно предоставляется с R.attr.versionName.

1 Ответ

0 голосов
/ 26 октября 2018

До сих пор я нашел единственный способ установить versionCodeMajor в Android Studio 3.2.1 через AndroidManifest.xml и отключить InstantRun .

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:versionCodeMajor="8" [...]

'причина установки его в build.gradle файле, который вы получаете

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.xxx.myapplicationp"
        minSdkVersion 'P'
        targetSdkVersion 'P'
        versionCode 127
        //versionCodeMajor 8
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

Не удалось найти метод versionCodeMajor () для аргументов

Итак, установив выбранный вами основной номер кода версиив AndroidManifest.xml и отключив InstantRun , вы можете получить его следующим образом:

static long getAppVersionCode(Context context) throws PackageManager.NameNotFoundException {
        PackageInfo pinfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        long returnValue = Long.MAX_VALUE;
        //if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P
                && !"P".equals(Build.VERSION.CODENAME) /* This 'cause the dev preview */) {
            returnValue = pinfo.versionCode;
        } else {
            returnValue = pinfo.getLongVersionCode();
            Log.d("AAA", "Full long value: " + returnValue);
            Log.d("AAA", "Major Version Code (your chosen one) " + (returnValue >> 32)); // 8 in this scenario
            Log.d("AAA", "Version Code (your chosen one) " + (int)(returnValue & 0x00000000ffffffff)); // 127 in this scenario
        }
        return returnValue;
    }

или вы можете использовать PackageInfoCompat , например:

static long getAppVersionCode(Context context) throws PackageManager.NameNotFoundException {
        PackageInfo pinfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
        long returnValue = Long.MAX_VALUE;
        returnValue = PackageInfoCompat.getLongVersionCode(pinfo);
        if (BuildConfig.DEBUG) {
            int majorCode = (int)(returnValue >> 32);
            int versionCode = (int)(returnValue & 0x00000000ffffffff); // or simply returnValue

            Log.d("AAA", "Full long value: " + returnValue);
            Log.d("AAA", "Major Version Code (your chosen one) " + majorCode); // 8 in this scenario
            Log.d("AAA", "Version Code (your chosen one) " + versionCode); // 127 in this scenario
        }
        return returnValue;
    }

И это должно ответить, как его использовать или способ.

Для того, когда и зачем его использовать ... Я думаю, это зависит от вас ... как, как вы указали, документация говорит вам, отмечая, почему вы должны его использовать.То, что говорит доктор, это то, что вы должны представлять своим пользователям только хорошо известный versionNumber.

Я полагаю, они добавляют еще несколько битов в versionCode, потому что им нужно большее число для их версий ^^ '

Тем не менее, если вы не установите versionCodeMajor в AndroidManifest.xml или в файле build.gradle (когда он его обработает), или вы установите его на 0, тогда это значение будет идентично старому versionNumber устаревшему полю.

...