精华内容
参与话题
问答
  • ODEX 和 DEXopt

    2018-02-09 13:17:29
    ODEX是安卓上的应用程序apk中提取出来的可运行文件,是通过apk安装包的中的dex优化过的,再把apk包里的dex文件删除。这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为...DEXopt就是这样的一个过程...

    ODEX是安卓上的应用程序apk中提取出来的可运行文件,是通过apk安装包的中的dex优化过的,再把apk包里的dex文件删除。这样做可以加快软件的启动速度,预先提取,减少对RAM的占用,因为没有odex的话,系统要从apk包中提取dex再运行


    DEXopt就是这样的一个过程...

    展开全文
  • DexOpt相关的异常

    2019-09-24 14:44:12
    查找的资料 dvm探讨之odex绕过 DexClassLoader4.4.2动态加载分析...04-11 23:34:36.850 D/dalvikvm( 2255): DexOpt: incorrect opt magic number (0xff ff ff ff) 04-11 23:34:36.850 D/dalvikvm( 2255): ODEX...

    查找的资料

    dvm探讨之odex绕过

    DexClassLoader4.4.2动态加载分析(磁盘加载分析)

     

    04-11 23:34:36.850 D/dalvikvm( 2255): DexOpt: incorrect opt magic number (0xff ff ff ff)
    
    04-11 23:34:36.850 D/dalvikvm( 2255): ODEX file is stale or bad; removing and retrying (/data/dalvik-cache/system@app@AWCarInfo.apk@classes.dex)
    
    04-11 23:34:37.000 W/dalvikvm( 2255): Zip: size mismatch on inflated file (1728084 vs 1716780)
    
    04-11 23:34:37.001 E/dalvikvm( 2255): Unable to extract+optimize DEX from '/system/app/AWCarInfo.apk'
    
    04-11 23:34:37.004 D/AndroidRuntime( 2255): Shutting down VM
    
    04-11 23:34:37.004 W/dalvikvm( 2255): threadid=1: thread exiting with uncaught exception (group=0x40fee930)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255): FATAL EXCEPTION: main
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255): java.lang.RuntimeException: Unable to instantiate application com.roadrover.carinfo.CarApplication: java.lang.ClassNotFoundException: Didn't find class "com.roadrover.carinfo.CarApplication" on path: /system/app/AWCarInfo.apk
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.LoadedApk.makeApplication(LoadedApk.java:504)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4395)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.ActivityThread.access$1300(ActivityThread.java:145)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1301)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.os.Handler.dispatchMessage(Handler.java:99)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.os.Looper.loop(Looper.java:138)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.ActivityThread.main(ActivityThread.java:5089)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at java.lang.reflect.Method.invokeNative(Native Method)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at java.lang.reflect.Method.invoke(Method.java:511)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:807)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:574)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at dalvik.system.NativeStart.main(Native Method)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.roadrover.carinfo.CarApplication" on path: /system/app/AWCarInfo.apk
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:65)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at java.lang.ClassLoader.loadClass(ClassLoader.java:501)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at java.lang.ClassLoader.loadClass(ClassLoader.java:461)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.Instrumentation.newApplication(Instrumentation.java:968)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     at android.app.LoadedApk.makeApplication(LoadedApk.java:499)
    
    04-11 23:34:37.007 E/AndroidRuntime( 2255):     ... 11 more

     

     

     

    Unable to extract+optimize DEX from '/system/app/AWCarInfo.apk'
    不能从 '/system/app/AWCarInfo.apk'中提取和优化DEX 文件

     

    问题应该出在DexOpt从/data/dalvik-cache/system@app@AWCarInfo.apk@classes.dex中提取优化的ODEX 文件是过时的or坏的,所以AWCarInfo.apk无法启动。

     

    转载于:https://www.cnblogs.com/lipeineng/p/11310407.html

    展开全文
  • 主要介绍了Android安装应用 INSTALL_FAILED_DEXOPT 解决办法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • 会报DexOpt: source file mod time mismatch问题,目前发现在4.4系统上有这个问题启动不了,另外有一台6.0手机没有报这个错能正常启动。 我们的apk方法数超过65w,执行过dex分包,再用加固...
  • 原文详见:http://www.netmite.com/android/mydroid/dalvik/docs/dexopt.html dalvik的设计的初衷就是运行在像Android这样的小RAM,低速度flash memory,运行标准Linux系统的设备。针对这样的平台特性,要想...

    原文详见:http://www.netmite.com/android/mydroid/dalvik/docs/dexopt.html

    dalvik的设计的初衷就是运行在像Android这样的小RAM,低速度flash memory,运行标准Linux系统的设备。针对这样的平台特性,要想做到更好,我们需要考虑以下几点:

    1)为了减少系统的内存使用,字节码可以多进程共享。但出于安全性考虑,这样的字节码不可以编辑。

    2)为了保证响应速度,加载一个新的APP所需时间尽量少。

    3)标准Java中把多个类文件分别存放导致了大量的冗余,为了节省APP的占用空间,这个问题要解决。

    4)加载类的时候解析类的字段成员会导致额外的消耗,如果改成像C一样直接访问会比较好。

    5)字节码verification很有必要,但很慢,我们需要把验证与APP执行分开。

    6)字节码optimization(比如指令优化、方法pruning)可以在很大程度上影响执行速度和电池消耗。

    标准VM都是程序启动时把每单个的类文件解压放入heap,每个进程都有一份copy。这样的做法在内存占用和时间上面都有损失,但方便了对指令的优化。

    现在看看dalvik是怎么做的:

    1)多个类被集成进单一的DEX文件。

    2)DEX文件在进程间以只读方式共享。

    3)byte ordering和word alignment根据local system来做调整。

    4)字节码verification尽可能提前。

    5)需要修改字节码的optimization必须提前进行。

    这样做的好处在下面一一介绍。

    VM Operation

    系统中的应用程序代码以.jar或.apk文件存在。其实它们都是.zip的文档,只不过多了一些文件头信息。DEX文件也就是解压.apk后的classes.dex文件。classes.dex中的字节码是经过压缩处理的,而且文件头部不一定是word aligned,所以不能直接mmap到内存直接执行,而是先解压,然后做一些realignment,optimization,verification操作。下面详细介绍一下这个过程。

    Preparation

    做到DEX文件的执行前优化(优化后的DEX叫做ODEX,Optimization DEX),至少有三种方式:

    1)VM的JIT技术。优化后的文件放在/data/dalvik-cache目录下。这种方式在模拟器和eng模式下编译的系统中有效,只有这两种情况下操作dalvik-cache目录才不会有权限问题。

    2)安装应用程序时,system installer做优化。这需要dalvik-cache目录的写权限。

    3)编译系统源码时进行优化。这样优化不会修改jar/apk文件,但会对classes.dex进行优化,优化后的DEX与原文件放在同一个目录下一起写入system image。

    系统中的/data/dalvik-cache目录属于system/system,权限是0771。存储在这个目录下的ODEX文件被system和应用程序所属的group拥有,权限是0644。DRM-locked的应用程序使用640权限。底线是你可以读你自己的DEX文件和其它的大多数应用程序,但不能创建、修改或删除它们。

    使用JIT和system installer做DEX文件的Preparation要分成三步:

    1)由system installer创建dalvik-cache文件夹,这个程序运行在有root权限的installd进程中。

    2)classes.dex被解压出来,并在文件头部预留一些空间存放ODEX头信息。

    3)为了方便使用和做一些针对特定系统的微调,把它mmap。比如byte-swapping,structure realigning等。我们还会做一些像文件偏移量和数据索引是否越界等方面的基本检查。

    编译系统使用一个很复杂的流程来做这些事:启动模拟器,强制对所有相关DEX文件执行JIT优化,最后把优化后的结果从dalvik-cache中提取出来。之所以这样做而不是在PC上面使用一个工具来完成,在后面解释Optimization时可以看到原因。

    当代码的byte-swapping和align完成时,我们的preparation就完成了。再做完verification和optimization,最后,我们就会把一些相关计算出来的信息添加到ODEX文件的头部然后开始执行。

    dexopt

    其实,如果我们想优化DEX中的类文件的话,最简单最安全的办法就是把所有类加载到VM中然后运行一遍,运行失败的就是没有verification和optimization的。但是,这样会分配一些很难释放的资源。比如,加载本地库时。所以,不能使用运行程序的那个VM来做。

    我们的解决方案就是使用dexopt这个程序,它会初始化一个VM,加载DEX文件并执行verification和optimization过程。完成后,进程退出,释放所有资源。这个过程中,也可以多个VM使用同一个DEX。file lock会让dexopt只运行一次。

    verification

    字节码的verification过程涉及到每个DEX文件中的所有类和类中的所有方法中的指令。目标就是检查非法指令序列,这样做完以后,运行的时候就不必管了。这个过程中涉及到的许多计算也存在于GC过程中。

    出于效率上的考虑,下一节提到的optimization会假设verification已经成功运行通过。默认情况下,dalvik会对所有类进行verification,而只对verification成功的类执行optimization。在进行verification过程中出现失败时,我们不一定会报告(比如在不同的包中调用一个作用范围为包内的类),我们会在执行时抛出一个异常。因为检查每个方法的访问权限很慢。

    执行verification成功的类在ODEX文件中有一个flag set,当它们被加载时,就不会再进行verification。linux系统的安全机制会防止这个文件被破坏,但如果你能绕过去,还是能去破坏它的。ODEX文件有一个32-bit的checksum,但只能做一个快速检查。

    Optimization

    VM解释器在第一次运行一段代码时会做一些optimization。比如,把常量池引用替换成指向内部数据结构的指针,一些永远成功的操作或固定的代码被替换成更简单的形式。做这些optimization需要的信息有的只能在运行时得到,有的可以推断出来。

    dalvik做的optimization包含下面这些:

    1)对于虚方法的调用,把方法索引修改成vtable索引。

    2)把field的get/put修改成字节偏移量。把boolean/byte/char/short等类型的变量合并到一个32-bit的形式,更少的代码可以更有效地利用CPU的I-cache。

    3)把一些大量使用的简单方法进行inline,比如String.length()。这样能减少方法调用的开销。

    4)删除空方法。

    5)加入一些计算好的数据。比如,VM需要一个hash table来查找类名字,我们就可以在Optimization阶段进行计算,不用放到DEX加载的时候了。

    所有的指令修改都是使用一个Dalvik标准没有定义的指令去替换原有指令。这样,我们就可以让优化和没有优化的指令自由搭配。具体的操作与VM版本有关。

    Optimization过程有两个地方需要我们注意:

    1)VM如果更新的话,vtable索引和字节偏移量可能会更新。

    2)如果两个DEX互相信赖,而其中一个DEX更新的话,确保优化后的索引和偏移量有效。

    Dependencies and Limitations

    优化后的DEX会包含一个它信赖的DEX文件列表,并添加了CRC-32和修改时间。文件列表中包含了dalvik-cache目录下的文件的路径和相应的SHA-1签名。而文件在设备上的timestamp不可信也不能用。另外还有VM版本号。

    如果当前DEX所依赖的DEX有更新,我们也需要更新当前DEX。如果我们可以做一个JIT的dexopt调用,更新过程很easy。但如果只能依赖installer daemon,或者这个DEX被装到ODEX中的话,VM只能拒绝它了。

    dexopt的输出与平台版本,VM版本有关,想编写一个运行在PC上,而优化后的输出在其它设备使用的dexopt很难。因此,dexopt是在目标设备上或者目标设备的模拟器上运行。

    展开全文
  • android 调用 dexopt 的位置

    千次阅读 2016-01-28 10:00:36
    dexopt 是 android dalvik 虚拟机使用的优化程序,它负责把dex文件优化成odex。位置1 安装的时候调用 在 PackageManagerService 中的 Installer.java 里执行 dexopt 方法public int dexopt(String apkPath, int uid,...

    dexopt 是 android dalvik 虚拟机使用的优化程序,它负责把dex文件优化成odex。


    位置1 安装的时候调用

    1. PackageManagerService 中的 Installer.java 里执行 dexopt 方法

      public int dexopt(String apkPath, int uid, boolean isPublic)     {
          StringBuilder builder = new StringBuilder("dexopt");
          builder.append(' ');
          builder.append(apkPath);
          builder.append(' ');
          builder.append(uid);
          builder.append(isPublic ? " 1" : " 0");
          return execute(builder.toString());
      }

      其中会调用 execute 函数

    2. execute 函数会调用 transaction 函数

      private int execute(String cmd) {
          String res = transaction(cmd);
          try {
              return Integer.parseInt(res);
          } catch (NumberFormatException ex) {
              return -1;
          }
      }
    3. transaction 函数最终通过socket接口向 /system/bin/installd 进程发送安装消息

      private synchronized String transaction(String cmd) {
          if (!connect()) {
              Slog.e(TAG, "connection failed");
              return "-1";
          }
      
          if (!writeCommand(cmd)) {
              /*
               * If installd died and restarted in the background (unlikely but
               * possible) we'll fail on the next write (this one). Try to
               * reconnect and write the command one more time before giving up.
               */
              Slog.e(TAG, "write command failed? reconnect!");
              if (!connect() || !writeCommand(cmd)) {
                  return "-1";
              }
          }
          if (LOCAL_DEBUG) {
              Slog.i(TAG, "send: '" + cmd + "'");
          }
          if (readReply()) {
              String s = new String(buf, 0, buflen);
              if (LOCAL_DEBUG) {
                  Slog.i(TAG, "recv: '" + s + "'");
              }
              return s;
          } else {
              if (LOCAL_DEBUG) {
                  Slog.i(TAG, "fail");
              }
              return "-1";
          }
      }
    4. /system/bin/installd 进程由init.rc创建

      service installd /system/bin/installd
          class main
          socket installd stream 600 system system

      它启动后会监听一个本地的socket端口,供其他程序调用
      并且它在main函数中循环监听该端口

      int main(const int argc, const char *argv[]) {
          char buf[BUFFER_MAX];
          struct sockaddr addr;
          socklen_t alen;
          int lsocket, s, count;
      
          if (initialize_globals() < 0) {
              LOGE("Could not initialize globals; exiting.\n");
              exit(1);
          }
      
          if (initialize_directories() < 0) {
              LOGE("Could not create directories; exiting.\n");
              exit(1);
          }
      
          lsocket = android_get_control_socket(SOCKET_PATH);
          if (lsocket < 0) {
              LOGE("Failed to get socket from environment: %s\n", strerror(errno));
              exit(1);
          }
          if (listen(lsocket, 5)) {
              LOGE("Listen on socket failed: %s\n",         strerror(errno));
              exit(1);
          }
          fcntl(lsocket, F_SETFD, FD_CLOEXEC);
      
          for (;;) {
              alen = sizeof(addr);
              s = accept(lsocket, &addr, &alen);
              if (s < 0) {
                  LOGE("Accept failed: %s\n", strerror(errno));
                  continue;
              }
              fcntl(s, F_SETFD, FD_CLOEXEC);
      
              LOGI("new connection\n");
              for (;;) {
                  unsigned short count;
                  if (readx(s, &count, sizeof(count))) {
                      LOGE("failed to read size\n");
                      break;
                  }
                  if ((count < 1) || (count >= BUFFER_MAX)) {
                      LOGE("invalid size %d\n", count);
                      break;
                  }
                  if (readx(s, buf, count)) {
                      LOGE("failed to read command\n");
                      break;
                  }
                  buf[count] = 0;
                  if (execute(s, buf)) break;
              }
              LOGI("closing connection\n");
              close(s);
          }
      
          return 0;
      }
    5. 当它收到消息后它会调用 execute 函数

      static int execute(int s, char cmd[BUFFER_MAX])
      {
          char reply[REPLY_MAX];
          char *arg[TOKEN_MAX+1];
          unsigned i;
          unsigned n = 0;
          unsigned short count;
          int ret = -1;
      
      //    LOGI("execute('%s')\n", cmd);
      
              /* default reply is "" */
          reply[0] = 0;
      
              /* n is number of args (not counting arg[0]) */
          arg[0] = cmd;
          while (*cmd) {
              if (isspace(*cmd)) {
                  *cmd++ = 0;
                  n++;
                  arg[n] = cmd;
                  if (n == TOKEN_MAX) {
                      LOGE("too many arguments\n");
                      goto done;
                  }
              }
              cmd++;
          }
      
          for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
              if (!strcmp(cmds[i].name,arg[0])) {
                  if (n != cmds[i].numargs) {
                      LOGE("%s requires %d arguments (%d given)\n",
                           cmds[i].name, cmds[i].numargs, n);
                  } else {
                      ret = cmds[i].func(arg + 1, reply);
                  }
                  goto done;
              }
          }
          LOGE("unsupported command '%s'\n", arg[0]);
      
      done:
          if (reply[0]) {
              n = snprintf(cmd, BUFFER_MAX, "%d %s", ret, reply);
          } else {
              n = snprintf(cmd, BUFFER_MAX, "%d", ret);
          }
          if (n > BUFFER_MAX) n = BUFFER_MAX;
          count = n;
      
      //    LOGI("reply: '%s'\n", cmd);
          if (writex(s, &count, sizeof(count))) return -1;
          if (writex(s, cmd, count)) return -1;
          return 0;
      }

      这个函数会从这个数组里找到这个消息对应的处理函数

      struct cmdinfo cmds[] = {
          { "ping",                 0, do_ping },
          { "install",              3, do_install },
          { "dexopt",               3, do_dexopt },
          { "movedex",              2, do_move_dex },
          { "rmdex",                1, do_rm_dex },
          { "remove",               2, do_remove },
          { "rename",               2, do_rename },
          { "freecache",            1, do_free_cache },
          { "rmcache",              1, do_rm_cache },
          { "protect",              2, do_protect },
          { "getsize",              4, do_get_size },
          { "rmuserdata",           2, do_rm_user_data },
          { "movefiles",            0, do_movefiles },
          { "linklib",              2, do_linklib },
          { "unlinklib",            1, do_unlinklib },
          { "mkuserdata",           3, do_mk_user_data },
          { "rmuser",               1, do_rm_user },
      };

      可以看到 dexopt 对应的是 do_dexopt 函数

    6. do_dexopt 会调用 dexopt 函数

      int dexopt(const char *apk_path, uid_t uid, int is_public)
      {
          struct utimbuf ut;
          struct stat apk_stat, dex_stat;
          char dex_path[PKG_PATH_MAX];
          char dexopt_flags[PROPERTY_VALUE_MAX];
          char *end;
          int res, zip_fd=-1, odex_fd=-1;
      
              /* Before anything else: is there a .odex file?  If so, we have
               * pre-optimized the apk and there is nothing to do here.
               */
          if (strlen(apk_path) >= (PKG_PATH_MAX - 8)) {
              return -1;
          }
      
          /* platform-specific flags affecting optimization and verification */
          property_get("dalvik.vm.dexopt-flags", dexopt_flags, "");
      
          strcpy(dex_path, apk_path);
          end = strrchr(dex_path, '.');
          if (end != NULL) {
              strcpy(end, ".odex");
              if (stat(dex_path, &dex_stat) == 0) {
                  return 0;
              }
          }
      
          if (create_cache_path(dex_path, apk_path)) {
              return -1;
          }
      
          memset(&apk_stat, 0, sizeof(apk_stat));
          stat(apk_path, &apk_stat);
      
          zip_fd = open(apk_path, O_RDONLY, 0);
          if (zip_fd < 0) {
              LOGE("dexopt cannot open '%s' for input\n", apk_path);
              return -1;
          }
      
          unlink(dex_path);
          odex_fd = open(dex_path, O_RDWR | O_CREAT | O_EXCL, 0644);
          if (odex_fd < 0) {
              LOGE("dexopt cannot open '%s' for output\n", dex_path);
              goto fail;
          }
          if (fchown(odex_fd, AID_SYSTEM, uid) < 0) {
              LOGE("dexopt cannot chown '%s'\n", dex_path);
              goto fail;
          }
          if (fchmod(odex_fd,
                     S_IRUSR|S_IWUSR|S_IRGRP |
                     (is_public ? S_IROTH : 0)) < 0) {
              LOGE("dexopt cannot chmod '%s'\n", dex_path);
              goto fail;
          }
      
          LOGV("DexInv: --- BEGIN '%s' ---\n", apk_path);
      
          pid_t pid;
          pid = fork();
          if (pid == 0) {
              /* child -- drop privileges before continuing */
              if (setgid(uid) != 0) {
                  LOGE("setgid(%d) failed during dexopt\n", uid);
                  exit(64);
              }
              if (setuid(uid) != 0) {
                  LOGE("setuid(%d) during dexopt\n", uid);
                  exit(65);
              }
              if (flock(odex_fd, LOCK_EX | LOCK_NB) != 0) {
                  LOGE("flock(%s) failed: %s\n", dex_path, strerror(errno));
                  exit(66);
              }
      
              run_dexopt(zip_fd, odex_fd, apk_path, dexopt_flags);
              exit(67);   /* only get here on exec failure */
          } else {
              res = wait_dexopt(pid, apk_path);
              if (res != 0) {
                  LOGE("dexopt failed on '%s' res = %d\n", dex_path, res);
                  goto fail;
              }
          }
      
          ut.actime = apk_stat.st_atime;
          ut.modtime = apk_stat.st_mtime;
          utime(dex_path, &ut);
      
          close(odex_fd);
          close(zip_fd);
          return 0;
      
      fail:
          if (odex_fd >= 0) {
              close(odex_fd);
              unlink(dex_path);
          }
          if (zip_fd >= 0) {
              close(zip_fd);
          }
          return -1;
      }

      这里 dexopt 会启动一个新进程去执行 run_dexopt 函数,并等待那个进程结束

    7. run_dexopt 会调用 /system/bin/dexopt命令

      static void run_dexopt(int zip_fd, int odex_fd, const char* input_file_name,
          const char* dexopt_flags)
      {
          static const char* DEX_OPT_BIN = "/system/bin/dexopt";
          static const int MAX_INT_LEN = 12;      // '-'+10dig+'\0' -OR- 0x+8dig
          char zip_num[MAX_INT_LEN];
          char odex_num[MAX_INT_LEN];
      
          sprintf(zip_num, "%d", zip_fd);
          sprintf(odex_num, "%d", odex_fd);
      
          execl(DEX_OPT_BIN, DEX_OPT_BIN, "--zip", zip_num, odex_num, input_file_name,
              dexopt_flags, (char*) NULL);
          LOGE("execl(%s) failed: %s\n", DEX_OPT_BIN, strerror(errno));
      }

    位置2 在调用DexClassLoader时调用(未完待续)

    展开全文
  • DexOpt: source file mod time mismatch (48f484b5 vs 48f484d2) ODEX file is stale or bad; removing and retrying (/data/data/com.example.test/app_dex/Test.dex) DexOpt: --- BEGIN 'Test.jar' (bootstrap=0) ...
  • INSTALL_FAILED_DEXOPT occurs on adb install <p>The library is included with build.gradle: <pre><code> dependencies { ... compile files('libs/analytics-android-0.6.5.jar') ... } </code></pre...
  • Dalvik Optimization and Verification With dexopt Dalvik 是专门设计用于Android手机平台的虚拟机。主要目标系统是 内存较小,读写存储速度比较慢,机器性能普片比较差的桌面系统。这些系统通常运行在提供有虚拟...
  • Failure [INSTALL_FAILED_DEXOPT]" issues <p>Here is the log i gathered. <p>D/dalvikvm(17017): [Heap setting] startSize = 2 MB, maximumSize = 16 MB, growthlimit = 16 MB E/dalvikvm(17017)...
  • The application could not be installed: INSTALL_FAILED_DEXOPT #####解决方案: <1> AVD Manager 中选中指定模拟器,编辑栏选中wipe Data清空数据 <2> 选中Show Advanced Settings–>Internal ...
  • 今天在帮助客户解决一个问题时,由于他们的手机是用...The application could not be installed: INSTALL_FAILED_DEXOPT 清除模拟器数据 在AndroidStudio中打开AVD Manager: 使用WipeData清除数据: 调整模拟器...
  • you have to click option OPTIMIZE ALL APPS WITH DEXOPT in edxposed manager,after reboot now module will active and will be able to hook. <p>If you clear cache like in twrp and reboot they will unable...
  • 在android4.0源码里面编译出来apk后,用adb install 安装时,报错[INSTALL_FAILED_DEXOPT]。 z:\ics-android\ics-src\out\target\product\generic\system\app>adb install NativeTimer.apk 28 KB/s (10166 bytes...
  • 今天用studio编译项目,一直报install_failed_dexopt错误,最后在stuido中,setting->build……->instant run中enable instant ……取消就好了
  • 编译没有任何错误,却无法安装 在Run窗口显示如下: pkg: /data/local/tmp/...Failure [INSTALL_FAILED_DEXOPT] $ adb shell pm uninstall com.huat.hostwithsecond DELETE_FAILED_INTERNAL_ERROR Error while I...
  • http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0303/1584.html问题adb 安装 apk 报错 INSTALL_FAILED_DEXOPT。 解决根据文档,解压apk文件,发现缺少dex文件。在android.mk中修改 LOCAL_SRC_FILES :...
  • 最近在做android BSP 4.2的时候遇到一个BUG,编译user 版本的时候,系统刷进手机里面去,无限循环在开机动画,编译userdebug 刷机进去的时候发现...I/dalvikvm( 823): DexOpt: not all deps represented E/dalvikv...
  • dexopt 与 dex2oat来介绍热修复设计: 一、AOT/JIT 一个程序的编译过程可以是步骤迭代式的,即每一轮步骤结束后得到的结果都可独立运行,比如,先构造AST再输出字节码,中间状态AST也是可以解释...
  • 今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK Tool在将jar转化成dex的时候,可能会合并类的代码,这将...
  • 在android4.0源码里面编译出来apk后,用adb install (或adb install -r 重装)安装时,报错[INSTALL_FAILED_DEXOPT]。 xu@xu-PC:~$ adb install workspace/out/target/product/generic/system/app/xxx.apk 2820...
  • Failure [INSTALL_FAILED_DEXOPT]   先来说说问题产生的原因。 如果我们在user版本用mm编译apk时,会在out目录下生成.apk和.odex两个文件,是为了加快运行速度,把dex分出来做的预优化处理。但是
  • 安装遇到INSTALL_FAILED_DEXOPT

    千次阅读 2013-03-27 18:52:25
    安装遇到INSTALL_FAILED_DEXOPT ,最近做项目倒入别人的包出安装出现这个问题在百度了一下找到的原因时内存不够了,但是我的够啊,于是我再Google之 好像与新老版本之间的问题有关 好复杂, 最后聪明的我找到了解决...

空空如也

1 2 3 4 5 ... 20
收藏数 482
精华内容 192
关键字:

dexopt