1. 程式人生 > >Android Studio 3.0及Gradle Plugin 3.0升級過程中踩到的那些坑

Android Studio 3.0及Gradle Plugin 3.0升級過程中踩到的那些坑

前言:

  2018轉眼已經過去一快小半年,墮落了很長一段時間,覺得回到家鄉小地方,沒有了追求技術的熱情。直到前段時間跟以前的同事聊的過程中發現自己已經脫離正軌了。雖然不再北上廣深了,但是技術還是得靠自己去折騰。也許有一天回過頭來看看,自己曾經那麼愛android是吧。哈哈。廢話不多扯了,直接進入今天要給大家帶來的嘮嗑。

正題:

大家都知道Android已經到android8了,開發工具也持續更新到Android Studio3.1了,gradle也更新到4.4了,也許你可能要問,我為啥要更新,用原來的2.×的版本不行麼?行,怎麼會不行呢,只是很多技術是向前看的,工具也是要跟上時代,才能達到事半功倍的效果,

這幾天我也是折騰很久,才升級好,那麼我把我踩過的坑分享給大家是希望大家能避免我的折騰路。

1.Gradle Plugin升級到3.0.0及以上,修改project/build.gradle檔案:

buildscript {
    repositories {
        ...
        // You need to add the following repository to download the
        // new plugin.
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0'//這裡知道是3.0.0以上就可以
    }
}

2.Gradle升級到4.1及以上,修改project/gradle/gradle-wrapper.properties檔案:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip

3.生成APK檔名屬性outputFile變為只讀

改完第一步後,編譯會報如下錯誤:這個是生成APK的打包檔案

Error:(88, 0) Cannot set the value of read-only property ‘outputFile’ for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=appDebug, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

之前的Apk打包檔案類似這樣:

  // 自定義匯出apk名稱
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                if (variant.buildType.name.equals('release')) {
                    def fileName = "mobiletianya-v${defaultConfig.versionName}-${defaultConfig.versionCode}-release.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
                if (variant.buildType.name.equals('debug')) {
                    def fileName = "mobiletianya-v${defaultConfig.versionName}-${defaultConfig.versionCode}-debug.apk"
                    output.outputFile = new File(outputFile.parent, fileName)
                }
            }
        }
    }

而升級後由於outputFile屬性變為只讀,需要進行如下修改,直接對outputFileName屬性賦值即可:

applicationVariants.all { variant ->
        variant.outputs.all { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                if (variant.buildType.name.equals('release')) {
                    def fileName = "mobiletianya-v${defaultConfig.versionName}-${defaultConfig.versionCode}-release.apk"
                    outputFileName = fileName
                }
                if (variant.buildType.name.equals('debug')) {
                    def fileName = "mobiletianya-v${defaultConfig.versionName}-${defaultConfig.versionCode}-debug.apk"
                    outputFileName = fileName
                }
            }
        }
    }

4.關鍵字的依賴傳遞

  • api: 對應之前的compile關鍵字,功能一模一樣。會傳遞依賴,導致gradle編譯的時候遍歷整顆依賴樹
  • implementation: 對應之前的compile,與api類似,關鍵區別是不會有依賴傳遞
  • compileOnly: 對應之前的provided,依賴僅用於編譯期不會打包進最終的apk中
  • runtimeOnly: 對應之前的’apk’,與上面的compileOnly相反

關於implementationapi的區別,主要在依賴是否會傳遞上。如:A依賴B,B依賴C,若使用api則A可以引用C,而implementation則不能引用。

以上四點是最基本的,實際應用中一寫lib包的依賴關係主要也是圍繞這幾點來修改

註明:下面是一些遇到的小問題:

1.Aapt2異常

升級到3.0.0版本,編譯之前正常的專案後報錯Error:com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for

上面是官方的文件介紹,我們可以看到在gradle3.0.0中AAPT2是預設開啟的,在專案的gradle.properties中新增android.enableAapt2=false,sync後就編譯通過了

這幾個是比較公用的,剩下那些是跟自己專案相關的,具體專案具體分析,後續繼續更新

相關推薦

Android Studio 3.0Gradle Plugin 3.0升級過程到的那些

前言:  2018轉眼已經過去一快小半年,墮落了很長一段時間,覺得回到家鄉小地方,沒有了追求技術的熱情。直到前段時間跟以前的同事聊的過程中發現自己已經脫離正軌了。雖然不再北上廣深了,但是技術還是得靠自己去折騰。也許有一天回過頭來看看,自己曾經那麼愛android是吧。哈哈。廢

Android Studio Could not GET gradle-3.2.0.pom (安卓包配置相關問題)

could 9.png too spa not pom .com sharp 安卓 安卓出現的錯誤如下 Could not GET ‘https://dl.google.com/dl/android/maven2/com/android/tools/build/gradl

Android Studio:Minimum supported Gradle version is 3.3. Current version is 3.2 問題解決

轉自:https://blog.csdn.net/jinzhengxi/article/details/70338708 今天把Android Studio再次進行了更新,從2.2.3更新到了2.3版本,開啟之前的工程一直提示讓我升級,如下圖所示:  PS: 我的工程是使用Androi

Android Studio專案打包:常見錯誤3:com.android.ide.common.process.ProcessException: Failed to execute aapt

Error while generating dependencies split APK com.android.ide.common.process.ProcessException: Failed to execute aapt Caused by: java.util.NoSuchE

使用Android Studio進行簽名使用gradle配置簽名

一、Debug模式下的簽名       執行或從IDE除錯專案時,Android的Studio會自動由Android SDK工具生成的除錯證書籤名的APK。您執行或除錯Android Studio中的專案第一次,IDE會自動在除錯金鑰庫和證書 $HOME/.android/

ANDROID STUDIO系列教程六--GRADLE多渠道打包

tor 等待 time() utf 腳本 manifest file resource 一個 由於國內Android市場眾多渠道,為了統計每個渠道的下載及其它數據統計,就需要我們針對每個渠道單獨打包,如果讓你打幾十個市場的包豈不煩死了,不過有了Gradle,這再也不是事了。

Android Studio卡在refreshing gradle project的原因和快速解決辦法

adl 當前 files 成了 span jsb text eas 遇到 這個問題遇到過很多次,網上也有很多解決辦法,但是好像都沒有發現refreshing gradle project在做什麽。 可以再試試 ./gradlew --info 看看詳細信息。 一般refre

擁抱 Android Studio 之五:Gradle 插件開發

變量 -h min gui root artifact direct 抽象 path 實踐出真知 筆者有位朋友。每次新學一門語言,都會用來寫一個貪吃蛇遊戲,以此來檢驗自己學習的成果。筆者也有相似體會。所謂紙上得來終覺淺

如何用Android Studio查看build.gradle源碼

容易 https ask 基礎 groovy shu result 支持 ref 上一篇博客裏講過 build.gradle 裏的每一行代碼基本都是在調用一個方法,既然是這樣,我們就可以用 android studio(下面簡稱as) 去查看它源碼的方法註釋說明,這樣就可以

Mac android studio 一直卡在Gradle:Build Running的解決辦法

1.找到路徑/Users/michael/.gradle/wrapper/dists/gradle-4.1-all/bzyivzo6n839fup2jbap0tjew,在此資料夾下有一個gradle版本資料夾,開啟後是一個名字很長的資料夾,例如我的/Users/michael/.gradle/wrapper/

Android Studio使用Google Flutter完整教程 【0

轉載自:https://blog.csdn.net/gfg156196/article/details/81118368   一套程式碼 iOS、Android 兩端執行,Google Flutter 實在太強大。。 “Flutter 可幫助你更容易、更快速的開發介面美觀的移動

android studio 裝置除錯Logcat檢視

文章轉載自:http://www.cnblogs.com/apaojun/p/4283944.html 現在android的開發工具基本上都改用android studio而慢慢棄用eclipse了,那麼android studio的除錯裝置該怎麼設定和檢視程式的Logcat呢? &n

android studio使用要點常見錯誤

1、主專案跟他的依賴lib要放在同一個目錄才能在eclipse中export 2、匯入eclipse中匯出的專案到studio後的配置: (1)開啟工作空間目錄下的 gradle –> wrapper –> gradle-wrapper.properties 。修改一下

Android Studio 配置 JDK SDK gradle

關於配置問題。一定要找對自己檔案版本。配置路徑。不要以為拷貝過去就感覺可以用了。 一,JAVA JDK環境配置 1,終端建立環境變數配置檔案(第一次配置檔案使用) touch .bash_profile 2,開啟自定義建立的配置(bash_profile) op

Android Studio匯入新專案,gradle報 read timed out的情景之一

我使用Android Studio3.0匯入新專案時,gradle報 read timed out的情景之一: 由於專案的sdk沒有使用自己下載的jdk1.8,而是使用AndroidStudio預設的jre目錄,所以導致這個問題 。只要修改下jdk路徑就好: 但是改完後,這個問題是解決

Android Studio 使用教程(4)---gradle專案構建

Android Studio 使用教程(四)之gradle專案構建 1、gradle的概念 2、gradle配置jar包,和libs資料夾匯入jar包的區別 3、簽名打包:     (1)Studio     (2)命令列     (3)gradle wrap

Android Studio在啟動時gradle的問題:Download https://services.gradle.org/distributions/gradle-4.6-all.zip

Android Studio在啟動時一直在下載gradle的問題:Download https://services.gradle.org/distributions/gradle-4.6-all.zip 時如何解決? 首先在底部會出現載入的程序,如果有錯誤,在這裡

Ubuntu16.04下安裝配置Android studio,sdk,gradle——一篇文章就夠了系列

64位ubuntu16.04完美安裝配置jdk、sdk、Android studio 一、下載安裝jdk、sdk、Android studio 注意:我把JDK安裝在了/opt資料夾下面,/opt資料夾和/usr資料夾同樣都是常用做安裝軟體的資料夾,不同的是/usr是

幾個關於Android Studio的問題解決方案

【問題一】Android Studio中在Android Virtual Device Manager中新增Android Virtual Device時,報錯:Intel HAXM is requi

Android Studio混淆模板常用第三方混淆(看了都說好)

首先要在build.gradle中開啟混淆,也就是minifyEnabled true,我用的build.gradle具體如下所示: def releaseTime() { return new Date().format("yyyy.MM.dd", TimeZone.getTimeZ