Android.APK Fichier VersionName ou VersionCode sans installer apk

Comment puis-je obtenir le code de version programmatique ou le nom de version de apk de AndroidManifest.fichier xml après le téléchargement et sans l'installer.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xx.xxx"
    android:versionCode="1"
    android:versionName="1.1" >

par exemple, je veux vérifier si une nouvelle version est téléchargée sur mon service IIS après l'avoir installé sur le périphérique, sinon une nouvelle version que je ne veux pas installer.

129
demandé sur Big.Child 2012-11-20 12:25:03

6 réponses

suivant a travaillé pour moi de la ligne de commande:

aapt dump badging myapp.apk

NOTE: aapt.exe se trouve dans un sous-dossier build-tools de SDK. Par exemple:

<sdk_path>/build-tools/23.0.2/aapt.exe
324
répondu Sileria 2017-02-07 18:08:58
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();
73
répondu Patrick Cho 2013-06-15 00:02:47

si vous utilisez version 2.2 et plus de Android Studio puis dans Android Studio utiliser construire analyser APK puis sélectionnez AndroidManifest.fichier xml.

30
répondu vovahost 2016-06-27 10:06:39

je peux maintenant récupérer avec succès la version D'un fichier APK à partir de ses données XML binaires.

ce sujet est où j'ai obtenu la clé de ma réponse (j'ai également ajouté ma version du code de Ribo): comment analyser L'AndroidManifest.fichier xml à l'intérieur d'un .paquet apk

de plus, voici le code D'analyse XML que j'ai écrit, spécifiquement pour récupérer la version:

XML Parsing

/**
 * 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: /q/how-to-parse-the-androidmanifest-xml-file-inside-an-apk-package-61199/"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;
}

comparaison de Version (vue comme SystemPackageTools.compar iversions dans des extraits précédents) NOTE: ce code est inspiré du thème suivant: manière efficace de comparer les chaînes de version en Java

/**
 * Compare 2 version strings and tell if the first is higher, equal or lower
 * Source: /q/efficient-way-to-compare-version-strings-in-java-duplicate-61857/"\.");
    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;
}

j'espère que cela aidera.

4
répondu Mathieu 2017-05-23 12:10:41
    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();
    }
2
répondu Wayne Len 2014-09-15 02:40:29

pour le scénario de mise à niveau spécifiquement une autre approche pourrait être d'avoir un service web qui fournit le numéro de version actuelle et de vérifier qu'au lieu de télécharger l'apk entier juste pour vérifier sa version. Il économiserait un peu de bande passante, serait un peu plus performant (beaucoup plus rapide à télécharger qu'un apk si l'ensemble de l'apk n'est pas nécessaire la plupart du temps) et beaucoup plus simple à mettre en œuvre.

dans la forme la plus simple vous pourriez avoir un fichier texte simple sur votre serveur... http://some-place.com/current-app-version.txt

à L'intérieur de ce fichier texte ont quelque chose comme

3.1.4

et ensuite télécharger ce fichier et vérifier par rapport à la version actuellement installée.

construire une solution plus avancée à cela serait de mettre en œuvre un service Web approprié et avoir un appel api au lancement qui pourrait retourner certains json, i.e. http://api.some-place.com/versionCheck :

{
    "current_version": "3.1.4"
}
2
répondu grego 2016-01-05 23:10:53