안드로이드 애플리케이션의 빌드/버전 번호는 어떻게 얻을 수 있습니까?
안드로이드 애플리케이션의 빌드 번호를 가져오거나 만드는 방법을 알아내야 합니다.UI에 표시할 빌드 번호가 필요합니다.
제가 무슨 일을 해야 하나요?AndroidManifest.xml
?
버전 0.7.0에서 Gradle 플러그인/Android Studio를 사용하는 경우 버전 코드와 버전 이름은 다음에서 정적으로 사용할 수 있습니다.BuildConfig
다른 패키지가 아닌 앱의 패키지를 가져오는지 확인합니다.BuildConfig
:
import com.yourpackage.BuildConfig;
...
int versionCode = BuildConfig.VERSION_CODE;
String versionName = BuildConfig.VERSION_NAME;
컨텍스트 개체가 필요하지 않습니다!
▁your▁them에 그것들을 반드시 지정해야 .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;
}
필요한 부품은 두 가지입니다.
- 안드로이드:versionCode
- 안드로이드:버전Name
versionCode는 숫자이며, 시장에 제출하는 앱의 모든 버전은 이전 버전보다 높은 숫자를 가져야 합니다.
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)
Java:
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
그고당설이정후로한이신리▁the▁you이후로▁since▁and'▁setve설한정.versionName
그리고.versionCode
에 시대에build.gradle
지금 파일, 당신은 또한 그것들을 당신의 것에서 제거할 수 있습니다.AndroidManifest.xml
파일(있는 경우).
Scottyab(Xavi 편집)의 솔루션을 기반으로 한 깨끗한 솔루션이 있습니다.사용자의 방법으로 제공되지 않는 경우 컨텍스트를 먼저 가져오는 방법을 보여 줍니다.또한 회선당 여러 메서드를 호출하는 대신 여러 회선을 사용합니다.이렇게 하면 응용프로그램을 디버그해야 할 때 더 쉽게 실행할 수 있습니다.
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();
}
이제 문자열에서 버전 이름을 받았습니다.myVersionName
텍스트 보기 또는 원하는 대로 설정할 수 있습니다.
// 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;
코틀린 한 줄기
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
당신의 반으로.
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"
}
2020년 기준: API 28(Android 9(Pie))에서 "versionCode"는 사용되지 않으므로 "longVersionCode"를 사용할 수 있습니다.
코틀린의 샘플 코드
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
}
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" />
장치 준비 이벤트에서 다음 코드를 추가합니다.
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
}
);
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";
}
아니요, AndroidManifest.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();
}
버전 이름 : 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 사용자의 경우 이 코드를 사용하여 버전 이름과 코드를 가져옵니다.
버전 이름:
public string getVersionName(){ return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionName; }
버전 코드:
public string getVersionCode(){ return Application.Context.ApplicationContext.PackageManager.GetPackageInfo(Application.Context.ApplicationContext.PackageName, 0).VersionCode; }
이 질문에는 두 가지 다른 시나리오가 있는데, 이 시나리오는 어떤 답변에서도 제대로 해결되지 않았습니다.
시나리오 1: 모듈을 사용하지 않습니다.
모듈을 사용하지 않는 경우 BuildConfig 파일에 액세스하여 다음을 사용하여 버전 코드를 즉시 가져올 수 있습니다.
val versionCode = BuildConfig.VERSION_CODE
이 파일은 응용 프로그램 수준의 BuildConfig 파일이므로 유효합니다. 따라서 응용 프로그램 버전 코드에 대한 참조가 포함됩니다.
시나리오 2: 앱에 많은 모듈이 있으며 모듈 계층의 하위 모듈에서 응용 프로그램 버전 코드에 액세스하는 것처럼 가장합니다.
app -> data -> domain -> ui 등 주어진 계층 구조를 가진 모듈이 많은 것이 일반적입니다.이 경우 "ui" 모듈에서 BuildConfig 파일에 액세스하면 앱 버전 코드가 아닌 해당 모듈의 버전 코드에 대한 참조가 제공됩니다.
응용 프로그램 버전 코드를 얻기 위해 지정된 코틀린 확장 함수를 사용할 수 있습니다.
fun Activity.getVersionCode(): Int = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
packageManager.getPackageInfo(packageName, 0).longVersionCode.toInt()
} else {
packageManager.getPackageInfo(packageName, 0).versionCode
}
버전 이름에 대한 접근 방식은 유사합니다.
fun Activity.getVersionName(): String = try {
packageManager?.getPackageInfo(packageName, 0)?.versionName ?: ""
} catch (e: PackageManager.NameNotFoundException) {
""
}
항상 a와 함께 수행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
계획적으로
다음에서 버전 가져오기
PackageManager
대부분의 경우 이 방법이 가장 좋습니다.try { String versionName = packageManager.getPackageInfo(packageName, 0).versionName; int versionCode = packageManager.getPackageInfo(packageName, 0).versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }
생성된 항목에서 가져오기
BuildConfig.java
그러나 라이브러리에서 이 값에 액세스할 경우 이 라이브러리를 사용하는 라이브러리 버전이 아닌 애플리케이션 버전이 반환됩니다.따라서 비도서관 프로젝트에서만 사용하십시오!String versionName = BuildConfig.VERSION_NAME; int versionCode = BuildConfig.VERSION_CODE;
도서관 프로젝트에서 두 번째 방법을 사용하는 것을 제외하고는 몇 가지 세부 사항이 있습니다.새로운 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 {
String appVersion = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
}
catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
이것이 앞으로 누군가를 위해 일을 단순화하기를 바랍니다.:)
그러나 응용 프로그램 UI에 BuildConfig 정보가 필요하지 않은 사용자는 이 정보를 사용하여 CI 작업 구성을 설정하거나 저와 같은 다른 작업 구성을 설정하고자 합니다.
프로젝트를 성공적으로 빌드하기만 하면 프로젝트 디렉터리 아래에 자동으로 생성된 BuildConfig.java 파일이 있습니다.
{WORKspace}/빌드/생성/소스/빌드구성/{debug|release}/{패키지}/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();
}
코틀린의 예:
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;
언급URL : https://stackoverflow.com/questions/4616095/how-can-you-get-the-build-version-number-of-your-android-application
'itsource' 카테고리의 다른 글
Gitrebase 병합 충돌을 계속할 수 없습니다. (0) | 2023.06.26 |
---|---|
봄 보안 오류: java.lang.잘못된 상태 예외:요청을 구성할 수 없습니다. (0) | 2023.06.26 |
원격 분기가 "git branch -r"에 표시되지 않습니다. (0) | 2023.06.26 |
Gitrebase에 대한 병합 전략을 선택하려면 어떻게 해야 합니까? (0) | 2023.06.26 |
커밋 순서 변경 (0) | 2023.06.26 |