• Android开发:《Gradle Recipes for Android》阅读笔记(翻译)6.1——推荐配置


    问题:

    你想要提高Gradle的构建效率。

    解决方案:

    使用下面推荐的技术组合。

    讨论:

    首先,这里没有可以影响app表现的建议。有很多你可以做的事来提高app,很多都和Android的混淆工具有关。这节不是关于这个的,这节是提高构建本身效率的。

    这节讨论那些可以添加到应用根目录下的gradle.properties文件里面的设置。如果你更喜欢全局设置,home目录下面的.gradle的子文件夹下增加一个gradle.properties文件。

    Gradle守护进程

    Gradle守护进程是一个后台进程,在构建之间保持,缓存数据和代码。当你运行命令提示符时,最新的Gradle会自动的启动守护进程。

    默认的,Android Studio在你的项目里面启动一个Gradle守护进程,持续三个小时,对于大部分开发任务都足够。如果你在命令行运行Gradle,你可能不能自动的启动守护进程。

    为了确保守护进程的启动,可以增加下面的配置:

    org.gradle.daemon=true

    守护进程可以通过命令行标志启动或者停止。使用--daemon和--no-daemon可以在私人配置里面启用或者关闭守护经常。如果你担心内部缓存过期或者你正在测试,关闭守护进程是有效的。如果你想要停止一个正在运行的守护进程,可以使用--stop参数。

    并行编译:

    Gradle有个“孵化”选项用来并行编译独立的项目。使用它可以在gradle.properties里面增加一行:

    org.gradle.parallel=true

    这也许不会有太多用处,因为Android项目里面的modules大部分都是相关的,导致很难从并行编译里面获得好处。

    按需求配置:

    一般Gradle在排除一些任务之前为所有项目的都配置了所有的任务。对于一个有很多子项目和很多任务的项目,这不是很有效。所有可以尝试只配置那些和要求的任务相关的项目。

    在gradle.properties使用“configure on demand”:

    org.gradle.configureondemand=true

    大部分Android应用都只有很少的子项目,所以这个特性并不总是有用。

    这是一个潜伏的特性,所以特定的细节可能会在新版本的Gradle里面改变。

    排除不要的任务:

    在4.3节讨论过,-x标志可以用来排除指定的任务,像lint,耗时但是不是每次构建都需要运行的。

    那节同样展示了如何在任务图里面排斥指定任务。

    改变JVM设置:

    根本上将一个Gradle构建是运行在java进程上的,所有那些影响JVM的参数也影响Gradle的表现。下面展示了一些JVM的设置(在gradle.properties里面):

    org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m
        -XX:+HeapDumpOnOutOfMemoryError

    -Xmx设置java进程使用的最大内存。-Xms设置初始分配给进程的内存。这个例子也改变了持久的空间大小,当java.lang.OutOfMemoryError抛出时,将堆栈存放文件里面。

    可以到Java HotSpot VM页面查看更多细节。

    只使用需要的依赖库:

    这尤其值Google Play服务,经常需要大量的library,并且使用单独的模块。

    例如,使用Google地图,你习惯在编译时添加完整的Google Play服务:

    dependencies {
        compile 'com.google.android.gms:play-service:7.8.0'
    }

    这是一个庞大的库,有许多的依赖,一旦Google Play服务被添加下面一系列的library会被添加:

    由于Android的65K方法名限制,你需要添加大量的你不需要的方法来处理。相反的,你可以只添加地图:

    dependencies {
        compile 'com.google.android.gms:play-service-maps:7.8.0'
    }

    两者之间的差异是戏剧性的:

    使用dex选项:

    Android块允许你之指定“dex”进程的参数。dexOptions块包含下面的选项:

    dexOptions {
        incremental true
        javaMaxHeapSize '2g' 
        jumboMode = true 
        preDexLibraries = true
    }

    incremental选项设置是否启用增量模式。文档说“这有非常多的限制,可能不生效。慎重使用”。

    使用javaMaxHeapSize作为指定Xmx的可选方法。

    启用“jumbo mode”允许在dex文件中出现更多的字符串。如果这是一个问题,你应该花更多的时间配置混淆。

    preDexLibraries会提前允许dx进程。文档描述:“这个可以提高增量构建效率,但是clean会变得慢”。

    这些设置可以提高也可以降低表现,所以在确定使用它们之前进行试验。

    列出配置的概况:

    在命令行使用--profile运行Gradle,生成构建的有用信息。结果生成在build/reports/profile目录下的HTML里面。

    举例,运行多flavor的assembleDebug任务,如下:

    > ./gradlew --profile assembleDebug
    :app:preBuild UP-TO-DATE
    :app:preArrogantStarkDebugBuild UP-TO-DATE
    :app:checkArrogantStarkDebugManifest
    :app:preArrogantStarkReleaseBuild UP-TO-DATE
    :app:preArrogantWayneDebugBuild UP-TO-DATE
    :app:preArrogantWayneReleaseBuild UP-TO-DATE
    :app:preFriendlyStarkDebugBuild UP-TO-DATE
    :app:preFriendlyStarkReleaseBuild UP-TO-DATE
    :app:preFriendlyWayneDebugBuild UP-TO-DATE
    :app:preFriendlyWayneReleaseBuild UP-TO-DATE
    :app:preObsequiousStarkDebugBuild UP-TO-DATE
    :app:preObsequiousStarkReleaseBuild UP-TO-DATE
    :app:preObsequiousWayneDebugBuild UP-TO-DATE
    :app:preObsequiousWayneReleaseBuild UP-TO-DATE
    // ... tons of other tasks ...
    :app:assembleObsequiousWayneDebug
    :app:assembleDebug

    输出的文件在build/reports/profile文件夹下面,类似”profile-YYYY-MM-dd-hh-mm-ss.html“的文件名。

    对于小的项目没有很多看的,但是对于大型项目,这是一个很好地途径来发现瓶颈。

  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/tootwo2/p/6512679.html
Copyright © 2020-2023  润新知