当前位置: 首页 > 软件库 > 程序开发 > 常用工具包 >

fast dex

APK 生成过程加速工具
授权协议 Apache
开发语言 Java Groovy
所属分类 程序开发、 常用工具包
软件类型 开源软件
地区 国产
投 递 者 钱锐
操作系统 Android
开源组织
适用人群 未知
 软件概览

如果你忍受不了 apk 龟速的编译(尤其是项目中有多个 dex ),fastdex 可以帮助你加快 apk 生成过程。

Android API 9(2.3)+ ; android-gradle-build 2.0.0+

使用方式

idea 插件

在Android Studio中,打开搜索插件页面:

  • MacOS

    Android Studio → Preferences → Plugins → Browse repositories

  • Windows 和 Linux

    File → Settings → Plugins → Browse repositories

搜索fastdex安装重启Android Studio就可以了。

手动配置

  • 1、关闭Instant Run功能 点击左上角Android studio -> Preferences -> Build,Execution,Deployment -> Instant Run -> Enable Instant Run......(把对勾去掉)

  • 2、在root project下的build.gradle中添加依赖

     buildscript {
         repositories {
             jcenter()
         }
         
         dependencies {
             classpath 'com.github.typ0520:fastdex-gradle:0.7.4'
         }
     }

     

  • 3、在app的项目中的build.gradle添加插件

    apply plugin: 'fastdex.app'

     

  • 4、直接点击studio的run或者执行打包命令,就会在任务执行的过程中做hook

    第一次全量打包成功后,fastdex支持把增量的dex和资源推送到正在运行的app里重启并加载,这样会省去安装app的时间开销
    拿debug为例如果没有配置flavor就执行(gradlew fastdex${Variant})
    
    Mac/Linux:
    ./gradlew fastdexDebug
    
    Windows:
    gradlew.bat fastdexDebug

注意事项

  • 1、不要把fastdex打出来的包用在生产环境,因为fastdex打出来的包项目所有的代码都在第二个dex后面,会造成5.0以 下机器首次运行比较慢(如果是本地调试就无所谓了);当打包生产环境apk时注释掉加入插件的代码 //apply plugin: 'fastdex.app'

  • 2、fastdex会忽略开启混淆的buildType

  • 3、强烈建议你的application不要直接依赖library工程,打成aar包让application工程远程依赖

实现原理

  • gradle在执行transformClassesWithDexFor${variant}任务生成dex文件时会很慢(尤其是开启了multidex),我们在开发中,修改的几乎全是项目代码,第三方库改动比较小。fastdex的原理就是预先把所有代码生成dex, 当下次执行assemble任务时只会把项目目录下变化的代码生成dex,然后和缓存的dex合并生成apk,这样即不影响调试,又能在生成dex的过程中省下了大量的时间。 详情

  • 应用安装的速度比较慢,尤其是5.0以后的版本,fastdex会把补丁dex和资源通过adb推到正在运行的app里直接重启app

打包流程

全量打包时的流程:

  • 1、合并所有的class文件生成一个jar包

  • 2、扫描所有的项目代码并且在构造方法里添加对fastdex.runtime.antilazyload.AntilazyLoad类的依赖 这样做的目的是为了解决class verify的问题, 详情请看 安卓App热补丁动态修复技术介绍

  • 3、对项目代码做快照,为了以后补丁打包时对比那些java文件发生了变化

  • 4、对当前项目的所以依赖做快照,为了以后补丁打包时对比依赖是否发生了变化,如果变化需要清除缓存

  • 5、调用真正的transform生成dex

  • 6、缓存生成的dex,并且把fastdex-runtime.dex插入到dex列表中,假如生成了两个dex,classes.dex classes2.dex 需要做一下操作 fastdex-runtime.dex => classes.dex classes.dex => classes2.dex classes2.dex => classes3.dex 然后运行期在入口Application(fastdex.runtime.FastdexApplication)使用MultiDex把所有的dex加载进来

  • @see fastdex.build.transform.FastdexTransform

  • 7、保存资源映射表,为了保持id的值一致,详情看

  • @see fastdex.build.task.FastdexResourceIdTask

补丁打包时的流程

  • 1、检查缓存的有效性

  • @see fastdex.build.variant.FastdexVariant 的prepareEnv方法说明

  • 2、扫描所有变化的java文件并编译成class

  • @see fastdex.build.task.FastdexCustomJavacTask

  • 3、合并所有变化的class并生成jar包

  • 4、生成补丁dex

  • 5、把所有的dex按照一定规律放在transformClassesWithMultidexlistFor${variantName}任务的输出目录 fastdex-runtime.dex => classes.dex patch.dex => classes2.dex dex_cache.classes.dex => classes3.dex dex_cache.classes2.dex => classes4.dex dex_cache.classesN.dex => classes(N + 2).dex

  • Android从4.4开始正式引入了ART虚拟机,并从5.0开始取代了Dalvik成为默认的虚拟机。ART与Dalvik最大的不同就是,在程序安装的时候就将其编译成本地指令集(即所谓的Ahead Of Time,AOT),而不像Dalvik是在运行的时候对经常掉用的函数动态编译的(即所谓的Just In Time,JIT)。但是最终编译的动作,还是通过程序dex2oat来执行的。这个程序本身可带非

  • Dex文件和Dalvik虚拟机 在Android系统中,dex文件是可以直接在Dalvik虚拟机中加载运行的文件。通过ADT,经过复杂的编译,可以把java源代码转换为dex文 件。 那么这个文件的格式是什么样的呢?为什么Android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结 果,Dalvik虚拟机的指令码并不是标准的Java虚拟机指令码,而是使用了自己独有

  • Dex文件和Dalvik虚拟机 在Android系统中,dex文件是可以直接在Dalvik虚拟机中加载运行的文件。通过ADT,经过复杂的编译,可以把java源代码转换为dex文件。那么这个文件的格式是什么样的呢?为什么Android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结果,Dalvik虚拟机的指令码并不是标准的Java虚拟机指令码,而是使用了自己独有的一套

  • /* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * Yo

  • Configuring for multidexing did not solve this issue for me. However I did come up with a resolution...of sorts. Basically it involved creating a pull request for a second branch on the same commit as

  • 在Android项目中引入过多的jar会出现错误: android.dex.DexIndexOverflowException: Cannot merge new index xxxx into a non-jumbo instruction! 这个错误出现的原因是 Android设定的方法数是65536个(DEX 64K problem),超过这个方法数,导致dex无法生成,就无法生成APK.

  • 魔数字段,主要就是Dex文件的标识符,它占用4个字节,在目前的源码里是 “dex\n”,它的作用是用来区别其它文件的,比如有一个文件也叫Dex结尾的文件,就可以认为它是Davlik虚拟机运行的文件吗?当然不行,因此这四个字节,就起到与别的结尾也是Dex文件的区分。还有Davlik虚拟机也有优化的Dex,也是通过个字段来区分的,当它是优化的Dex文件时,它的值就变成”dey\n”了。根据这四个字节,

  • Android使用hook来做热修复的原理,都需要用到类的加载器来dex,将出bug的dex替换掉,来达到热修复的目的,至于热修复的原理,在《你值得知道的Android 热修复,以及热修复原理》这篇文章中已经做过详细的介绍,那么tinker的dex补丁加载过程是否也是使用同样的原理呢?本文就是要为读者解剖tinker的dex补丁加载过程。 如果读者没有将tinker接入过项目的,可以阅读《Andr

  • Enjarify 是一个将Dalvik字节码转化为等价的Java字节码,然后可以用一系列的Java分析工具去分析Android应用。之前我们一直使用Dex2jar来完成这个工作,不过Dex2jar已经算是一个非常老的工具咯。Dex2jar在绝大部分情况下都挺不错的,但是如果碰到了些模糊的特性或者特殊案例就会出错或者默默地吐出一些错误的结果。相比之下,Enjarify在设计的时候就考虑到了尽可能多的

 相关资料
  • 问题内容: 我从这样的网络应用程序中生成了一个可以长时间运行的脚本: 脚本成功生成并运行,但是直到结束为止,我无法释放该Web应用程序使用的端口,换句话说,我无法重新启动该Web应用程序。我如何产生一个流程并使它完全独立于Web应用程序? 这是在Linux操作系统上。 问题答案: 正如@mark所阐明的那样,它是一个Linux系统,通过遵循此食谱,脚本可以轻松地使其自身完全独立,即 守护程序 。(

  • Bootstrap 在 CSS 方面采用 Grunt,用 JavaScript 构建系统,用 Jekyll 做记录。Gruntfile 在使用框架方面有许多便利的特点,包括编译代码、运行测试等等。 工具安装 为了使用Gruntfile以及本地运行我们的文档,你需要拷贝一份Bootstrap的源文件,还有Node.js以及Grunt。参照下面的步骤,你应该已经准备好开始动手了: 下载并安装 Node

  • 问题内容: 是否有一个工具将Java文件作为参数,该文件将REST服务描述为参数并从中生成wadl文件。 问题答案: 我遇到了同样的问题:使用RESTeasy并想找到一种自动生成WADL的方法。 做了一些研究,得出下面的解决方案。 注意和元素。您必须更改它们以反映项目的配置。您可能还想更改插件的版本(我使用的是1.17)。 2.创建一个/ doc文件夹并添加一些文件。 创建文件夹并在下面创建两个文

  • null 我不确定校验和是只在数据上计算还是在开始结构上计算(以十六进制为910H) 我附上了一些交流信息,每行是一条信息。我尝试了诸如、和等算法;不幸的是没有任何运气。 更新:我现在有了更多的进步,我现在不再确定它是校验和还是CRC。我已经生成并发送了从0到34的数据值,系统生成了以下“校验和” null Upadte2:我现在已经生成了数据,其中数据结构的一个位是1

  • 开始使用AWS代码构建。 目标是让docker图像作为最终结果,并在其中运行nodejs、hapi和示例应用程序。 目前我有一个问题:“无法准备上下文:无法在Dockerfile路径中计算符号链接: lstat /tmp/src049302811/src/Dockerfile:没有这样的文件或目录”出现在BUILD阶段。 项目详情: S3存储桶用作源 存储在各自S3存储桶中的ZIP文件包含buil

  • 上面的以下代码用于在Minim库的处理过程中创建音频可视化程序。出于某种原因,我很难看到在代码的For循环中是如何形成一个圆的。总的来说,我还试图分解代码,并对正在发生的事情有更深的理解。我对以下内容感到困惑:'float x=250+cos(a)*(20*player.mix.get(I)+100);‘20倍加100是用来放大样本的吗?如果是这样,那么为什么圆可视化器不显示时,我摆脱20倍,只有

  • Linux 下有很多命令行工具供我们使用,每个工具总是提供了大量参数供我们选择;实际工作中,我们用到的工具,最常用的总是那么几个参数组合,为此,我写了这本书相对实用的书。

  • 我正在尝试使用SWIG将旧的Tcl接口替换为C。下面是一个示例类: 这是使用它的标准方法: 但我想保留旧界面的简单性,它不使用”。我发现我可以做如下事情: 它看起来很简单,工作完美,但是,当然,我不能在用户脚本中使用定义。我不确定还能把它放在哪里。有办法把它放在. i文件中吗?