Obtenir le fichier .apk Android VersionName ou VersionCode SANS installer apk

Comment puis-je obtenir le code de version par programme ou le nom de version de l’apk à partir du fichier AndroidManifest.xml après le téléchargement et sans l’installer.

 

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

Suivant a travaillé pour moi depuis la ligne de commande:

 aapt dump badging myapp.apk 

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

 /build-tools/23.0.2/aapt.exe 
 final PackageManager pm = getPackageManager(); Ssortingng apkName = "example.apk"; Ssortingng fullPath = Environment.getExternalStorageDirectory() + "/" + apkName; PackageInfo info = pm.getPackageArchiveInfo(fullPath, 0); Toast.makeText(this, "VersionCode : " + info.versionCode + ", VersionName : " + info.versionName , Toast.LENGTH_LONG).show(); 

Si vous utilisez la version 2.2 ou supérieure d’ Android Studio, alors dans Android Studio, utilisez BuildAnalyze APK, puis sélectionnez le fichier AndroidManifest.xml.

Je peux maintenant récupérer avec succès la version d’un fichier APK à partir de ses données XML binarys.

Ce sujet est l’endroit où j’ai trouvé la clé de ma réponse (j’ai également ajouté ma version du code de Ribo): Comment parsingr le fichier AndroidManifest.xml dans un package .apk

En outre, voici le code d’parsing XML que j’ai écrit, en particulier pour récupérer la version:

Analyse XML

 /** * Verifies at Conductor APK path if package version if newer * * @return True if package found is newer, false otherwise */ public static boolean checkIsNewVersion(Ssortingng 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(); Ssortingng 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(); Ssortingng name = parser.getName(); if (name.equalsIgnoreCase("Manifest")) { Ssortingng pakVersion = parser.getAtsortingbuteValue(null, "versionName"); //NOTE: This is specific to my project. Replace with whatever is relevant on your side to fetch your project's version Ssortingng 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.compareVersions dans l’extrait de code précédent) REMARQUE: Ce code est inspiré de la rubrique suivante: Méthode efficace de comparaison de chaînes de version en Java

 /** * Compare 2 version ssortingngs and tell if the first is higher, equal or lower * Source: https://stackoverflow.com/questions/6701948/efficient-way-to-compare-version-ssortingngs-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(Ssortingng ver1, Ssortingng ver2) { Ssortingng[] vals1 = ver1.split("\\."); Ssortingng[] vals2 = ver2.split("\\."); int i=0; while(i 

J'espère que ça aide.

  EditText ET1 = (EditText) findViewById(R.id.editText1); PackageInfo pinfo; try { pinfo = getPackageManager().getPackageInfo(getPackageName(), 0); Ssortingng versionName = pinfo.versionName; ET1.setText(versionName); //ET2.setText(versionNumber); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Pour le scénario de mise à niveau, une approche alternative pourrait consister à avoir un service Web fournissant le numéro de version actuel et à vérifier cela au lieu de télécharger l’intégralité de l’apk juste pour vérifier sa version. Cela économiserait de la 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 simple fichier texte sur votre serveur … http://some-place.com/current-app-version.txt

A l’intérieur de ce fichier texte, il y a quelque chose comme

 3.1.4 

puis téléchargez ce fichier et vérifiez la version actuellement installée.

Créer une solution plus avancée à ce problème consisterait à implémenter un service Web approprié et à lancer un appel api au lancement qui pourrait renvoyer des fichiers json, par exemple http://api.some-place.com/versionCheck :

 { "current_version": "3.1.4" }