android - अपने एंड्रॉइड एप्लिकेशन का निर्माण/संस्करण संख्या कैसे प्राप्त करें?




android-emulator android-manifest (16)

Gradle और BuildConfig का उपयोग करना

BuildConfig से VERSION_NAME प्राप्त करना

BuildConfig.VERSION_NAME

हाँ, यह अब इतना आसान है।

क्या यह VERSION_NAME के ​​लिए एक खाली स्ट्रिंग लौटा रहा है?

यदि आपको BuildConfig.VERSION_NAME लिए खाली स्ट्रिंग मिल रही है तो पढ़ें।

मैं BuildConfig.VERSION_NAME लिए एक खाली स्ट्रिंग प्राप्त कर रहा था क्योंकि मैं अपनी ग्रेड बिल्ड फ़ाइल में versionName स्थापित नहीं कर रहा था (मैं एएनटी से ग्रैडल में माइग्रेट हुआ)। इसलिए, यह सुनिश्चित करने के लिए निर्देश दिए गए हैं कि आप अपने VERSION_NAME को Gradle के माध्यम से सेट कर रहे हैं।

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}"
  }

}

नोट: यह कुशल जेक व्हार्टन से है

AndroidManifest.xml से versionCode और versionCode हटा रहा है

और चूंकि आपने build.gradle फ़ाइल में versionCode और versionCode सेट किया है, इसलिए यदि आप वहां हैं तो आप उन्हें अपने AndroidManifest.xml फ़ाइल से भी निकाल सकते हैं।

मुझे यह पता लगाने की ज़रूरत है कि मेरे एंड्रॉइड एप्लिकेशन के लिए बिल्ड नंबर कैसे प्राप्त करें या कैसे करें। मुझे UI में प्रदर्शित करने के लिए बिल्ड नंबर की आवश्यकता है।

क्या मुझे AndroidManifest.xml साथ कुछ करना है?


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;
}

इस कोड का उपरोक्त टुकड़ों में उल्लेख किया गया था लेकिन यहां यह सब फिर से शामिल है। आपको एक कोशिश / पकड़ ब्लॉक की आवश्यकता है क्योंकि यह "NameNotFoundException" फेंक सकता है।

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

मुझे उम्मीद है कि यह सड़क के नीचे किसी के लिए चीजों को सरल बनाता है। :)


इसको आजमाओ:

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

एक बहुत ही सरल तरीका है:

private String appVersion = BuildConfig.VERSION_NAME;

कोई भी जिसने एप्लिकेशन के यूआई के लिए बिल्डकॉन्फिग जानकारी की आवश्यकता नहीं है, हालांकि सीआई जॉब कॉन्फ़िगरेशन या दूसरों की तरह मेरे लिए इन जानकारी का उपयोग करना चाहता है।

जब तक आप अपनी परियोजना को सफलतापूर्वक बनाते हैं, तब तक आपकी प्रोजेक्ट निर्देशिका के तहत BuildConfig.java स्वचालित रूप से जेनरेट की गई फ़ाइल होती है।

{WORKSPACE} / निर्माण / उत्पन्न / स्रोत / buildConfig / {डिबग | रिहाई} / {पैकेज} /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)

कृपया मेरी सीमित अंग्रेजी क्षमता से क्षमा करें, लेकिन उम्मीद है कि इससे मदद मिलती है।


प्रथम:

import android.content.pm.PackageManager.NameNotFoundException;

और फिर इसका उपयोग करें:

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

मैंने वरीयता वर्ग का उपयोग करके इसे हल किया है।

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);
        }
    }
}

यदि आप ग्रेड 0.7.0 के रूप में BuildConfig प्लगइन / एंड्रॉइड स्टूडियो का उपयोग कर रहे हैं, तो संस्करण कोड और संस्करण का नाम BuildConfig में स्थिर रूप से उपलब्ध है। सुनिश्चित करें कि आप अपने ऐप के पैकेज को आयात करते हैं , न कि कोई अन्य BuildConfig :

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

कोई संदर्भ वस्तु की आवश्यकता नहीं है!

AndroidManifest.xml की बजाय उन्हें अपनी build.gradle फ़ाइल में निर्दिष्ट करना भी सुनिश्चित करें।

defaultConfig {
    versionCode 1
    versionName "1.0"
}

यदि आप फोनगैप का उपयोग कर रहे हैं, तो एक कस्टम फोनगैप प्लगइन बनाएं:

अपने ऐप के पैकेज में एक नई कक्षा बनाएं:

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());
});

फिर, आप संस्करण नाम संस्करण कर सकते हैं:

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

here और here से व्युत्पन्न।


संस्करण कोड प्राप्त करने का तरीका यहां दिया गया है:

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;
}

स्कॉटियाब (ज़वी द्वारा संपादित) के समाधान के आधार पर यहां एक साफ समाधान है । यह दिखाता है कि संदर्भ को पहले कैसे प्राप्त किया जाए, अगर यह आपकी विधि द्वारा प्रदान नहीं किया गया है। इसके अलावा यह प्रति पंक्ति एकाधिक विधियों को कॉल करने के बजाय कई लाइनों का उपयोग करता है। इससे आपको एप्लिकेशन को डीबग करना आसान हो जाता है।

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 में संस्करण का नाम प्राप्त कर myVersionName , तो आप उसे myVersionName या जो भी चाहें सेट कर सकते हैं ..

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

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();
}
  1. इसे उत्पन्न BuildConfig.java से प्राप्त करें। लेकिन ध्यान दें, कि यदि आप लाइब्रेरी में इस मान को एक्सेस करेंगे तो यह लाइब्रेरी संस्करण लौटाएगा, न कि ऐप एक, जो इस लाइब्रेरी का उपयोग करता है। तो केवल गैर पुस्तकालय परियोजनाओं में उपयोग करें!
String versionName = BuildConfig.VERSION_NAME;
int versionCode = BuildConfig.VERSION_CODE;

पुस्तकालय परियोजना में दूसरे तरीके का उपयोग करने के अलावा, कुछ विवरण हैं। नई एंड्रॉइड ग्रेडल प्लगइन (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 में मानों को सही ढंग से सेट करेगा, लेकिन BuildConfig से आपको 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
    }
}

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

BuildConfig.VERSION_NAME //version name from your build file
BuildConfig.VERSION_CODE //version code from your build file

मुझे पैकेज प्रबंधक से इसे प्राप्त करने की आवश्यकता नहीं दिख रही है


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;
        }
    }





android-manifest