2012-11-20 18 views
108

इंस्टॉल करने के बिना मैं एंड्रॉइडमैनीफेस्ट.एक्सएमएल फ़ाइल से एपीके के प्रोग्रामेटिक संस्करण कोड या संस्करण का नाम कैसे डाउनलोड कर सकता हूं और इंस्टॉल किए बिना।एंड्रॉइड .एपीके फ़ाइल प्राप्त करें संस्करण नाम या संस्करण कोड एपीके

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="xxx.xx.xxx" 
    android:versionCode="1" 
    android:versionName="1.1" > 
उदाहरण मैं अगर एक नया संस्करण है कि बाद मेरे आईआईएस सेवा पर अपलोड की गई है जाँच उपकरण पर इंस्टॉल, नहीं एक नया संस्करण है, तो मैं इसे स्थापित करने के लिए नहीं करना चाहते हैं के लिए

+0

यह जांचें http://stackoverflow.com/a/4761689/1109425 – nandeesh

+0

क्या आप सब कुछ खत्म कर चुके थे? मुझे एक ही समस्या का सामना करना पड़ रहा है। धन्यवाद! – Mathieu

+0

बीटीडब्ल्यू, मुझे उम्मीद है कि कोई भी फ़ाइल को डाउनलोड करने का अच्छा समाधान नहीं सोचता है, और * फिर * जांच करें कि इसकी आवश्यकता है या नहीं - पहला वाक्य क्या सुझाता है। संभवतः आप कोड चाहते हैं जो * आपके सर्वर * पर चलता है, और उपलब्ध संस्करण संख्या के साथ प्रतिक्रिया देता है। – ToolmakerSteve

उत्तर

4

अब मैं अपने बाइनरी एक्सएमएल डेटा से एपीके फ़ाइल के संस्करण को सफलतापूर्वक पुनर्प्राप्त कर सकता हूं।

यह विषय है, जहां मैं अपने जवाब के लिए महत्वपूर्ण हो गया (मैं भी ribo के कोड के अपने संस्करण जोड़ा): How to parse the AndroidManifest.xml file inside an .apk package

साथ ही, यहां XML पार्सिंग कोड मैंने लिखा विशेष रूप से संस्करण लाने के लिए दिया गया है:

XML पार्सिंग

/** 
* Verifies at Conductor APK path if package version if newer 
* 
* @return True if package found is newer, false otherwise 
*/ 
public static boolean checkIsNewVersion(String conductorApkPath) { 

    boolean newVersionExists = false; 

    // Decompress found APK's Manifest XML 
    // Source: https://stackoverflow.com/questions/2097813/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package/4761689#4761689 
    try { 

     if ((new File(conductorApkPath).exists())) { 

      JarFile jf = new JarFile(conductorApkPath); 
      InputStream is = jf.getInputStream(jf.getEntry("AndroidManifest.xml")); 
      byte[] xml = new byte[is.available()]; 
      int br = is.read(xml); 

      //Tree tr = TrunkFactory.newTree(); 
      String xmlResult = SystemPackageTools.decompressXML(xml); 
      //prt("XML\n"+tr.list()); 

      if (!xmlResult.isEmpty()) { 

       InputStream in = new ByteArrayInputStream(xmlResult.getBytes()); 

       // Source: http://developer.android.com/training/basics/network-ops/xml.html 
       XmlPullParser parser = Xml.newPullParser(); 
       parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); 

       parser.setInput(in, null); 
       parser.nextTag(); 

       String name = parser.getName(); 
       if (name.equalsIgnoreCase("Manifest")) { 

        String pakVersion = parser.getAttributeValue(null, "versionName"); 
          //NOTE: This is specific to my project. Replace with whatever is relevant on your side to fetch your project's version 
        String curVersion = SharedData.getPlayerVersion(); 

        int isNewer = SystemPackageTools.compareVersions(pakVersion, curVersion); 

        newVersionExists = (isNewer == 1); 
       } 

      } 
     } 

    } catch (Exception ex) { 
     android.util.Log.e(TAG, "getIntents, ex: "+ex); 
     ex.printStackTrace(); 
    } 

    return newVersionExists; 
} 

संस्करण तुलना नोट (पिछले स्निपेट में SystemPackageTools.compareVersions के रूप में देखा): यह कोड निम्न विषय से प्रेरित है: Efficient way to compare version strings in Java

/** 
* Compare 2 version strings and tell if the first is higher, equal or lower 
* Source: https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-strings-in-java 
* 
* @param ver1 Reference version 
* @param ver2 Comparison version 
* 
* @return 1 if ver1 is higher, 0 if equal, -1 if ver1 is lower 
*/ 
public static final int compareVersions(String ver1, String ver2) { 

    String[] vals1 = ver1.split("\\."); 
    String[] vals2 = ver2.split("\\."); 
    int i=0; 
    while(i<vals1.length&&i<vals2.length&&vals1[i].equals(vals2[i])) { 
     i++; 
    } 

    if (i<vals1.length&&i<vals2.length) { 
     int diff = Integer.valueOf(vals1[i]).compareTo(Integer.valueOf(vals2[i])); 
     return diff<0?-1:diff==0?0:1; 
    } 

    return vals1.length<vals2.length?-1:vals1.length==vals2.length?0:1; 
} 

मुझे आशा है कि इस मदद करता है।

+0

आपका कोड क्यों दिखता है? – forresthopkinsa

+0

क्या आपने नए ग्रैडल या एंड्रॉइड स्टूडियो में अपग्रेड किया है? क्या यह अभी भी काम करता है? रोबियो कोड अब मेरे लिए एक्सएमएल को डिकंप्रेस करने के लिए काम नहीं करता है। –

67
final PackageManager pm = getPackageManager(); 
String apkName = "example.apk"; 
String fullPath = Environment.getExternalStorageDirectory() + "/" + apkName;   
PackageInfo info = pm.getPackageArchiveInfo(fullPath, 0); 
Toast.makeText(this, "VersionCode : " + info.versionCode + ", VersionName : " + info.versionName , Toast.LENGTH_LONG).show(); 
+7

यह सबसे अच्छा जवाब है और इसे स्वीकार किया जाना चाहिए। –

+1

यह मेरे लिए काम नहीं किया – gian1200

+3

मैं आवेदन * इंस्टॉल किए बिना 'apk' सामग्री ** कैसे पढ़ सकता हूं? @PatrickCho – talha06

279

कमांड लाइन से मेरे लिए काम किया है:

aapt dump badging myapp.apk 

नोट: aapt.exe SDK का एक build-tools उप-फ़ोल्डर में पाया जाता है। उदाहरण के लिए:

<sdk_path>/build-tools/23.0.2/aapt.exe 
+0

यह सही काम किया और एक बहुत ही सरल समाधान था। धन्यवाद! – NateJC

+21

ठीक काम करता है, इसे सही उत्तर के रूप में चिह्नित किया जाना चाहिए, जानकारी के लिए, एसडीके में 'एपेट' * बिल्ड-टूल्स/एक्सएक्स * में है। –

+0

उपकरण या प्लेटफ़ॉर्म-टूल्स का एपेट कमांड हिस्सा है? – gmuhammad

3
EditText ET1 = (EditText) findViewById(R.id.editText1); 

    PackageInfo pinfo; 
    try { 
     pinfo = getPackageManager().getPackageInfo(getPackageName(), 0); 
     String versionName = pinfo.versionName; 
     ET1.setText(versionName); 
     //ET2.setText(versionNumber); 
    } catch (NameNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
+5

में था यह सवाल का जवाब नहीं है। यह कोड है कि, एक चल रहे ऐप के अंदर, कुछ संस्करण जानकारी प्राप्त होती है, और इसे प्रदर्शित करती है। प्रश्न यह है कि इस जानकारी को एपीके फ़ाइल से कैसे प्राप्त करें, * ऐप इंस्टॉल किए बिना *। – ToolmakerSteve

2

उन्नयन परिदृश्य के लिए विशेष रूप से एक वैकल्पिक दृष्टिकोण एक वेब सेवा है कि वर्तमान संस्करण संख्या बचाता है और वह जांच सिर्फ अपनी संस्करण की जांच करने के लिए पूरे apk डाउनलोड करने के बजाय करने के लिए हो सकता है। यह कुछ बैंडविड्थ को बचाएगा, थोड़ा और अधिक प्रदर्शनशील होगा (अगर एपीके से अधिक डाउनलोड करने के लिए बहुत तेज़ हो तो पूरे एपीके को अधिकतर समय की आवश्यकता नहीं है) और कार्यान्वित करने के लिए बहुत आसान है।

सरलतम रूप आप अपने सर्वर पर एक साधारण पाठ फ़ाइल हो सकता था में ... http://some-place.com/current-app-version.txt

कि पाठ फ़ाइल के अंदर की तरह

3.1.4 

और फिर कुछ ऐसा फ़ाइल डाउनलोड करें और के खिलाफ जांच हो वर्तमान में स्थापित संस्करण। आप संस्करण 2 का उपयोग कर रहे हैं, तो

{ 
    "current_version": "3.1.4" 
} 
+0

आप सही रास्ते पर हैं - फ़ाइल को डाउनलोड नहीं करना चाहिए, बस इसके संस्करण को प्राप्त करने के लिए। मैं सिर्फ यह उल्लेख करना चाहता हूं कि मैं मैन्युअल रूप से टेक्स्ट फ़ाइल बनाने की अनुशंसा नहीं करूंगा - यह वास्तविक एपीके फ़ाइल से मेल नहीं खाता है। इसके बजाय, एपीके के अंदर देखने के लिए एपीके के अंदर देखने के लिए एक स्क्रिप्ट लिखें (यह देखने के लिए कि आपके संस्करण क्या है, फ़ाइल या डेटाबेस में संग्रहीत करना, आपके द्वारा चर्चा के माध्यम से पुनर्प्राप्त किया जा सकता है। – ToolmakerSteve

+0

हाँ इस परिदृश्य में मामला यह नहीं है कि इसे एपीके से मेल खाना जरूरी है, बस नवीनतम संस्करण संख्या कहीं सार्वजनिक रूप से सुलभ है। – grego

24

:

कि करने के लिए एक और अधिक उन्नत समाधान का निर्माण एक उचित वेब सेवा को लागू करने और लॉन्च में API कॉल जो कुछ json लौटा सकता है, अर्थात http://api.some-place.com/versionCheck के लिए किया जाएगा।2 और एंड्रॉयड स्टूडियो तो एंड्रॉयड स्टूडियो में की ऊपर का उपयोग बिल्डविश्लेषण APK तो AndroidManifest.xml फ़ाइल का चयन करें।

+2

ओपी ने पूछा कि इसे 'प्रोग्रामेटिक रूप से' – forresthopkinsa

+1

कैसे प्राप्त करें क्योंकि उसे नहीं पता था कि इस तरह का टूल एंड्रॉइड स्टूडियो में बनाया गया है। उन्होंने एपीके * इंस्टॉल किए बिना * पूछा। – vovahost

+1

बेशक वह उसे नहीं जानता था, क्योंकि इस सवाल से पूछा गया था कि एंड्रॉइड स्टूडियो मौजूद नहीं था। इसके अतिरिक्त, यहां तक ​​कि अगर ऐसा होता है, तो यह उसकी समस्या का समाधान नहीं करता है - वह चाहता है कि वह अपने डिवाइस को * प्रोग्रामेटिक रूप से * अपने आईआईएस सर्वर से अद्यतनों की जांच करे, जैसा कि उन्होंने सवाल में कहा था। पैट्रिक चो का जवाब बताता है कि बिना प्रोग्राम किए इसे प्रोग्रामेटिक तरीके से कैसे किया जाए। – forresthopkinsa

संबंधित मुद्दे