第一次使用Android Studio時你應該知道的一切配置(三):gradle項目構建
https://www.cnblogs.com/smyhvae/p/4456420.html
android studio生成aar包並在其他工程引用aar包
https://blog.csdn.net/getchance/article/details/47257389
gradle優化配置,提高速度
第一步:配置.gradle文件夾目錄(開啓Gradle單獨守護線程)
org.gradle.daemon=true // 開啓線程守護,第一次編譯時開線程,之後就不會再開了
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 // 配置編譯時的虛擬機大小
org.gradle.parallel=true // 開啓並行編譯,相當於多條線程再走
org.gradle.configureondemand=true 啓用新的孵化模式
org.gradle.daemon=true
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=8192m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
org.gradle.parallel=true
org.gradle.configureondemand=true
gradlePropertiesProp=gradlePropertiesValue
sysProp=shouldBeOverWrittenBySysProp
envProjectProp=shouldBeOverWrittenByEnvProp
systemProp.system=systemValue
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=8192m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
第二步:修改android studio配置
-
Ctrl+Alt+S打開設置選項卡,找到Gradle選項,選中offline work,點擊apply,如下
gradle選項配置
-
找到Compiler選項,設置如下
參考:加快gradle的編譯速度總結-親身經歷
https://www.jianshu.com/p/200d55b4d40a
https://m.imooc.com/article/20533
1.更新配置Gradle版本
Gradle需要更新到4.1,在gradle/wrapper/gradle-wrapper.properties中配置:
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
然後就配置Android Plugin的版本
buildscript {
repositories {
jcenter()
google()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.0'
}
}
allprojects {
repositories {
jcenter()
google()
}
}
然後同步gradle。
通常情況下你會發現速度特別慢,因爲沒有翻牆,默認是從國外服務器下載gradle;
這時候就可以強關AS,直接在網上找資源,把gradle-4.1-all.zip這個包,放在
C:\Users\你的用戶名\.gradle\wrapper\dists\gradle-4.1-all\bzyivzo6n839fup2jbap0tjew\gradle-4.1
目錄中(最後那個亂碼文件夾名字每臺機器上不一樣),注意不需要手動解壓,然後重啓AS自動同步gradle即可;
2.Flavor Dimensions變更
Android Plugin3.0的依賴機制:在使用library時會自動匹配variant(debug, release),就是說app的debug會自動匹配library的debug,相信大多數人也像我一樣,當library多了,不會手動選擇每個Library的variant。現在好了,它會自動匹配了。同樣如果使用flavor的時候,比如app的redDebug同樣會自動匹配library的readDebug。雖然有這樣的優勢,但是在使用flavor時,必須定義flavor dimension,否則會提示錯誤:
Error:All flavors must now belong to a named flavor dimension.
The flavor 'flavor_name' is not assigned to a flavor dimension.
加上默認的dimension;大概就是爲了保證各個渠道包要保持某些屬性的一致;總之按照官網上的說法,只要給每個渠道都設置一個“flavorDimensions”就可以了
這個錯誤,我也已經在使用Android Studio3.0以後碰到好多次了。現在使用flavor,必須像下面一樣配置:
// Specifies a flavor dimension.
flavorDimensions "color"
productFlavors {
red {
// Assigns this product flavor to the 'color' flavor dimension.
// This step is optional if you are using only one dimension.
dimension "color"
...
}
blue {
dimension "color"
...
}
}
注意:如果library有兩個dimensions:color,shape,但是app只有color,那麼會如下的編譯錯誤:
Error:Could not resolve all dependencies for configuration ':bar:redDebugCompileClasspath'.
Cannot choose between the following configurations on project :foo:
- redCircleDebugApiElements
- redSquareDebugApiElements
...
APP使用flavorSelection選定使用某個flavor dimension,注意如下配置:
android { ... // The flavorSelection property uses the following format: // flavorSelection 'dimension_name', 'flavor_name' // Chooses the 'square' flavor from libraries that specify a 'shape' // dimension. flavorSelection 'shape', 'square'}
4.使用annotationProcessor
使用annotationPorcessor代替apt
dependencies {
...
annotationProcessor 'com.google.dagger:dagger-compiler:<version-number>'
}
注意:目前apt可用,但是未來穩定版本會移除。
//1.在project的build.gradle中刪除
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
//2.在module的build.gradle中刪除
apply plugin:'android-apt'
//3.將module的build.gradle文件中的
dependencyapt 'com.jakewharton:butterknife-compiler:8.1.0'
改爲annotationProcessor'com.jakewharton:butterknife-compiler:8.1.0'
gradle打包,自定義apk名稱代碼報錯(Cannot set the value of read-only property 'outputFile' )
報錯
Error:(56, 0) Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.
<a href="openFile:D:\eclipseCode\ipay-android\xinlebao\build.gradle">Open File</a>
解決 :修改文件名代碼請這樣寫
android.applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "xinlebao_${defaultConfig.versionName}_${releaseTime()}.apk"
}
}
在主項目model中加入獲取時間戳方法:
def buildTime() {
def date = new Date()
def formattedDate = date.format('yyyy_MM_dd--HH:mm')
return formattedDate
}
AAPT2 編譯報錯 AAPT2 error
-
報錯
Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
-
解決:在gradle.properties中關閉APPT2 編譯
android.enableAapt2=false
-
注:如果是eclipse轉到as上的項目,可能沒有gradle.properties文件,請在項目根目錄中手動創建
參考鏈接:http://www.jianshu.com/p/9af06314e036
http://makaidong.com/bluestorm/970_9001358.html
http://blog.csdn.net/ncuboy045wsq/article/details/73521856
http://www.jianshu.com/p/9af06314e036
更新時間:2018/01/21
https://maven.google.com 連接不上的解決辦法
dl.google.com 局域網可訪問
https://maven.google.com 會 301 跳轉到https://dl.google.com/dl/android/maven2/
所以直接替換 https://maven.google.com 爲https://dl.google.com/dl/android/maven2/
maven { url 'https://dl.google.com/dl/android/maven2/'}
參考博客:http://blog.csdn.net/a06_kassadin/article/details/72796696
更新時間:2018/02/09
Can't process attribute android:fillColor="@color/text_gray": references to other resources are not
...
升級爲android studio3.0,gradle升級爲4.1,報錯:
A failure occurred while executing com.android.build.gradle.tasks.MergeResources$FileGenerationWorkAction
> Error while processing D:\Android\WeishuProjects\Zszy\app\src\main\res\drawable\ic_right_gray_24dp.xml : Can't process attribute android:fillColor="@color/text_gray": references to other resources are not supported by build-time PNG generation.
解決方法:
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
你需要在項目的build.gradle腳本中,增加對Vector兼容性的支持
更新時間:2018/02/09
Android Studio3.0之後由compile變爲implementation
在com.android.tools.build:gradle 3.0 以下版本依賴在gradle 中的聲明寫法
compile fileTree(dir: 'libs', include: ['*.jar'])
- 但在3.0後的寫法爲
implementation fileTree(dir: 'libs', include: ['*.jar'])
或
api fileTree(dir: 'libs', include: ['*.jar'])
其實在新版本 Android Gradle plugin 3.0
中 已經將 compile
標記爲過時了,而取而代之的是 implementation
和 api
兩個關鍵字。那麼它們有什麼區別呢?
api
關鍵字 其實等同於 compile
。但爲什麼要換個名字呢,目前還沒有查到相關的信息,如有大神知道,請留言告知。
implementation
:
這個指令的特點就是,對於使用了該命令編譯的依賴,對該項目有依賴的項目將無法訪問到使用該命令編譯的依賴中的任何程序,也就是將該依賴隱藏在內部,而不對外部公開。
使用了該命令編譯的依賴,它僅僅對當前的 Moudle 提供接口。例如我們當前項目結構如下:
LibraryA 中引用了 LibraryC 的庫,如果對 LibraryC 的依賴用的是 implementation 關鍵字。 如下:
dependencies {
. . . .
implementation project(path:':libraryC')
}
那麼 LibraryC 中的接口,僅僅只能給 LibraryA 使用,而我們的 App Moudle 是無法訪問到 LibraryC 提供的接口的,也就是將該依賴隱藏在內部,而不對外部公開。這就是 implementation 關鍵字的作用。
那爲什麼要這麼做呢?
答案是: 1. 加快編譯速度。2. 隱藏對外不必要的接口。
爲什麼能加快編譯速度呢?
這對於大型項目含有多個 Moudle 模塊的, 以上圖爲例,比如我們改動 LibraryC 接口的相關代碼,這時候編譯只需要單獨編譯 LibraryA 模塊就行, 如果使用的是 api 或者舊時代的 compile,由於App Moudle 也可以訪問到 LibraryC ,所以 App Moudle 部分也需要重新編譯。當然這是在全編的情況下。
至於編譯速度的對比,國外有個小哥已經做了簡單的對比,效果還是不錯。地址可點擊原文跳轉過去查看。
那麼我們現有項目中的依賴如何修改呢?
答案是:將 compile 都修改爲 implementation 然後嘗試進行項目構建,如果構建成功那麼恭喜你,如果構建不成功,則查看相關的依賴項,並將其修改爲 api 關鍵字依賴。
參考鏈接:https://juejin.im/post/5a0a71466fb9a045196918ab
自我總結:使用implementation 加快編譯速度,只訪問依賴的庫項目,不會訪問庫裏面嵌套依賴的庫項目。報錯的依賴庫改api
更新時間:2018/8/8
android項目app中引用不到module下的jar包問題
在module中導入了***.jar或者在線的包,在app中如果想引用這個jar裏相關的內容時,發現根本引用不到,會提示你add library/*****.jar 一大串,你回車一下或者點一下沒反應,根本沒有用。
只需把module下gradle裏相關jar的implementation改爲api即可,因爲implementation 修飾的只能在當前module中引用,你在app下是引用不了的,你改完重新編譯下即可進行引用了。
參考:https://blog.csdn.net/weixue9/article/details/80774418
主項目和庫項目清單文件衝突錯誤
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
(Manifest合併失敗)
解決:註釋application屬性
<!--Error:Execution failed for task ':app:processDebugManifest'.-->
<!--> Manifest merger failed with multiple errors, see logs-->
<!--清單文件合併錯誤-->
<!--android:icon="@mipmap/ic_launcher"-->
<!--android:label="@string/app_name"-->
<!--android:supportsRtl="true"-->
<!--tools:replace="android:icon, android:label,android:theme"-->
<!--android:theme="@style/AppTheme"-->
<application
android:allowBackup="true"
>
。。。
com.android.support衝突的解決辦法
exclude group:表示只要包含com.android.support的都排除
api是android studio3.0中新的依賴方式,對依賴方式還不熟悉的話可以看這篇文章:Android Studio3.0新的依賴方式
例如:
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support'
}
- module:刪排除group中的指定module
例如:
api("com.afollestad.material-dialogs:core:0.9.5.0") {
exclude group: 'com.android.support', module: 'support-v13'
exclude group: 'com.android.support', module: 'support-vector-drawable'
}
- 另外還有一個建議,在我們自己創建library給別人使用時,如果需要依賴com.android.support的話,建議用provided的方式依賴(android studio3.0中更改爲compileOnly),這樣只會在編譯時有效,不會參與打包。以免給使用者帶來不便。
例:
provided 'com.android.support:appcompat-v7:26.1.0'
使用統一的support版本包
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
def requested = details.requested
if (requested.group == 'com.android.support') {
if (!requested.name.startsWith("multidex")) {
// details.useVersion '26.1.0'
details.useVersion '27.1.1'
}
}
}
}
。。。