Einige von APP verwendete Tools und Kenntnisse

1. Sehen Sie sich den Versionscode von Android an

Lesen Sie im Allgemeinen aus androidmanifest.xml und verwenden Sie die Tools AXMLPrinter.jar und AXMLPrinter2.jar online. Der Autor des Maven Warehouse ist dieselbe Person

AXMLPrinter2.jar apk analysiert die APK-Datei und ruft den Paketnamen, die Versionsnummer und das Symbol in der APK-Datei ab. Es ist ein sehr leistungsfähiges Tool, und ich spüre wieder einmal die Leistungsfähigkeit der Stapelverarbeitung. Es kann die von Android kompilierte binäre XML-Datei (binäre XML-Datei) dekompilieren und im Klartext ausgeben und speichern. Es ist eines der notwendigen Tools für die APK-Dekompilierung und -Änderung. Wenn Sie beispielsweise die Berechtigung und den Namen des APK-Installationspakets überprüfen müssen, können Sie AXMLPrinter2 verwenden, um androidmanifest.xml zu dekompilieren und es im Klartext anzuzeigen. Die Dekompilierungsgeschwindigkeit ist sehr schnell und einfach zu verwenden, und die .XML-Datei kann reibungslos kompiliert werden.
CMD-Ausführungsbefehl: java -jar AXMLPrinter.jar AndroidManifest.xml 

Java-Code:

@Slf4j
public class ApkUtil {
    private static final String DIMENSION_UNITS[] = { "px", "dip", "sp", "pt", "in", "mm", "", "" };
    private static final String FRACTION_UNITS[]  = { "%", "%p", "", "", "", "", "", "" };
    private static final float  RADIX_MULTS[]     = { 0.00390625F, 3.051758E-005F, 1.192093E-007F, 4.656613E-010F };
    
    /********
     * 使用axmlprinter2-1.21.jar解析
     *******/
    public static Map<String, Object> readAPK(File apkFile) {
        ZipFile zipFile = null;
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            zipFile = new ZipFile(apkFile);
            Enumeration<?> enumeration = zipFile.entries();

            ZipEntry zipEntry = null;
            while (enumeration.hasMoreElements()) {
                zipEntry = (ZipEntry) enumeration.nextElement();
                if (zipEntry.isDirectory()) {

                } else {
                    if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
                        AXmlResourceParser parser = new AXmlResourceParser();
                        parser.open(zipFile.getInputStream(zipEntry));

                        while (true) {
                            int type = parser.next();
                            if (type == XmlPullParser.END_DOCUMENT) {
                                break;
                            }
                            String name = parser.getName();
                            if (null != name && name.toLowerCase().equals("manifest")) {
                                for (int i = 0; i != parser.getAttributeCount(); i++) {
                                    if ("versionName".equals(parser.getAttributeName(i))) {
                                        String versionName = getAttributeValue(parser, i);
                                        if (null == versionName) {
                                            versionName = "";
                                        }
                                        map.put("versionName", versionName);
                                    } else if ("package".equals(parser.getAttributeName(i))) {
                                        String packageName = getAttributeValue(parser, i);
                                        if (null == packageName) {
                                            packageName = "";
                                        }
                                        map.put("package", packageName);
                                    } else if ("versionCode".equals(parser.getAttributeName(i))) {
                                        String versionCode = getAttributeValue(parser, i);
                                        if (null == versionCode) {
                                            versionCode = "";
                                        }
                                        map.put("versionCode", versionCode);
                                    }
                                }
                                break;
                            }
                        }
                    }

                }
            }
            zipFile.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                zipFile.close();
            } catch (IOException e) {
                log.error("error", e);
            }
        }
        return map;
    }

    public static String readAPK(File apkFile, String attributeName) {
        ZipFile zipFile = null;
        try {
            zipFile = new ZipFile(apkFile);
            Enumeration<?> enumeration = zipFile.entries();

            ZipEntry zipEntry = null;
            while (enumeration.hasMoreElements()) {
                zipEntry = (ZipEntry) enumeration.nextElement();
                if (zipEntry.isDirectory()) {

                } else {
                    if ("androidmanifest.xml".equals(zipEntry.getName().toLowerCase())) {
                        AXmlResourceParser parser = new AXmlResourceParser();
                        parser.open(zipFile.getInputStream(zipEntry));

                        while (true) {
                            int type = parser.next();
                            if (type == XmlPullParser.END_DOCUMENT) {
                                break;
                            }
                            String name = parser.getName();
                            if (null != name && name.toLowerCase().equals("manifest")) {
                                for (int i = 0; i != parser.getAttributeCount(); i++) {
                                    if (attributeName.equals(parser.getAttributeName(i))) {
                                        String value = getAttributeValue(parser, i);
                                        return value;
                                    }
                                }
                                break;
                            }
                        }
                    }

                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                zipFile.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private static String getAttributeValue(AXmlResourceParser parser, int index) {
        int type = parser.getAttributeValueType(index);
        int data = parser.getAttributeValueData(index);
        if (type == TypedValue.TYPE_STRING) {
            return parser.getAttributeValue(index);
        }
        if (type == TypedValue.TYPE_ATTRIBUTE) {
            return String.format("?%s%08X", getPackage(data), data);
        }
        if (type == TypedValue.TYPE_REFERENCE) {
            return String.format("@%s%08X", getPackage(data), data);
        }
        if (type == TypedValue.TYPE_FLOAT) {
            return String.valueOf(Float.intBitsToFloat(data));
        }
        if (type == TypedValue.TYPE_INT_HEX) {
            return String.format("0x%08X", data);
        }
        if (type == TypedValue.TYPE_INT_BOOLEAN) {
            return data != 0 ? "true" : "false";
        }
        if (type == TypedValue.TYPE_DIMENSION) {
            return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
        }
        if (type == TypedValue.TYPE_FRACTION) {
            return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK];
        }
        if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) {
            return String.format("#%08X", data);
        }
        if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) {
            return String.valueOf(data);
        }
        return String.format("<0x%X, type 0x%02X>", data, type);
    }

    private static String getPackage(int id) {
        if (id >>> 24 == 1) {
            return "android:";
        }
        return "";
    }

    // / ILLEGAL STUFF, DONT LOOK :)
    private static float complexToFloat(int complex) {
        return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3];
    }





    public static void main(String args[]) {
        String path = "D:\\公司\\z直营\\魔豆\\发布压缩包\\com.example.myapplicationentry.apk";
        System.out.println(readAPK(new File(path)));
    }
}

 

 

 

 

Ich denke du magst

Origin blog.csdn.net/lan861698789/article/details/115561596
Empfohlen
Rangfolge