获取Android .apk文件版本名或版本代码没有安装apk
我怎样才能从AndroidManifest.xml文件下载并没有安装它以编程方式获得apk的版本代码或版本名称。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxx.xx.xxx" android:versionCode="1" android:versionName="1.1" >
例如,我想检查一下,如果在我的IIS服务上安装了新版本,在我的IIS服务上安装它,如果不是新版本,我不想安装它。
以下从命令行为我工作:
aapt dump badging myapp.apk
注意:aapt.exe位于SDK的build-tools
子文件夹中。 例如:
<sdk_path>/build-tools/23.0.2/aapt.exe
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();
如果您使用的是Android Studio 2.2及更高版本,则在Android Studio中使用Build → Analyze APK,然后selectAndroidManifest.xml文件。
我现在可以成功从其二进制XML数据中检索APK文件的版本。
这个主题是我得到我的答案的关键(我也添加了我的版本的Ribo的代码): 如何parsing.apk包内的AndroidManifest.xml文件
另外,这里是我写的XMLparsing代码,专门用于获取版本:
XMLparsing
/** * 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)注意:此代码受以下主题的启发: 在Java中比较版本string的有效方法
/** * 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; }
我希望这有帮助。
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(); }
对于升级scheme,具体而言,另一种方法可能是提供一个提供当前版本号的Web服务,并检查是否下载整个apk只是为了检查其版本。 这将节省一些带宽,性能稍微高一点(如果大部分时间不需要整个apk,下载速度要快得多),而且要简单得多。
最简单的forms,你可以在你的服务器上有一个简单的文本文件… http://some-place.com/current-app-version.txt
里面的文本文件有类似的东西
3.1.4
然后下载该文件并检查当前安装的版本。
构build一个更高级的解决scheme将是实现一个适当的Web服务,并在启动时可以返回一些JSON,即http://api.some-place.com/versionCheck
api调用:
{ "current_version": "3.1.4" }
- Android上的SQLite和SharedPreferences文件有多安全?
- Android Java和Phonegap Javascript之间的通信?
- 创build自定义通知,android
- “无法打开日志设备”/ dev / log / main“:没有这样的文件或目录”
- 英特尔X86仿真器加速器(HAXM安装程序)VT / NX未启用
- Android:调用Camera Intent之后,活动正在销毁
- 如何发送和接收数据SMS消息
- Android – 使用自定义字体
- 错误:执行失败的任务':android:transformClassesAndResourcesWithProguardForRelease'