{"id":4686,"date":"2021-09-03T10:37:34","date_gmt":"2021-09-03T02:37:34","guid":{"rendered":"http:\/\/122.152.205.50\/wordpress\/?p=4686"},"modified":"2021-09-03T10:52:45","modified_gmt":"2021-09-03T02:52:45","slug":"apk%e5%8a%a0%e5%9b%ba%e5%8e%9f%e7%90%86","status":"publish","type":"post","link":"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686","title":{"rendered":"APK\u52a0\u56fa\u539f\u7406"},"content":{"rendered":"<p><a class=\"wp-editor-md-post-content-link\" href=\"http:\/\/blog.itpub.net\/31562043\/viewspace-2284074\/\">http:\/\/blog.itpub.net\/31562043\/viewspace-2284074\/<\/a><br \/>\n<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/tabactivity\/article\/details\/50435140\">https:\/\/blog.csdn.net\/tabactivity\/article\/details\/50435140<\/a><\/p>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/chenya866\/article\/details\/79355156\">https:\/\/blog.csdn.net\/chenya866\/article\/details\/79355156<\/a> (\u5206\u6790\u4e86\u5404\u5927\u52a0\u5bc6\u4ea7\u54c1\u7684\u5171\u6027)<\/p>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/androidsecurity\/article\/details\/8678399\">https:\/\/blog.csdn.net\/androidsecurity\/article\/details\/8678399<\/a><br \/>\n<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/zzx410527\/article\/details\/51673908\">https:\/\/blog.csdn.net\/zzx410527\/article\/details\/51673908<\/a> \uff08\u4e0d\u843d\u5730\u5f0f\u52a0\u8f7ddex\uff09<\/p>\n<p>\u6700\u65b0\u5404\u5927apk\u52a0\u56fa\u7279\u5f81\u5e93<br \/>\n<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/g5703129\/article\/details\/85054405\">https:\/\/blog.csdn.net\/g5703129\/article\/details\/85054405<\/a><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_16 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#%E9%80%9A%E8%BF%87%E7%BB%99ClassLoader%E5%8A%A0%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90APK%E5%8A%A0%E5%9B%BA%E5%8E%9F%E7%90%86\" title=\"\u901a\u8fc7\u7ed9ClassLoader\u52a0\u65e5\u5fd7\u5206\u6790APK\u52a0\u56fa\u539f\u7406\">\u901a\u8fc7\u7ed9ClassLoader\u52a0\u65e5\u5fd7\u5206\u6790APK\u52a0\u56fa\u539f\u7406<\/a><ul class=\"ez-toc-list-level-2\"><li class=\"ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#1%E7%BB%99%E5%90%84%E4%B8%AAClassLoader%E5%8A%A0%E4%B8%8A%E6%97%A5%E5%BF%97\" title=\"1.\u7ed9\u5404\u4e2aClassLoader\u52a0\u4e0a\u65e5\u5fd7\">1.\u7ed9\u5404\u4e2aClassLoader\u52a0\u4e0a\u65e5\u5fd7<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#2%E7%BB%99DexFile%E7%9B%B8%E5%85%B3%E7%B1%BB%E5%8A%A0%E4%B8%8A%E6%97%A5%E5%BF%97\" title=\"2.\u7ed9DexFile\u76f8\u5173\u7c7b\u52a0\u4e0a\u65e5\u5fd7\">2.\u7ed9DexFile\u76f8\u5173\u7c7b\u52a0\u4e0a\u65e5\u5fd7<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#3%E5%AE%89%E8%A3%85%E4%B8%80%E4%B8%AA%E6%99%AE%E9%80%9A%E7%9A%84%E6%B2%A1%E6%9C%89%E5%8A%A0%E5%9B%BA%E7%9A%84app%EF%BC%88%E7%9B%B4%E6%8E%A5%E4%BB%8Eas%E4%B8%8Arun%EF%BC%89\" title=\"3.\u5b89\u88c5\u4e00\u4e2a\u666e\u901a\u7684\u6ca1\u6709\u52a0\u56fa\u7684app\uff08\u76f4\u63a5\u4eceas\u4e0arun\uff09\">3.\u5b89\u88c5\u4e00\u4e2a\u666e\u901a\u7684\u6ca1\u6709\u52a0\u56fa\u7684app\uff08\u76f4\u63a5\u4eceas\u4e0arun\uff09<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-2\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#4%E5%AE%89%E8%A3%85%E5%8A%A0%E5%9B%BA%E7%9A%84app\" title=\"4.\u5b89\u88c5\u52a0\u56fa\u7684app\">4.\u5b89\u88c5\u52a0\u56fa\u7684app<\/a><ul class=\"ez-toc-list-level-3\"><li class=\"ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4686\/#%E7%94%A8pDexFile%E5%B0%86dex%E6%90%9E%E5%87%BA%E6%9D%A5%E7%9C%8B%E7%9C%8B\" title=\"\u7528pDexFile\u5c06dex\u641e\u51fa\u6765\u770b\u770b\">\u7528pDexFile\u5c06dex\u641e\u51fa\u6765\u770b\u770b<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"%E9%80%9A%E8%BF%87%E7%BB%99ClassLoader%E5%8A%A0%E6%97%A5%E5%BF%97%E5%88%86%E6%9E%90APK%E5%8A%A0%E5%9B%BA%E5%8E%9F%E7%90%86\"><\/span>\u901a\u8fc7\u7ed9ClassLoader\u52a0\u65e5\u5fd7\u5206\u6790APK\u52a0\u56fa\u539f\u7406<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<h2><span class=\"ez-toc-section\" id=\"1%E7%BB%99%E5%90%84%E4%B8%AAClassLoader%E5%8A%A0%E4%B8%8A%E6%97%A5%E5%BF%97\"><\/span>1.\u7ed9\u5404\u4e2aClassLoader\u52a0\u4e0a\u65e5\u5fd7<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u5728android4.4\u6e90\u7801\u91cc\u6211\u5728DexClassLoader\u3001BaseDexClassLoader\u3001ClassLoader\u5747\u52a0\u4e86\u65e5\u5fd7\uff0c\u6240\u6709\u7684\u5730\u65b9\u90fd\u8981\u5c06dexPath\u5224\u65ad\u4e00\u4e0b\u518d\u8f93\u51fa\u65e5\u5fd7\uff0c\u5426\u5219\u7cfb\u7edf\u65e0\u6cd5\u6b63\u5e38\u542f\u52a8\u3002<br \/>\n<strong>\u52a0\u65e5\u5fd7\u7684\u76ee\u7684<\/strong>\uff1a\u5982\u679c360\u4f7f\u7528\u4e86\u81ea\u5b9a\u4e49\u7684ClassLoader\uff0c\u5c31\u80fd\u77e5\u9053\u3002<br \/>\n- ClassLoader<br \/>\n\u6e90\u7801\u76ee\u5f551\uff1alibcore\/libdvm\/src\/main\/java\/java\/lang<br \/>\n\u6e90\u7801\u76ee\u5f552\uff1alibcore\/libart\/src\/main\/java\/java\/lang<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1alibcore<\/p>\n<p>\u91cd\u8f7d\u4e86\u4e00\u4e2adexPath\u7684\u6784\u9020\u65b9\u6cd5\uff0c\u7ed9BaseDexClassLoader\u8c03\u7528\uff0c\u4e24\u4e2a\u76ee\u5f55\u7684ClassLoader\u90fd\u8981\u4fee\u6539\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">    \/**\n     * CZ define\n     * @param parentLoader\n     * @param dexPath\n     *\/\n    protected ClassLoader(ClassLoader parentLoader,String dexPath) {\n        this(parentLoader, false);\n        if(dexPath.startsWith(\"\/data\/app\/\")){\n            Logger logger = Logger.getLogger(\"CZLogQiHu4444444\");\n            logger.warning(\"ClassLoader: \" + \",dexPath = \" + dexPath + \",name = \" + getClass().getName());\n        }\n    }\n<\/code><\/pre>\n<ul>\n<li>BaseDexClassLoader<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1alibcore\/dalvik\/src\/main\/java\/dalvik\/system<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1alibcore<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">  public BaseDexClassLoader(String dexPath, File optimizedDirectory,\n            String libraryPath, ClassLoader parent) {\n        super(parent,dexPath);\n        \/\/super(parent);\n        this.pathList = new DexPathList(this, dexPath, libraryPath, optimizedDirectory);\n\n        if(dexPath.startsWith(\"\/data\/app\/\")){\n            Logger logger = Logger.getLogger(\"CZLogQiHu111\");\n            logger.warning(\"BaseDexClassLoader: \" + \",dexPath = \" + dexPath  + \"\\npathList = \" + pathList + \",name = \" + getClass().getName());\n        }\n\n    }\n<\/code><\/pre>\n<ul>\n<li>DexClassLoader<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1alibcore\/dalvik\/src\/main\/java\/dalvik\/system<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1alibcore<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">  public DexClassLoader(String dexPath, String optimizedDirectory,\n            String libraryPath, ClassLoader parent) {\n        super(dexPath, new File(optimizedDirectory), libraryPath, parent);\n     if(dexPath.startsWith(\"\/data\/app\/\")){\n            Logger logger = Logger.getLogger(\"CZLogQiHu2222\");\n            logger.warning(\"DexClassLoader: \" + \",dexPath = \" + dexPath + \",optimizedDirectory = \" + optimizedDirectory +\n        \",libraryPath = \" + libraryPath + \",name = \" + getClass().getName()\n        );\n        }\n    }\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"2%E7%BB%99DexFile%E7%9B%B8%E5%85%B3%E7%B1%BB%E5%8A%A0%E4%B8%8A%E6%97%A5%E5%BF%97\"><\/span>2.\u7ed9DexFile\u76f8\u5173\u7c7b\u52a0\u4e0a\u65e5\u5fd7<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<ul>\n<li>DexFile.java<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1alibcore\/dalvik\/src\/main\/java\/dalvik\/system<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1alibcore<\/li>\n<\/ul>\n<pre><code class=\"language-c line-numbers\">    static public DexFile loadDex(String sourcePathName, String outputPathName,\n        int flags) throws IOException {\n\n        \/*\n         * TODO: we may want to cache previously-opened DexFile objects.\n         * The cache would be synchronized with close().  This would help\n         * us avoid mapping the same DEX more than once when an app\n         * decided to open it multiple times.  In practice this may not\n         * be a real issue.\n         *\/\n        log(\"DexFile loadDex:sourcePathName = \" + sourcePathName + \",outputPathName = \" + outputPathName);\n        return new DexFile(sourcePathName, outputPathName, flags);\n    }\n<\/code><\/pre>\n<pre><code class=\"language-c line-numbers\">  private DexFile(String sourceName, String outputName, int flags) throws IOException {\n        if (outputName != null) {\n            try {\n                String parent = new File(outputName).getParent();\n                if (Libcore.os.getuid() != Libcore.os.stat(parent).st_uid) {\n                    throw new IllegalArgumentException(\"Optimized data directory \" + parent\n                            + \" is not owned by the current user. Shared storage cannot protect\"\n                            + \" your application from code injection attacks.\");\n                }\n            } catch (ErrnoException ignored) {\n                \/\/ assume we'll fail with a more contextual error later\n            }\n        }\n    if(outputName == null ){\n      log(\"DexFile created here\");\n    }\n\n        mCookie = openDexFile(sourceName, outputName, flags);\n        mFileName = sourceName;\n        guard.open(\"close\");\n        \/\/System.out.println(\"DEX FILE cookie is \" + mCookie);\n    }\n<\/code><\/pre>\n<pre><code class=\"language-c line-numbers\">    private static int openDexFile(String sourceName, String outputName,\n        int flags) throws IOException {\n\n    log(\"DexFile openDexFile,sourceName = \" + sourceName + \",outputName = \" + outputName);\n        return openDexFileNative(new File(sourceName).getCanonicalPath(),\n                                 (outputName == null) ? null : new File(outputName).getCanonicalPath(),\n                                 flags);\n    }\n<\/code><\/pre>\n<ul>\n<li>dalvik_system_DexFile.cpp<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1adalvik\/vm\/native<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1adalvik\/vm<\/li>\n<\/ul>\n<pre><code class=\"language-c line-numbers\">static void Dalvik_dalvik_system_DexFile_openDexFileNative(const u4* args,\n    JValue* pResult)\n{\n    ALOGE(\"CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\");\n    StringObject* sourceNameObj = (StringObject*) args[0];\n    StringObject* outputNameObj = (StringObject*) args[1];\n    DexOrJar* pDexOrJar = NULL;\n    JarFile* pJarFile;\n    RawDexFile* pRawDexFile;\n    char* sourceName;\n    char* outputName;\n\n    if (sourceNameObj == NULL) {\n        dvmThrowNullPointerException(\"sourceName == null\");\n        RETURN_VOID();\n    }\n\n    sourceName = dvmCreateCstrFromString(sourceNameObj);\n    ALOGE(\"CZLog from dvmCreateCstrFromString sourceName%s\",sourceName);\n    if (outputNameObj != NULL)\n        outputName = dvmCreateCstrFromString(outputNameObj);\n    else\n        outputName = NULL;\n<\/code><\/pre>\n<pre><code class=\"language-c line-numbers\">static void addToDexFileTable(DexOrJar* pDexOrJar) {\n    ALOGE(\"CZLog addToDexFileTable\");\n<\/code><\/pre>\n<h2><span class=\"ez-toc-section\" id=\"3%E5%AE%89%E8%A3%85%E4%B8%80%E4%B8%AA%E6%99%AE%E9%80%9A%E7%9A%84%E6%B2%A1%E6%9C%89%E5%8A%A0%E5%9B%BA%E7%9A%84app%EF%BC%88%E7%9B%B4%E6%8E%A5%E4%BB%8Eas%E4%B8%8Arun%EF%BC%89\"><\/span>3.\u5b89\u88c5\u4e00\u4e2a\u666e\u901a\u7684\u6ca1\u6709\u52a0\u56fa\u7684app\uff08\u76f4\u63a5\u4eceas\u4e0arun\uff09<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u5f00\u673a\u9996\u6b21\u5b89\u88c5\u5e94\u7528\uff0c\u4f1a\u5148\u542f\u52a8\u7cfb\u7edf\u7684\u4e24\u4e2a\u7cfb\u7edf\u5e94\u7528pm\u548cam(as\u4e0arun\u624d\u6709\u8fd9\u4e2a\u65e5\u5fd7)\u3002<br \/>\n<strong>pm<\/strong><\/p>\n<pre><code class=\"language-bash line-numbers\">E\/dalvikvm( 2201): CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\n\nE\/dalvikvm( 2201): CZLog from dvmCreateCstrFromString sourceName\/system\/framework\/pm.jar\n\nE\/dalvikvm( 2201): Couldn't open \/system\/framework\/pm.odex: No such file or directory\n\nE\/dalvikvm( 2201): dvmJarFileOpen: Checking cache for \/system\/framework\/pm.jar (\/data\/dalvik-cache\/system@framework@pm.jar@classes.dex)\n\nE\/dalvikvm( 2201): Successfully opened 'classes.dex' in '\/system\/framework\/pm.jar'\n\nE\/dalvikvm( 2201): Opening DEX file '\/system\/framework\/pm.jar' (Jar)\n\nE\/dalvikvm( 2201): CZLog addToDexFileTable\n<\/code><\/pre>\n<p><strong>am<\/strong><\/p>\n<pre><code class=\"language-bash line-numbers\">E\/dalvikvm( 2259): CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\n\nE\/dalvikvm( 2259): CZLog from dvmCreateCstrFromString sourceName\/system\/framework\/am.jar\n\nE\/dalvikvm( 2259): Couldn't open \/system\/framework\/am.odex: No such file or directory\n\nE\/dalvikvm( 2259): dvmJarFileOpen: Checking cache for \/system\/framework\/am.jar (\/data\/dalvik-cache\/system@framework@am.jar@classes.dex)\n\nE\/dalvikvm( 2259): Successfully opened 'classes.dex' in '\/system\/framework\/am.jar'\n\nE\/dalvikvm( 2259): Opening DEX file '\/system\/framework\/am.jar' (Jar)\n\nE\/dalvikvm( 2259): CZLog addToDexFileTable\n<\/code><\/pre>\n<p>\u7136\u540e\u5c31\u662f\u6211\u5b89\u88c5\u7684\u5e94\u7528\u7684\u65e5\u5fd7\uff1a<\/p>\n<pre><code class=\"language-bash line-numbers\">W\/CZLogQiHu4444444( 2275): ClassLoader: ,dexPath = \/data\/app\/com.example.jni02-1.apk,name = dalvik.system.PathClassLoader\n\nW\/CZLogXXX( 2275): DexFile openDexFile,sourceName = \/data\/app\/com.example.jni02-1.apk,outputName = null\n\nE\/dalvikvm( 2275): CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\n\nE\/dalvikvm( 2275): CZLog from dvmCreateCstrFromString sourceName\/data\/app\/com.example.jni02-1.apk\n\nE\/dalvikvm( 2275): Couldn't open \/data\/app\/com.example.jni02-1.odex: No such file or directory\n\nE\/dalvikvm( 2275): dvmJarFileOpen: Checking cache for \/data\/app\/com.example.jni02-1.apk (\/data\/dalvik-cache\/data@app@com.example.jni02-1.apk@classes.dex)\n\nE\/dalvikvm( 2275): Successfully opened 'classes.dex' in '\/data\/app\/com.example.jni02-1.apk'\n\nE\/dalvikvm( 2275): Opening DEX file '\/data\/app\/com.example.jni02-1.apk' (Jar)\n\nE\/dalvikvm( 2275): CZLog addToDexFileTable\n\nW\/CZLogQiHu111( 2275): BaseDexClassLoader: ,dexPath = \/data\/app\/com.example.jni02-1.apk\n\nW\/CZLogQiHu111( 2275): pathList = DexPathList[[zip file \"\/data\/app\/com.example.jni02-1.apk\"],nativeLibraryDirectories=[\/data\/app-lib\/com.example.jni02-1, \/vendor\/lib, \/system\/lib]],name = dalvik.system.PathClassLoader\n<\/code><\/pre>\n<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/black_dreamer\/article\/details\/81665728\">https:\/\/blog.csdn.net\/black_dreamer\/article\/details\/81665728<\/a><br \/>\n\u6240\u4ee5\uff0c<strong>apk \u5b89\u88c5\u65f6\uff0c\u7cfb\u7edf\u4f1a\u4f7f\u7528 PathClassLoader \u6765\u52a0\u8f7dapk\u6587\u4ef6\u4e2d\u7684dex<\/strong><\/p>\n<h2><span class=\"ez-toc-section\" id=\"4%E5%AE%89%E8%A3%85%E5%8A%A0%E5%9B%BA%E7%9A%84app\"><\/span>4.\u5b89\u88c5\u52a0\u56fa\u7684app<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>\u7b2c\u4e00\u90e8\u5206\uff1a\u52a0\u8f7d\u58f3dex<br \/>\n\u58f3apk\u6267\u884c\u666e\u901aapk\u7684\u52a0\u8f7d\u6d41\u7a0b<\/p>\n<pre><code class=\"language-bash line-numbers\">I\/ActivityManager(  753): Start proc com.chinalwb.are.demo for activity com.chinalwb.are.demo\/.IndexActivity: pid=2485 uid=10073 gids={50073, 1028, 1015, 3003}\n\nW\/CZLogQiHu4444444( 2485): ClassLoader: ,dexPath = \/data\/app\/com.chinalwb.are.demo-1.apk,name = dalvik.system.PathClassLoader\n\nW\/CZLogXXX( 2485): DexFile openDexFile,sourceName = \/data\/app\/com.chinalwb.are.demo-1.apk,outputName = null\n\nE\/dalvikvm( 2485): CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\n\nE\/dalvikvm( 2485): CZLog from dvmCreateCstrFromString sourceName\/data\/app\/com.chinalwb.are.demo-1.apk\n\nE\/dalvikvm( 2485): Couldn't open \/data\/app\/com.chinalwb.are.demo-1.odex: No such file or directory\n\nE\/dalvikvm( 2485): dvmJarFileOpen: Checking cache for \/data\/app\/com.chinalwb.are.demo-1.apk (\/data\/dalvik-cache\/data@app@com.chinalwb.are.demo-1.apk@classes.dex)\n\nE\/dalvikvm( 2485): Successfully opened 'classes.dex' in '\/data\/app\/com.chinalwb.are.demo-1.apk'\n\nE\/dalvikvm( 2485): Opening DEX file '\/data\/app\/com.chinalwb.are.demo-1.apk' (Jar)\n\nE\/dalvikvm( 2485): CZLog addToDexFileTable\n\nW\/CZLogQiHu111( 2485): BaseDexClassLoader: ,dexPath = \/data\/app\/com.chinalwb.are.demo-1.apk\n\nW\/CZLogQiHu111( 2485): pathList = DexPathList[[zip file \"\/data\/app\/com.chinalwb.are.demo-1.apk\"],nativeLibraryDirectories=[\/data\/app-lib\/com.chinalwb.are.demo-1, \/vendor\/lib, \/system\/lib]],name = dalvik.system.PathClassLoader\n\nD\/dalvikvm( 2485): DexOpt: couldn't find static field Landroid\/os\/Build;.SUPPORTED_32_BIT_ABIS\n\nW\/dalvikvm( 2485): VFY: unable to resolve static field 4 (SUPPORTED_32_BIT_ABIS) in Landroid\/os\/Build;\n\nD\/dalvikvm( 2485): VFY: replacing opcode 0x62 at 0x0004\n\nD\/dalvikvm( 2485): Trying to load lib \/data\/data\/com.chinalwb.are.demo\/.jiagu\/libjiagu837801602.so 0x42628f50\n\nD\/dalvikvm( 2485): Added shared lib \/data\/data\/com.chinalwb.are.demo\/.jiagu\/libjiagu837801602.so 0x42628f50\n\nE\/dalvikvm( 2485): ERROR: couldn't find native method\n\nE\/dalvikvm( 2485): Requested: Lcom\/stub\/StubApp;.interface7:(Landroid\/app\/Application;Landroid\/content\/Context;)Z\n\n<\/code><\/pre>\n<p>\u7b2c\u4e8c\u90e8\u5206\uff1a\u518d\u6b21\u52a0\u8f7d\u4e86\u4e00\u6b21dex<br \/>\n\u4e0a\u9762\u7684\u65e5\u5fd7\u91cc\u6700\u540e\u4e00\u884c<br \/>\n```Requested: Lcom\/stub\/StubApp;.interface7:(Landroid\/app\/Application;Landroid\/content\/Context;)Z```\u5e94\u8be5\u5c31\u662f360\u89e3\u5bc6\u58f3\u5185\u90e8\u771f\u6b63\u7684\u5730\u65b9<br \/>\n\u7136\u540e\u5b83\u6ca1\u6709\u81ea\u5b9a\u4e49\u4efb\u4f55\u7684ClassLoader\uff0c\u800c\u662f\u76f4\u63a5\u4f7f\u7528DexFile.java\u7684loadDex\u65b9\u6cd5\u52a0\u8f7ddex\u3002<\/p>\n<pre><code class=\"language-bash line-numbers\">W\/CZLogXXX( 2485): DexFile loadDex:sourcePathName = \/data\/app\/com.chinalwb.are.demo-1.apk,outputPathName = null\n\nW\/CZLogXXX( 2485): DexFile created here\n\nW\/CZLogXXX( 2485): DexFile openDexFile,sourceName = \/data\/app\/com.chinalwb.are.demo-1.apk,outputName = null\n\nE\/dalvikvm( 2485): CZLog Dalvik_dalvik_system_DexFile_openDexFileNative\n\nE\/dalvikvm( 2485): CZLog from dvmCreateCstrFromString sourceName\/data\/app\/com.chinalwb.are.demo-1.apk\n\nE\/dalvikvm( 2485): Couldn't open \/data\/app\/com.chinalwb.are.demo-1.odex: No such file or directory\n\nE\/dalvikvm( 2485): dvmJarFileOpen: Checking cache for \/data\/app\/com.chinalwb.are.demo-1.apk (\/data\/dalvik-cache\/data@app@com.chinalwb.are.demo-1.apk@classes.dex)\n\nE\/dalvikvm( 2485): Successfully opened 'classes.dex' in '\/data\/app\/com.chinalwb.are.demo-1.apk'\n\nE\/dalvikvm( 2485): Opening DEX file '\/data\/app\/com.chinalwb.are.demo-1.apk' (Jar)\n\nE\/dalvikvm( 2485): CZLog addToDexFileTable\n\n<\/code><\/pre>\n<p>\u6ce8\u610f<br \/>\n```E\/dalvikvm( 2094): Opening DEX file '\/data\/app\/com.chinalwb.are.demo-1.apk' (Jar)```\u8fd9\u884c\u65e5\u5fd7\uff0c\u8fd9\u662f\u7cfb\u7edf\u81ea\u5df1\u6253\u7684\u65e5\u5fd7\u3002<br \/>\n![image.png](https:\/\/upload-images.jianshu.io\/upload_images\/18328858-1f6c36427f019279.png?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240)<br \/>\n\u8c03\u7528\u4e86```dvmJarFileOpen```\u65b9\u6cd5\u6765\u6253\u5f00dex<br \/>\n\u8fd9\u4e2a\u65b9\u6cd5\u7684\u5b9e\u73b0\u4e0d\u5728dalvik_system_DexFile.cpp\u6587\u4ef6\uff0c\u901a\u8fc7```grep 'dvmJarFileOpen' -Inrw  --include=*.cpp```\u627e\u5230\u65b9\u6cd5\u7684\u5b9e\u73b0\u4f4d\u7f6e<\/p>\n<ul>\n<li>JarFile.cpp<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1adalvik\/vm<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1adalvik\/vm<br \/>\n\u5173\u4e8edvmJarFileOpen\u8fd9\u4e2a\u65b9\u6cd5\u7684\u8d44\u6599\uff1a<br \/>\n\u8fd9\u4e2a\u65b9\u6cd5\u771f\u7684\u5341\u5206\u91cd\u8981\uff01\uff01\uff01\uff01\uff01\uff01<br \/>\n<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/bbs.pediy.com\/thread-209631.htm\">https:\/\/bbs.pediy.com\/thread-209631.htm<\/a><br \/>\n<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/mengkevin\/article\/details\/74177927\">https:\/\/blog.csdn.net\/mengkevin\/article\/details\/74177927<\/a><br \/>\nJarFile.cpp\u7684\u65e5\u5fd7\u90fd\u662f\u7528ALOGV\u6765\u6253\u5370\u7684\uff0clogcat\u6355\u6349\u4e0d\u5230\uff0c\u6539\u7528ALOGE\u3002<\/p>\n<\/li>\n<li>\n<p>\/data\/dalvik-cache\u76ee\u5f55\u4e0b\u7684dex<br \/>\n\u770b<br \/>\n```dvmJarFileOpen: Checking cache for \/data\/app\/com.chinalwb.are.demo-1.apk (\/data\/dalvik-cache\/data@app@com.chinalwb.are.demo-1.apk@classes.dex)```\u8fd9\u884c\u65e5\u5fd7\uff0c\u8fd9\u91cc\u7684```\/data\/dalvik-cache\/data@app@com.chinalwb.are.demo-1.apk@classes.dex```dex\u662f\u4e0d\u662f\u5462\uff1f<br \/>\npull\u51fa\u6765\uff0c\u65e0\u6cd5\u53cd\u7f16\u8bd1\u51fasmali\uff0c\u4e0b\u9762\u535a\u5ba2\u8bf4\u660e\u4e86\u8fd9\u4e2adex\u4e0d\u662f\u6e90\u7a0b\u5e8f\u7684dex\u3002<br \/>\n[https:\/\/blog.csdn.net\/u010144805\/article\/details\/78894321](https:\/\/blog.csdn.net\/u010144805\/article\/details\/78894321)<br \/>\n##5.360\u89e3\u5bc6\u540e\u7684dex<br \/>\n\u901a\u8fc7\u4e0a\u9762\u8be6\u7ec6\u7684\u65e5\u5fd7\u5206\u6790\u53ef\u77e5\uff0c360\u52a0\u56fa\u540e\u7684app\u8fdb\u884c\u4e862\u6b21dex\u52a0\u8f7d\uff0c\u90a3\u4e48\u771f\u6b63\u7684\u6e90\u7a0b\u5e8f\u7684dex\u662f\u5426\u80fd\u62ff\u5230\u5462\uff1f\n<\/p>\n<\/li>\n<\/ul>\n<p>\u770bJarFile.cpp\u7684dvmDexFileOpenFromFd\u8fd9\u4e2a\u65b9\u6cd5<\/p>\n<pre><code class=\"language-c line-numbers\">    \/*\n     * Map the cached version.  This immediately rewinds the fd, so it\n     * doesn't have to be seeked anywhere in particular.\n     *\/\n    if (dvmDexFileOpenFromFd(fd, &amp;pDvmDex) != 0) {\n        ALOGI(\"Unable to map %s in %s\", kDexInJarName, fileName);\n        goto bail;\n    }\n<\/code><\/pre>\n<p>\u901a\u8fc7<br \/>\n```grep 'dvmDexFileOpenFromFd' -Inrw  --include=*.cpp```\u641c\u7d22\u8fd9\u4e2a\u65b9\u6cd5\u7684\u5b9e\u9645\u5b9a\u4e49\u4f4d\u7f6e\uff0c\u53d1\u73b0\u4f4d\u4e8eDvmDex.cpp\u3002<br \/>\n- DvmDex.cpp<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1adalvik\/vm<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1adalvik\/vm<br \/>\n![dvmdex.jpg](https:\/\/upload-images.jianshu.io\/upload_images\/18328858-10650323742ef5a0.jpg?imageMogr2\/auto-orient\/strip%7CimageView2\/2\/w\/1240)<\/p>\n<p>\u901a\u8fc7<br \/>\n```grep 'dexFileParse' -Inrw  --include=*.cpp```\u641c\u7d22\u51fadexFileParse\u6240\u5728\u7684\u6587\u4ef6\u4f4d\u7f6e\uff0c\u4e3aDexFile.cpp\u3002<br \/>\n- DexFile.cpp\u3002<br \/>\n\u6e90\u7801\u76ee\u5f55\uff1adalvik\/libdex<br \/>\n\u7f16\u8bd1\u76ee\u5f55\uff1adalvik\/libdex<br \/>\n\u5173\u4e8edexFileParse\u65b9\u6cd5\u6211\u5c31\u4e0d\u518d\u7ec6\u8bb2\u4e86\uff0c\u56e0\u4e3a\u6709\u4e86pDexFile\u5c31\u80fd\u641e\u5230dex\u3002<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%E7%94%A8pDexFile%E5%B0%86dex%E6%90%9E%E5%87%BA%E6%9D%A5%E7%9C%8B%E7%9C%8B\"><\/span>\u7528pDexFile\u5c06dex\u641e\u51fa\u6765\u770b\u770b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u53c2\u8003<a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/bbs.pediy.com\/thread-218891.htm\">https:\/\/bbs.pediy.com\/thread-218891.htm<\/a>\u8fd9\u4f4d\u5927\u4f6c\u3002<\/p>\n<button class=\"simplefavorite-button\" data-postid=\"4686\" data-siteid=\"1\" data-groupid=\"1\" data-favoritecount=\"0\" style=\"\">\u6536\u85cf <i class=\"sf-icon-star-empty\"><\/i><\/button>","protected":false},"excerpt":{"rendered":"<p>http:\/\/blog.itpub.net\/31562043\/viewspace-2284074\/  [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[215],"tags":[],"_links":{"self":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4686"}],"collection":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4686"}],"version-history":[{"count":3,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4686\/revisions"}],"predecessor-version":[{"id":4689,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4686\/revisions\/4689"}],"wp:attachment":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4686"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4686"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4686"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}