شرح - schemas android apk res




احصل على Android.apk file VersionName أو VersionCode بدون تثبيت apk (4)

كيف يمكنني الحصول على رمز إصدار برمجي أو اسم إصدار apk من ملف AndroidManifest.xml برمجيًا بعد التنزيل وبدون تثبيته.

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

على سبيل المثال ، أرغب في التحقق مما إذا كان يتم تحميل إصدار جديد على خدمة IIS الخاصة بي بعد تثبيته على الجهاز ، إن لم يكن إصدارًا جديدًا لا أريد تثبيته.


إذا كنت تستخدم الإصدار 2.2 والإصدارات الأحدث من Android Studio ، في Android Studio ، استخدم BuildAnalys APK ، ثم حدد ملف AndroidManifest.xml.


التالية عملت لي من سطر الأوامر:

aapt dump badging myapp.apk

ملاحظة: يتم العثور على aapt.exe في مجلد فرعي مكون من أدوات SDK. فمثلا:

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

يمكنني الآن بنجاح استرداد إصدار ملف APK من بيانات XML الثنائية الخاصة به.

هذا الموضوع هو المكان الذي حصلت فيه على مفتاح إجابتي (لقد أضفت أيضًا إصدار روتي من Ribo ): كيفية تحليل ملف AndroidManifest.xml داخل حزمة .apk

بالإضافة إلى ذلك ، إليك شفرة تحليل 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://.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

/**
 * Compare 2 version strings and tell if the first is higher, equal or lower
 * Source: https://.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();
    }






apk