Get Android .apk file VersionName or VersionCode WITHOUT installing apk

前端 未结 9 2571
鱼传尺愫
鱼传尺愫 2020-11-28 17:32

How can I get programmatically get the version code or version name of my apk from the AndroidManifest.xml file after downloading it and without installing it.



        
9条回答
  •  萌比男神i
    2020-11-28 18:23

    I can now successfully retrieve the version of an APK file from its binary XML data.

    This topic is where I got the key to my answer (I also added my version of Ribo's code): How to parse the AndroidManifest.xml file inside an .apk package

    Additionally, here's the XML parsing code I wrote, specifically to fetch the 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: 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;
    }
    

    Version Comparison (seen as SystemPackageTools.compareVersions in previous snippet) NOTE: This code is inspired from the following topic: 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

    I hope this helps.

提交回复
热议问题