itsource

Android 애플리케이션의 빌드/버전 번호는 어떻게 얻을 수 있습니까?

mycopycode 2022. 8. 15. 21:36
반응형

Android 애플리케이션의 빌드/버전 번호는 어떻게 얻을 수 있습니까?

안드로이드 앱의 빌드 번호를 얻거나 만드는 방법을 알아내야 합니다.UI에 표시할 빌드 번호가 필요합니다.

내가 어떻게 해야 하나요?AndroidManifest.xml?

Gradle 플러그인/Android Studio를 사용하는 경우 버전 0.7.0 이후 버전 코드 및 버전 이름은 다음 사이트에서 정적으로 사용할 수 있습니다.BuildConfig. 다른 패키지가 아닌 앱 패키지를 가져오십시오.BuildConfig:

import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;

컨텍스트 개체가 필요하지 않습니다!

또, 반드시 에 그것들을 지정해 주세요.build.gradle파일 대신AndroidManifest.xml.

defaultConfig {
    versionCode 1
    versionName "1.0"
}

용도:

try {
    PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
    String version = pInfo.versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

그리고 이걸 이용해서 버전 코드를 얻을 수 있어요.

int verCode = pInfo.versionCode;

버전 이름만 원하는 경우 약간 더 짧은 버전입니다.

try{
    String versionName = context.getPackageManager()
    .getPackageInfo(context.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return false;
}

필요한 부품은 다음 두 가지입니다.

  • 안드로이드: version Code
  • Android: versionName

version Code는 숫자로, 시장에 제출하는 앱의 모든 버전은 이전 버전보다 더 큰 숫자를 가져야 합니다.

VersionName은 문자열이며 원하는 문자열로 지정할 수 있습니다.여기서 앱을 "1.0" 또는 "2.5" 또는 "2 Alpha Extreme!" 등으로 정의합니다.

예제:

코틀린:

val manager = this.packageManager
val info = manager.getPackageInfo(this.packageName, PackageManager.GET_ACTIVITIES)
toast("PackageName = " + info.packageName + "\nVersionCode = "
            + info.versionCode + "\nVersionName = "
            + info.versionName + "\nPermissions = " + info.permissions)

자바:

PackageManager manager = this.getPackageManager();
PackageInfo info = manager.getPackageInfo(this.getPackageName(), PackageManager.GET_ACTIVITIES);
Toast.makeText(this,
     "PackageName = " + info.packageName + "\nVersionCode = "
       + info.versionCode + "\nVersionName = "
       + info.versionName + "\nPermissions = " + info.permissions, Toast.LENGTH_SHORT).show();

Gradle 및 BuildConfig 사용

BuildConfig에서 VERSION_NAME 가져오기

BuildConfig.VERSION_NAME

그래, 이제 그렇게 쉬워졌어.

VERSION_NAME에 빈 문자열을 반환하고 있습니까?

빈 문자열이 있는 경우BuildConfig.VERSION_NAME읽어주세요.

계속 빈 끈을 받아서BuildConfig.VERSION_NAME왜냐하면 저는 이 설정을 하지 않았기 때문입니다.versionName내 Grade 빌드 파일에 저장(Ant에서 Gradle로 마이그레이션했습니다).그럼, 다음의 순서에 따라서, 다음의 설정을 실시해 주세요.VERSION_NAME그래들 경유로.

파일 build.gradle

def versionMajor = 3
def versionMinor = 0
def versionPatch = 0
def versionBuild = 0 // Bump for dogfood builds, public betas, etc.

android {

  defaultConfig {
    versionCode versionMajor * 10000 + versionMinor * 1000 + versionPatch * 100 + versionBuild

    versionName "${versionMajor}.${versionMinor}.${versionPatch}"
  }

}

주의: 이것은 거장 제이크 와튼으로부터 온 것입니다.

삭제 중versionName그리고.versionCode부터AndroidManifest.xml

그리고 당신이 설정한 이상versionName그리고.versionCode에서build.gradle파일을 지금 바로, 파일로부터 파일을 삭제할 수도 있습니다.AndroidManifest.xml파일(있는 경우)을 클릭합니다.

여기 Scottyab(사비 편집자)의 솔루션을 기반으로 한 클린 솔루션이 있습니다.사용의 메서드에 의해서 제공되지 않는 경우, 콘텍스트를 최초로 취득하는 방법을 나타냅니다.게다가 회선 마다 복수의 메서드를 호출하는 대신에, 복수의 회선을 사용합니다.이것에 의해, 애플리케이션의 디버깅이 용이하게 됩니다.

Context context = getApplicationContext(); // or activity.getApplicationContext()
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();

String myVersionName = "not available"; // initialize String

try {
    myVersionName = packageManager.getPackageInfo(packageName, 0).versionName;
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

String에서 버전 이름을 받았기 때문에myVersionName, TextView등의 설정을 실시할 수 있습니다.

// Set the version name to a TextView
TextView tvVersionName = (TextView) findViewById(R.id.tv_versionName);
tvVersionName.setText(myVersionName);

다음을 사용하여 APK 파일을 버전 코드로 식별하는 데 사용되는 앱 버전 또는 빌드 코드를 가져옵니다.버전 코드는 업데이트, 게시 시 실제 빌드 구성을 감지하는 데 사용됩니다.

int versionCode = BuildConfig.VERSION_CODE;

버전 이름은 개발 시퀀스의 사용자 또는 개발자를 표시하는 데 사용됩니다.원하는 대로 버전 이름을 추가할 수 있습니다.

String versionName = BuildConfig.VERSION_NAME;

BuildConfig 클래스를 사용합니다.

String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

파일 build.gradle(앱)

defaultConfig {
    applicationId "com.myapp"
    minSdkVersion 19
    targetSdkVersion 27
    versionCode 17
    versionName "1.0"
}

코틀린 외줄타기

val versionCode = BuildConfig.VERSION_CODE
val versionName = BuildConfig.VERSION_NAME

자바 원라인

String versionCode = String.valueOf(BuildConfig.VERSION_CODE);
String versionName = String.valueOf(BuildConfig.VERSION_NAME);

가져오세요.BuildConfig아, 아, 아, 아, 아, 아, 아, 네.

PhoneGap을 사용하는 경우 커스텀 PhoneGap 플러그인을 만듭니다.

앱 패키지에 새 클래스 만들기:

package com.Demo; //replace with your package name

import org.json.JSONArray;

import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

import com.phonegap.api.Plugin;
import com.phonegap.api.PluginResult;
import com.phonegap.api.PluginResult.Status;

public class PackageManagerPlugin extends Plugin {

    public final String ACTION_GET_VERSION_NAME = "GetVersionName";

    @Override
    public PluginResult execute(String action, JSONArray args, String callbackId) {
        PluginResult result = new PluginResult(Status.INVALID_ACTION);
        PackageManager packageManager = this.ctx.getPackageManager();

        if(action.equals(ACTION_GET_VERSION_NAME)) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(
                                              this.ctx.getPackageName(), 0);
                result = new PluginResult(Status.OK, packageInfo.versionName);
            }
            catch (NameNotFoundException nnfe) {
                result = new PluginResult(Status.ERROR, nnfe.getMessage());
            }
        }

        return result;
    }
}

plugins.xml에서 다음 행을 추가합니다.

<plugin name="PackageManagerPlugin" value="com.Demo.PackageManagerPlugin" />

deviceready 이벤트에서 다음 코드를 추가합니다.

var PackageManagerPlugin = function() {

};
PackageManagerPlugin.prototype.getVersionName = function(successCallback, failureCallback) {
    return PhoneGap.exec(successCallback, failureCallback, 'PackageManagerPlugin', 'GetVersionName', []);
};
PhoneGap.addConstructor(function() {
    PhoneGap.addPlugin('packageManager', new PackageManagerPlugin());
});

그런 다음 다음 versionName 속성을 얻을 수 있습니다.

window.plugins.packageManager.getVersionName(
    function(versionName) {
        //do something with versionName
    },
    function(errorMessage) {
        //do something with errorMessage
    }
);

여기와 여기서 파생되었습니다.

2020년 현재 API 28(Android 9(Pie))에서는 "version Code"가 폐지되어 "long Version Code"를 사용할 수 있습니다.

Kotlin 샘플코드

val manager = context?.packageManager
val info = manager?.getPackageInfo(
    context?.packageName, 0
)

val versionName = info?.versionName
val versionNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                        info?.longVersionCode
                    } else {
                        info?.versionCode
                    }

API 28(Android 9(Pie))의 경우 PackageInfo.versionCode는 권장되지 않으므로 다음 코드를 사용하십시오.

Context context = getApplicationContext();
PackageManager manager = context.getPackageManager();
try {
    PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
    myversionName = info.versionName;
    versionCode = (int) PackageInfoCompat.getLongVersionCode(info);
}
catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
    myversionName = "Unknown-01";
}

버전명 : BuildConfig.VERSION_NAME 버전코드 : BuildConfig.버전_코드

XML 콘텐츠에 사용할 경우 Gradle 파일에 다음 행을 추가합니다.

applicationVariants.all { variant ->
    variant.resValue "string", "versionName", variant.versionName
}

다음으로 XML 콘텐츠에 다음과 같이 사용합니다.

<TextView
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/versionName" />

Xamarin 사용자의 경우 이 코드를 사용하여 버전 이름과 코드를 가져옵니다.

  1. 버전 이름:

     public string getVersionName(){
         return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName;
     }
    
  2. 버전 코드:

     public string getVersionCode(){
         return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode;
     }
    

아니요, Android Manifest.xml에서는 아무것도 할 필요가 없습니다.

기본적으로 앱의 버전 이름과 버전 코드는 앱 레벨 Gradle 파일의 defaultConfig 태그 아래에 있습니다.

defaultConfig {
   versionCode 1
   versionName "1.0"
}

주의: 플레이스토어에 앱을 업로드 할 때는 버전명으로 임의의 이름을 붙일 수 있지만, 이미 플레이스토어에 있는 경우 버전 코드가 현재 버전 코드와 달라야 합니다.

다음 코드 스니펫을 사용하여 버전 코드와 버전 이름을 앱 내 어디에서나 얻을 수 있습니다.

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

'아'로 .try catch 삭제:

String versionName = "Version not found";

try {
    versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;
    Log.i(TAG, "Version Name: " + versionName);
} catch (NameNotFoundException e) {
    // TODO Auto-generated catch block
    Log.e(TAG, "Exception Version Name: " + e.getLocalizedMessage());
}

버전 코드를 취득하는 방법은 다음과 같습니다.

public String getAppVersion() {
    String versionCode = "1.0";
    try {
        versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
    } catch (PackageManager.NameNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return versionCode;
}

는 Preference 클래스를 사용하여 이 문제를 해결했습니다.

package com.example.android;

import android.content.Context;
import android.preference.Preference;
import android.util.AttributeSet;

public class VersionPreference extends Preference {
    public VersionPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        String versionName;
        final PackageManager packageManager = context.getPackageManager();
        if (packageManager != null) {
            try {
                PackageInfo packageInfo = packageManager.getPackageInfo(context.getPackageName(), 0);
                versionName = packageInfo.versionName;
            } catch (PackageManager.NameNotFoundException e) {
                versionName = null;
            }
            setSummary(versionName);
        }
    }
}

이 있다versionCode ★★★★★★★★★★★★★★★★★」versionName프로그램적으로

  1. 「」에서 합니다.PackageManager을 사용법

     try {
         String versionName = packageManager.getPackageInfo(packageName, 0).versionName;
         int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode;
     } catch (PackageManager.NameNotFoundException e) {
         e.printStackTrace();
     }
    
  2. 된 「Get the generated」(생성된 「Get it from 」)BuildConfig.java그러나 라이브러리에서 이 값에 액세스하면 이 라이브러리를 사용하는 앱 버전이 아닌 라이브러리 버전이 반환된다는 점에 유의하십시오.따라서 비도서관 프로젝트에서만 사용하십시오!

     String versionName = BuildConfig.VERSION_NAME;
     int versionCode = BuildConfig.VERSION_CODE;
    

도서관 프로젝트에서 제2의 방법을 사용하는 것 외에는 몇 가지 세부 사항이 있습니다.새로운 Android Gradle 플러그인(3.0.0+)에서는 일부 기능이 제거되었습니다.따라서, 현시점에서는, 다른 맛의 다른 버전을 설정하는 것이 올바르게 동작하지 않습니다.

잘못된 방법:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.mergedFlavor.versionCode = versionCode
    variant.mergedFlavor.versionName = versionName
}

의 코드를 됩니다.BuildConfig단, 、 、 「 」 、 「 」 。PackageManager 수 있다0 ★★★★★★★★★★★★★★★★★」null을 않은 default★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」0버전 코드를 지정합니다.

에는 회피책.apk★★★★★★★★★★★★★★★★★★★:

applicationVariants.all { variant ->
    println('variantApp: ' + variant.getName())

    def versionCode = {SOME_GENERATED_VALUE_IE_TIMESTAMP}
    def versionName = {SOME_GENERATED_VALUE_IE_TIMESTAMP}

    variant.outputs.all { output ->
        output.versionCodeOverride = versionCode
        output.versionNameOverride = versionName
    }
}

이 코드는 위에서 단편적으로 언급되었지만, 여기에 다시 모두 포함되어 있습니다."NameNotFoundException"이 발생할 수 있으므로 try/catch 블록이 필요합니다.

try {
    String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
}
catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}

나는 이것이 앞으로 누군가를 위해 일을 단순화하기를 바란다.:)

응용 프로그램의 UI에 BuildConfig 정보가 필요 없지만 이 정보를 사용하여 CI 작업 구성 등을 설정하고자 하는 사용자(예:

프로젝트를 정상적으로 빌드하는 한 프로젝트 디렉토리 아래에 BuildConfig.java라는 파일이 자동으로 생성됩니다.

{WORKspace}/build/generated/source/buildConfig/{debug|release}/{Package}/BuildConfig.java

/**
* Automatically generated file. DO NOT MODIFY
*/
package com.XXX.Project;

public final class BuildConfig {
    public static final boolean DEBUG = Boolean.parseBoolean("true");
    public static final String APPLICATION_ID = "com.XXX.Project";
    public static final String BUILD_TYPE = "debug";
    public static final String FLAVOR = "";
    public static final int VERSION_CODE = 1;
    public static final String VERSION_NAME = "1.0.0";
}

Python 스크립트 또는 기타 도구로 필요한 정보를 분할합니다.다음은 예를 제시하겠습니다.

import subprocess
# Find your BuildConfig.java
_BuildConfig = subprocess.check_output('find {WORKSPACE} -name BuildConfig.java', shell=True).rstrip()

# Get the version name
_Android_version = subprocess.check_output('grep -n "VERSION_NAME" ' + _BuildConfig, shell=True).split('"')[1]
print('Android version: ’ + _Android_version)
package com.sqisland.android.versionview;

import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView textViewversionName = (TextView) findViewById(R.id.text);

    try {
        PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
        textViewversionName.setText(packageInfo.versionName);

    }
    catch (PackageManager.NameNotFoundException e) {

    }
  }
}

이것을 사용해 보세요.

try
{
    device_version =  getPackageManager().getPackageInfo("com.google.android.gms", 0).versionName;
}
catch (PackageManager.NameNotFoundException e)
{
    e.printStackTrace();
}

Kotlin의 예:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.act_signin)

    packageManager.getPackageInfo(packageName, PackageManager.GET_ACTIVITIES).apply {
        findViewById<TextView>(R.id.text_version_name).text = versionName
        findViewById<TextView>(R.id.text_version_code).text =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) "$longVersionCode" else "$versionCode"
    }

    packageManager.getApplicationInfo(packageName, 0).apply{
        findViewById<TextView>(R.id.text_build_date).text =
            SimpleDateFormat("yy-MM-dd hh:mm").format(java.io.File(sourceDir).lastModified())
    }
}

첫 번째:

import android.content.pm.PackageManager.NameNotFoundException;

다음으로 다음을 사용합니다.

PackageInfo pInfo = null;
try {
     pInfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} 
catch (NameNotFoundException e) {
     e.printStackTrace();
}

String versionName = pInfo.versionName;
private String GetAppVersion() {
    try {
        PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
        return _info.versionName;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return "";
    }
}

private int GetVersionCode() {
    try {
        PackageInfo _info = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
        return _info.versionCode;
    }
    catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
        return -1;
    }
}

내부 프래그먼트 사용 예.

import android.content.pm.PackageManager;
.......

private String VersionName;
private String VersionCode;
.......


Context context = getActivity().getApplicationContext();

/* Getting application version name and code */
try
{
     VersionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName;

     /* I find it useful to convert vervion code into String,
        so it's ready for TextViev/server side checks
     */

     VersionCode = Integer.toString(context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode);
}
catch (PackageManager.NameNotFoundException e)
{
     e.printStackTrace();
}

// Do something useful with that
PackageInfo pinfo = null;
try {
    pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
}
catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
int versionNumber = pinfo.versionCode;
String versionName = pinfo.versionName;

버전 코드만 받고 앱 업데이트 여부만 확인하면 되기 때문에, 만약 그렇다면 플레이스토어를 실행하여 업데이트를 받아야 했습니다.이렇게 했어요.

public class CheckForUpdate {

    public static final String ACTION_APP_VERSION_CHECK = "app-version-check";

    public static void launchPlayStoreApp(Context context)
    {
        // getPackageName() from Context or Activity object
        final String appPackageName = context.getPackageName();
        try {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                                  Uri.parse("market://details?id=" + appPackageName)));
        }
        catch (android.content.ActivityNotFoundException anfe) {
            context.startActivity(new Intent(Intent.ACTION_VIEW,
                                  Uri.parse("https://play.google.com/store/apps/details?id=" +
                                             appPackageName)));
        }
    }

    public static int getRemoteVersionNumber(Context context)
    {
        int versionCode = 0;
        try {
            PackageInfo pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            String version = pInfo.versionName;
            versionCode = pInfo.versionCode;
        }
        catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }

}

그런 다음 util 클래스를 만들어 공유 환경설정을 사용하여 버전 코드를 저장했습니다.

public class PreferenceUtils {

    // This is for version code
    private  final String APP_VERSION_CODE = "APP_VERSION_CODE";
    private  SharedPreferences sharedPreferencesAppVersionCode;
    private SharedPreferences.Editor editorAppVersionCode;
    private static Context mContext;

    public PreferenceUtils(Context context)
    {
        this.mContext = context;
        // This is for the app versioncode
        sharedPreferencesAppVersionCode = mContext.getSharedPreferences(APP_VERSION_CODE,MODE_PRIVATE);
        editorAppVersionCode = sharedPreferencesAppVersionCode.edit();
    }

    public void createAppVersionCode(int versionCode) {

        editorAppVersionCode.putInt(APP_VERSION_CODE, versionCode);
        editorAppVersionCode.apply();
    }

    public int getAppVersionCode()
    {
        return sharedPreferencesAppVersionCode.getInt(APP_VERSION_CODE,0); // As the default version code is 0
    }
}

언급URL : https://stackoverflow.com/questions/6593592/get-application-version-programmatically-in-android

반응형