日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android優(yōu)化APP構(gòu)建速度的17條建議

較長的構(gòu)建時(shí)間將會減緩項(xiàng)目的開發(fā)進(jìn)度,特別是對于大型的項(xiàng)目,app的構(gòu)建時(shí)間長則十幾分鐘,短則幾分鐘,長的構(gòu)建時(shí)間已經(jīng)成了開發(fā)瓶頸,本篇文章根據(jù)Google官方文檔,加上自己的一些理解提供一些提升app構(gòu)建速度的優(yōu)化建議。

創(chuàng)新互聯(lián)"三網(wǎng)合一"的企業(yè)建站思路。企業(yè)可建設(shè)擁有電腦版、微信版、手機(jī)版的企業(yè)網(wǎng)站。實(shí)現(xiàn)跨屏營銷,產(chǎn)品發(fā)布一步更新,電腦網(wǎng)絡(luò)+移動網(wǎng)絡(luò)一網(wǎng)打盡,滿足企業(yè)的營銷需求!創(chuàng)新互聯(lián)具備承接各種類型的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)項(xiàng)目的能力。經(jīng)過10余年的努力的開拓,為不同行業(yè)的企事業(yè)單位提供了優(yōu)質(zhì)的服務(wù),并獲得了客戶的一致好評。

1. 為開發(fā)環(huán)境創(chuàng)建一個(gè)變體

有許多配置是你在準(zhǔn)備app的release 版本的時(shí)候需要,但是當(dāng)你開發(fā)app的時(shí)候是不需要的,開啟不必要的構(gòu)建進(jìn)程會使你的增量構(gòu)建或者clean構(gòu)建變得很慢,因此需要構(gòu)建一個(gè)只保留開發(fā)時(shí)需要配置的變體,如下例子創(chuàng)建了一個(gè)dev和prod變體(prod 為release 版本的配置)。

 
 
 
 
  1. android {
  2.   ...
  3.   defaultConfig {...}
  4.   buildTypes {...}
  5.   productFlavors {
  6.     // When building a variant that uses this flavor, the following configurations
  7.     // override those in the defaultConfig block.
  8.     dev {
  9.       // To avoid using legacy multidex, set minSdkVersion to 21 or higher.
  10.       minSdkVersion 21
  11.       versionNameSuffix "-dev"
  12.       applicationIdSuffix '.dev'
  13.     }
  14.     prod {
  15.       // If you've configured the defaultConfig block for the release version of
  16.       // your app, you can leave this block empty and Gradle uses configurations in
  17.       // the defaultConfig block instead. You still need to create this flavor.
  18.       // Otherwise, all variants use the "dev" flavor configurations.
  19.     }
  20.   }

2 . 避免編譯不必要的資源

避免編譯和包含你沒有測試的資源(比如添加的一個(gè)本地的語言和屏幕密度資源),你可以只在你的’dev’ flavor下指定一種語言和一個(gè)屏幕密度,如下:

 
 
 
 
  1. android {
  2.   ...
  3.   productFlavors {
  4.     dev {
  5.       ...
  6.       // The following configuration limits the "dev" flavor to using
  7.       // English stringresources and xxhdpi screen-density resources.
  8.       resConfigs "en", "xxhdpi"
  9.     }
  10.     ...
  11.   }

上面的配置將會限制dev 變體只使用 english string 資源和 xxhdpi 屏幕密度資源。

3 . 配置debug 構(gòu)建的Crushlytics為不可用狀態(tài)

在debug 構(gòu)建狀態(tài)下,如果你不需要運(yùn)行崩潰上報(bào),你可以將這個(gè)插件設(shè)置為不可用狀態(tài)來提升你的構(gòu)建速度,如下:

 
 
 
 
  1. android {
  2.   ...
  3.   buildTypes {
  4.     debug {
  5.       ext.enableCrashlytics = false
  6.     }

上面只是舉個(gè)例子,Crushlytics 為崩潰上報(bào)分析工具,在開發(fā)的時(shí)候我們可能不需要,因此不需要打開,在我們實(shí)際開發(fā)中,像崩潰上報(bào)SDK,數(shù)據(jù)統(tǒng)計(jì)SDK等(如 友盟統(tǒng)計(jì)、GrowingIO、百度統(tǒng)計(jì))在開發(fā)階段都設(shè)置為不可用,來提升構(gòu)建速度。

4 . 用靜態(tài)的構(gòu)建配置值來構(gòu)建你的Debug版

一般地,在你的debug 構(gòu)建時(shí),為manifest文件或者資源文件配置使用靜態(tài)/硬編碼的值。如果你的manifest或者資源文件的值每次構(gòu)建都需要動態(tài)更新,那么Instant Run 無法執(zhí)行代碼交換-它必須重新構(gòu)建和安裝新的APK。

例如,使用動態(tài)的version codes ,version names ,resources或者其他更改manifest文件的構(gòu)建邏輯,每次你想執(zhí)行一個(gè)修改都會構(gòu)建全部APK,即使實(shí)際的修改可能僅僅只需要熱交換。如果這些構(gòu)建配置是需要動態(tài)配置的,那么將它們從你的release 構(gòu)建變體中分離出來,并且在你的debug 構(gòu)建中保留它們的靜態(tài)值。像下面build.gradle 文件顯示的這樣:

 
 
 
 
  1. int MILLIS_IN_MINUTE = 1000 * 60
  2. int minutesSinceEpoch = System.currentTimeMillis() / MILLIS_IN_MINUTE
  3. android {
  4.     ...
  5.     defaultConfig {
  6.         // Making either of these two values dynamic in the defaultConfig will
  7.         // require a full APK build and reinstallation because the AndroidManifest.xml
  8.         // must be updated (which is not supported by Instant Run).
  9.         versionCode 1
  10.         versionName "1.0"
  11.         ...
  12.     }
  13.     // The defaultConfig values above are fixed, so your incremental builds don't
  14.     // need to rebuild the manifest (and therefore the whole APK, slowing build times).
  15.     // But for release builds, it's okay. So the following script iterates through
  16.     // all the known variants, finds those that are "release" build types, and
  17.     // changes those properties to something dynamic.
  18.     applicationVariants.all { variant ->
  19.         if (variant.buildType.name == "release") {
  20.             variant.mergedFlavor.versionCode = minutesSinceEpoch;
  21.             variant.mergedFlavor.versionName = minutesSinceEpoch + "-" + variant.flavorName;
  22.         }
  23.     }

5 . 用靜態(tài)的版本依賴

當(dāng)你在build.gradle文件中聲明依賴的時(shí)候,你應(yīng)該避免在版本號結(jié)束的地方使用+號,比如:com.android.tools.build:gradle:2.+ 因?yàn)镚radle的檢查更新,用動態(tài)的版本號會導(dǎo)致未知的版本更新、使解決版本的差異變得困難和更慢的構(gòu)建。你應(yīng)該使用靜態(tài)或者硬編碼版本號來代替。如:com.android.tools.build:gradle:2.2.2 。

6 . 使 on demand 配置為enable 狀態(tài)

為了讓Gradle能夠確切的知道該如何構(gòu)建你的APP,在每次構(gòu)建之前,構(gòu)建系統(tǒng)配置工程的所有modules和其他依賴(即使你只想構(gòu)建或者測試一個(gè)modules),這使得大型的多module 工程的構(gòu)建速度變得很慢。告訴Gradle僅僅配置你想要構(gòu)建的Modules,用如下步驟使 on demand 配置可用

(1) 在菜單欄上選擇 File -> Settings(如果是Mac上 ,選擇 Android Studio ->Preferences)

(2) 導(dǎo)航到 Build,Execution,Deployment -> Compiler

(3) check Configure on demand 復(fù)選框

(4) 點(diǎn)擊 OK

如圖:

on_demand.png

7 . 創(chuàng)建 library 模塊

檢查你app中的代碼,將可模塊化的代碼抽取一個(gè)Android Library module,通過這種方式模塊化你的代碼將允許構(gòu)建系統(tǒng)僅僅只編譯那些有改動的模塊,并將其構(gòu)建結(jié)果緩存下來以被后面的構(gòu)建使用。同樣的配置了 on demand 和 parallel project execution (project 并行執(zhí)行) 將更加高效(當(dāng)你打開這些特性時(shí))。

8 . 為自定義構(gòu)建邏輯創(chuàng)建Tasks

在你創(chuàng)建了 build profile (build profile 后文會講)之后,如果顯示構(gòu)建時(shí)間相對長的一部分時(shí)間花在“configure project(配置工程)階段,那么請 review 你的build.gradle 腳本,并且查找可包含到自定義Gradle Task中的代碼,通過將一些構(gòu)建邏輯移動到一個(gè)task 中,當(dāng)需要的時(shí)候才運(yùn)行,結(jié)果能被緩存用于后續(xù)的構(gòu)建,并且這個(gè)構(gòu)建邏輯可以并行執(zhí)行(如果你開啟了 并行執(zhí)行project),更多詳細(xì)信息請閱讀Gradle官方文檔。 official Gradle documentation

小提示:

如果你的構(gòu)建包含了大量的自定義任務(wù)tasks,你可能想清理你的build.gradle文件,通過自定義task classes (也就是自定義Gradle 插件啦),將你的classes 添加到 project-root/buildSrc/src/main/groovy/目錄下,Gradle將自動包含它們到class path ,為項(xiàng)目的所有build.gradle文件。

9 . 配置 dexOptions 和 開啟 library pre-dexing(dex預(yù)處理)

先補(bǔ)充一個(gè)知識點(diǎn):Dex-in-process:新發(fā)布的Android Studio 2.1增加了一個(gè)新的特性:Dex In Process,可以極大的加快重新編譯的速度,同樣也能提高Instant Run的性能。(第10條優(yōu)化建議會說到)

詳情請看Faster Android Studio Builds with Dex In Process

Android 插件提供了 dexOptions script block ,因此你可以配置相應(yīng)的 DEX 構(gòu)建特性,它們可以提高構(gòu)建速度:

(1)preDexLibraaies : 聲明是否對依賴的庫進(jìn)行dex 預(yù)處理來使你的增量構(gòu)建更快速,因?yàn)檫@個(gè)特性可能會使你的clean 構(gòu)建變慢,因此在你的持續(xù)集成服務(wù)器上你可能想關(guān)閉這個(gè)特性。

(2) maxProcessCount : 設(shè)置最大的線程數(shù)量使用當(dāng)運(yùn)行 dex-in-process時(shí),默認(rèn)值是4。

(3)javaMaxHeapSize: 為DEX 編譯器 設(shè)置最大的堆大小,相對于設(shè)置這個(gè)屬性,你應(yīng)該增加 Gradle的 堆大小(這個(gè)堆大小dex-in-process可用的時(shí)候?qū)EX 編譯器有效)

例子:

 
 
 
 
  1. android {
  2.   ...
  3.   dexOptions {
  4.     preDexLibraries true
  5.     maxProcessCount 8
  6.     // Instead of setting the heap size for the DEX process, increase Gradle's
  7.     // heap size to enable dex-in-process. To learm more, read the next section.
  8.     // javaMaxHeapSize "2048m"
  9.   }

你應(yīng)該增加它們的值來測試一下這些設(shè)置,然后通過profile觀察效果,當(dāng)你為這個(gè)進(jìn)程分配太多資源的時(shí)候,可能會得到一個(gè)負(fù)面的影響。

10 . 增加Gradle的堆大小 和開啟 dex-in-process

Dex-in-process 允許多個(gè)DEX 進(jìn)程運(yùn)行在一個(gè)單獨(dú)的VM 中,這使得增量構(gòu)建和清理構(gòu)建變得更快。默認(rèn)情況下,通過Android Studio2.1 或者更高版本創(chuàng)建的新項(xiàng)目分配了足夠的內(nèi)存來開啟這個(gè)特性,如果你沒有使用Android Studio 2.1 或者更高的版本創(chuàng)建項(xiàng)目,你需要給Gradle后臺駐扎程序設(shè)置至少1536MB 的堆大小內(nèi)存。默認(rèn)如下圖:

gradle_heap.png

下面的例子在gradle.properties中將Gradle 堆內(nèi)存大小設(shè)置為 2048MB:

 
 
 
 
  1. org.gradle.jvmargs = -Xmx2048m //設(shè)置Gradle 堆大小 2G

在一些大型的項(xiàng)目上,為Gradle堆分配更多的內(nèi)存當(dāng)然更有利,然而,如果你用的是一個(gè)小內(nèi)存的機(jī)器,你可能需要給IDE配置更少的內(nèi)存,想知道如何改變分配給IDE資源的數(shù)量和Gradle 對構(gòu)建表現(xiàn)的影響,請看profiling your build這一條。

如果在你的Module build.gradle 文件中為android.dexOptions.javaMaxHeapSize定義了%


網(wǎng)站欄目:Android優(yōu)化APP構(gòu)建速度的17條建議
URL網(wǎng)址:http://m.5511xx.com/article/cdicchh.html