近段時(shí)間有機(jī)會(huì)接觸到iOS開發(fā),但是光Xcode上配置證書,描述文件萧落,上真機(jī)調(diào)試等就費(fèi)了挺大勁。結(jié)合看到很多Android開發(fā)新手問的簡(jiǎn)單問題洗贰,忽然有了更多的理解找岖。
總需要有人引一下,別被開頭的困難束縛了前進(jìn)的步伐敛滋。另外也算是繼續(xù)未完成的《一個(gè)三年Android開發(fā)的總結(jié)》许布。
AndroidStudio常用配置及使用技巧分兩篇寫,將詳細(xì)講述從導(dǎo)入開源工程绎晃,配置gradle編譯蜜唾,到使用各種快捷鍵瀏覽分析源代碼,高效的編譯庶艾、開發(fā)袁余、調(diào)試程序,監(jiān)測(cè)應(yīng)用運(yùn)行狀態(tài)咱揍。
本篇先整體介紹一個(gè)android studio工程的基本配置文件和android應(yīng)用的編譯流程颖榜,再實(shí)際的導(dǎo)入一個(gè)開源工程,將可能遇到的問題一一分析煤裙,提供解決方法的同時(shí)掩完,也能了解如何更好的定位問題和搜索解決方案。
一积暖、Android Studio工程基本構(gòu)成
Google基于Intellij IDEA社區(qū)版提供了Android Studio藤为。IDEA工程結(jié)構(gòu)由工程(Project)、模塊(Module)夺刑、庫(Library)缅疟、SDK和方面配置(Facet,翻譯的不好遍愿,完整說明請(qǐng)看文末參考鏈接)構(gòu)成存淫。在Android Studio中我們主要理解工程、模塊沼填、庫和SDK桅咆,F(xiàn)acet則可以簡(jiǎn)化為Gradle配置。典型工程目錄如圖所示:
在一個(gè)工程中可以有多個(gè)模塊坞笙,這兩個(gè)概念只是將相關(guān)的文件聚合到一起岩饼,并不強(qiáng)制要求工程與模塊之間的關(guān)系荚虚。
模塊的生成會(huì)依賴于庫和SDK。從Android工程上說籍茧,就是模塊既可以生成APK文件版述,也可以作為庫模塊提供aar包供其他模塊使用。模塊中也依賴Android SDK和各種第三方庫寞冯,通過在build.gradle中的配置可見渴析。
這里先介紹自動(dòng)生成的.iml文件和.idea目錄下的配置文件,第二部分再詳細(xì)說明跟gradle工程相關(guān)的目錄吮龄。
到具體的工程目錄中俭茧,可以看到相關(guān)的配置文件,涉及根目錄的*.iml文件和.idea目錄漓帚。iml文件中定義了工程的相關(guān)配置信息母债,有Facet為Java-gradle,編譯路徑為build目錄等尝抖。
在.idea目錄下场斑,包括了compiler.xml,encodings.xml牵署,modules.xml,gradle.xml等等喧半,設(shè)置編譯哪些文件奴迅,文件編碼,包含哪些模塊挺据,gradle信息取具。但是這里的workspace.xml則記錄了你的個(gè)人設(shè)置,包括哪些窗口顯示哪些文件扁耐,工程顯示方式是Android還是Project形式等等暇检。
其實(shí)不必太關(guān)心這里的配置,當(dāng)你導(dǎo)入一個(gè)開源工程時(shí)婉称,Studio會(huì)從已有的gradle文件完成這些文件和目錄的創(chuàng)建块仆。
開篇講了大段的工程配置文件,其目的是了解工程目錄中和代碼不直接相關(guān)的目錄和文件王暗,平時(shí)也不要太在意悔据。而編譯生成APK安裝包最應(yīng)該關(guān)心的是使用Gradle編譯。
二俗壹、Gradle工程編譯
1. 工程結(jié)構(gòu)
Android最初是在Eclipse中配合ADT完成開發(fā)的科汗,而構(gòu)建工具(打包生成apk文件)是Ant。在切換到Android Studio后绷雏,構(gòu)建工具也換成了Gradle头滔。一般的Android應(yīng)用工程都是Android Gradle(Gradle的Android插件)目錄結(jié)構(gòu)怖亭,如上圖所示。
工程中的模塊都有自己?jiǎn)为?dú)的目錄坤检,目錄中都有build.gradle文件兴猩。
具體的模塊目錄中:
build:編譯中產(chǎn)生的臨時(shí)文件,最終生成的apk文件在build/outputs/apk目錄下
libs:模塊依賴的動(dòng)態(tài)庫(so文件)或者jar包文件等
src:源碼目錄缀蹄,包括Java源代碼峭跳、資源文件、AndroidManifest文件等
proguard-rules.pro:混淆配置文件
build.gradle:模塊配置文件缺前,描述模塊采用的SDK蛀醉,Build Tools版本,最終是庫文件還是生成apk文件等信息
*.iml:文件中定義了模塊的相關(guān)配置信息衅码,有Facet依然為java-gradle拯刁,編譯路徑為build目錄,源碼路徑逝段,依賴庫路徑信息
外層工程目錄中:
gradle:gradle版本信息垛玻,包括下載地址
gradle.properties:gradle運(yùn)行配置,包括代理設(shè)置奶躯,內(nèi)存大小設(shè)置等
gradlew和gradlew.bat:封裝好的gradle命令帚桩,指定用gradle目錄下的gradle版本
local.properties:Android SDK和NDK目錄配置信息
settings.gradle:gradle工程中包含哪些模塊
這樣的目錄結(jié)構(gòu)也是秉承于Gradle的build-by-convention特點(diǎn),做了大量的默認(rèn)設(shè)置的結(jié)果嘹黔。如果想改變可以在build.gradle中單獨(dú)設(shè)置源碼目錄账嚎,AndroidManifest.xml文件路徑等。
2.編譯流程
詳細(xì)的描述Gradle的編譯可以點(diǎn)擊原文鏈接儡蔓,查看《理解使用Gradle編譯打包Androidapk》《使用Ant打包Android應(yīng)用——apk生成過程》(雖然也沒有具體的一個(gè)個(gè)Task的運(yùn)行流程郭蕉,但是能對(duì)APK文件的構(gòu)成和Gradle編譯有一個(gè)初步理解。)
這里從工程配置的角度簡(jiǎn)單將用到的這些配置文件串聯(lián)起來喂江。
在Android Studio中打開一個(gè)工程的時(shí)候召锈,可以選擇最外層目錄的build.gradle,里面設(shè)置好了要用到的Android Gradle插件的版本和外部庫文件的下載地址(一般是jcenter)
(1)settings.gradle:搜索并讀取settings.gradle配置获询,將所有模塊都加載到當(dāng)前Studio的工程目錄中涨岁。
(2)模塊(Module)中的build.gradle:配置了使用的android gradle插件,指定生成aar還是apk吉嚣,
作為庫:apply plugin: ‘com.android.library’
生成apk:apply plugin: ‘com.android.application’
(3)local.properties:根據(jù)設(shè)置的使用的Build Tools和SDK版本卵惦,從local.properties指定的SDK目錄中查找是否有匹配的版本,沒有的話會(huì)報(bào)錯(cuò)瓦戚,提示安裝SDK等沮尿。
當(dāng)然,實(shí)際的加載順序是預(yù)先加載好了使用的gradle版本,SDK的目錄畜疾,這里方便理解流程而這樣說赴邻。
一般生成APK文件時(shí),首先是在加載好相關(guān)配置啡捶,生成主模塊與子模塊之間的Task依賴圖姥敛,然后依次執(zhí)行各個(gè)Task。一般生成調(diào)試APK文件都是assembleDebug的Task瞎暑,先是調(diào)用依賴庫Task依次執(zhí)行彤敛,其實(shí)都跑不了《使用Ant打包Android應(yīng)用——apk生成過程》提到的資源處理,class文件生成等了赌。
三墨榄、導(dǎo)入開源工程FlexboxLayout
FlexboxLayout時(shí)Google開源的一個(gè)簡(jiǎn)單靈活的布局庫,類似于CSSFlexibleBoxLayout勿她,這里不具體介紹FlexboxLayout的使用袄秩,只是從講述如何導(dǎo)入并使用開源工程。
0.測(cè)試環(huán)境
操作系統(tǒng):Mac OS X逢并、Ubuntu 14.04之剧、Windows 7
Android Studio 2.2 Build #AI-145.3276617, built on September 15, 2016
JRE: 1.8.0_76-release-b03 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
1.下載代碼
Gitclonehttps://github.com/google/flexbox-layout.git
也可以直接下載ZIP包或者從android Studio中直接Check Out出來
2.打開工程前配置
如果你的網(wǎng)絡(luò)能夠非常快的下載到不同版本的Gradle和SDK等砍聊,請(qǐng)簡(jiǎn)單看下這里的配置即可背稼,不用實(shí)際操作。
對(duì)于網(wǎng)絡(luò)不好的同學(xué)玻蝌,我們可以先確定下自己的Gradle版本和已有的SDK信息雇庙,簡(jiǎn)單的方式是在Android Studio的歡迎頁面,點(diǎn)擊最下方的Configure->SDK Manager(或者先打開一個(gè)以前運(yùn)行良好的工程灶伊,在Studio的設(shè)置頁面查看),可以看到如圖所示頁面:
(1)SDK Platforms:顯示了從Android2.2到Android7.1.1寒跳,關(guān)心你installed的API Level就行(有些顯示Update available)聘萨,數(shù)字從8到25
(2)SDK Tool:切換到SDK Tools的Tab頁,查看Build-Tool和Android Support Library的Version信息童太,顯示不詳細(xì)的話米辐,勾選又下角的“Show Package Detail”
(3)Gradle插件:查看Android Gradle插件版本信息,在新建的測(cè)試工程中的build.gradle里书释,查看“ classpath ‘com.android.tools.build:gradle:xxx”翘贮,或者從Studio的設(shè)置搜索Gradle查看。記下自己的版本信息爆惧,我這里是2.14.1狸页。
(4)Support Library:需要此庫的在已打開的測(cè)試工程設(shè)置中查看,平時(shí)配置模塊工程也會(huì)用到,如圖所示:
3.打開FlexboxLayout工程
現(xiàn)在可以進(jìn)入下載下來的FlexboxLayout目錄中
(1)以文本文件方式查看最外層build.gradle文件
Gradle插件版本: classpath ‘com.android.tools.build:gradle:2.2.3’芍耘,改成和自己的一致版本
compileSdkVersion的數(shù)字是否在自己的已安裝的SDK Platforms里
buildToolsVersion和supportLibVersion也和compileSdkVersion一樣
(記住這樣做有時(shí)會(huì)有風(fēng)險(xiǎn)址遇,但是一般查看開源工程源碼和別人的Demo還行,真出現(xiàn)編譯運(yùn)行異常的話斋竞,那只能老老實(shí)實(shí)保留人家的版本配置)
有些工程不在此文件中倔约,而是在具體模塊的build.gradle文件中設(shè)置,名稱變?yōu)閏om.android.support:support-v4坝初,com.android.support:appcompat-v7等版本浸剩,他這里統(tǒng)一使用了supportLibVersion
(2)以文本文件方式查看模塊中的build.gradle文件,看是否還有不一致的
(3)打開工程:從已經(jīng)打開的工程中 File->Open選擇build.gradle 鳄袍,或者在歡迎頁面Open an existing Android Studio project
得等待一些時(shí)間來下載依賴的庫绢要。如果你不想等,那看錯(cuò)誤分析畦木,不下載這么多庫的也可以袖扛。
四、打開別人工程可能遇到的問題
如果沒有按照上述方法做類似修改十籍,可能會(huì)有些錯(cuò)誤
1.引入舊工程蛆封,導(dǎo)致Gradle版本和Android Gradle插件版本不一致
如error:Gradle version 2.2 is required. Current version is 2.14.1
當(dāng)classpath ‘com.android.tools.build:gradle:1.3.0’版本低時(shí),會(huì)有如是提示勾栗,如果不強(qiáng)制要求可改成自己Studio已有的版本
一般Android Studio是2.2惨篱,則插件版本也是2.2.0;Android Studio是2.3,插件版本也是2.3.0
gradle和插件對(duì)應(yīng)關(guān)系查看https://developer.android.com/studio/releases/gradle-plugin.html
2.Build Tools和依賴庫不一致围俘,又無法下載到
如Error:Failed to resolve: com.android.support:support-compat:25.3.0
其實(shí)就是修改build.gradle中的compile “com.android.support:appcompat-v7:版本信息
3.發(fā)現(xiàn)一直在不停的Gradle Sync砸讳, Gradle Build或者刷新等
其實(shí)很有可能上上面提到的Gradle版本,SDK等始終下載不下來界牡,可以強(qiáng)制停止簿寂,修改后重新打開。
4.做到幾乎不下載
因?yàn)橹皇强创a和測(cè)試功能宿亡,因此得想辦法減少大量下載的配置:
(1)其實(shí)也可以通過注釋外層工程build.gradle里的如下代碼常遂,使打開的更快,但是會(huì)有其他問題挽荠,這里還不建議新手直接如此修改克胳。
//classpath ‘com.github.dcendents:android-maven-gradle-plugin:1.5’
//classpath ‘com.jfrog.bintray.gradle:gradle-bintray-plugin:1.6’
(2)出現(xiàn)Gradle Sync錯(cuò)誤
Error:Plugin with id ‘com.github.dcendents.android-maven’ not found.
搜索com.github.dcendents.android-maven哪里用到了,發(fā)現(xiàn)時(shí)在flexbox模塊中的maven.gradle使用了此插件
這些gradle文件的使用圈匆,都是在build.gradle中apply方式加入漠另,因此在該模塊的build.gradle中注釋如下
//apply from: ‘maven.gradle’
//apply from: ‘bintray.gradle’
(3)再嘗試編譯出現(xiàn)
Error:(29, 0) Could not get unknown property ‘mavenVersion’ for ProductFlavor_Decorated{name=main, dimension=null, minSdkVersion=DefaultApiVersion{mApiLevel=9, mCodename=’null’},
搜索mavenVersion,發(fā)現(xiàn)定義了一些常量在constants.gradle中跃赚,因此在build.gradle中apply此文件即可笆搓,修改后如下
apply plugin: ‘com.android.library’
apply from: ‘constants.gradle’
五、解決思路總結(jié)
打開、導(dǎo)入工程的常見問題如上述一般都能解決砚作,但是碰到一個(gè)具體問題時(shí)窘奏,該如何解決呢,在《一個(gè)三年Android開發(fā)的總結(jié)》里說過一些常用的網(wǎng)站葫录。另外一定要仔細(xì)看AndroidStudio報(bào)的錯(cuò)誤信息着裹,不要只看在MessageGradleBuild里顯示的最后錯(cuò)誤信息,還可以看看AndroidStudio界面右下角的GradleConsole信息米同,里面給出了Tasks運(yùn)行的信息骇扇,比如當(dāng)前運(yùn)行到哪個(gè)Task出現(xiàn)錯(cuò)誤,錯(cuò)誤的位置等面粮。如果可以看懂少孝,直接根據(jù)位置修改,看不懂熬苍,則可根據(jù)錯(cuò)誤的關(guān)鍵詞在工程中或者網(wǎng)上搜索稍走,一般都能找到解決方法。