《第一行代碼 Android》作為Android入門書籍艾蓝,由郭霖大神編寫的九妈,這本書相對(duì)比其他入門書籍比較基礎(chǔ)并且深度也不錯(cuò)泰演。本文主要是針對(duì)第一章概況讀書簡(jiǎn)記,便于日后溫故搁凸,總結(jié)媚值。
Android 系統(tǒng)起源
首先,作為一名Android開發(fā)人員來(lái)說(shuō)护糖,對(duì)于Android系統(tǒng)怎么而來(lái)的褥芒,想必大家或多或少聽說(shuō)一些。Android作為現(xiàn)如今擁有用戶群體的手機(jī)系統(tǒng)嫡良,起初是由Andy Rubin(“Android之父”)同其他三位創(chuàng)始人成立了“Android公司“锰扶,為了數(shù)碼相機(jī)開發(fā)出來(lái)的一套基于Linux系統(tǒng),這便是Android的雛形寝受。
隨后坷牛,Android轉(zhuǎn)而開發(fā)手機(jī)操作系統(tǒng),并于2005年被谷歌收購(gòu)羡蛾,Rubin和其他創(chuàng)始人留在谷歌漓帅,開始了真正意義上的智能手機(jī)操作系統(tǒng)開發(fā)锨亏。在這個(gè)時(shí)候痴怨,Android系統(tǒng)的方向已經(jīng)確定,比如基于Linux器予、開源浪藻、免費(fèi)供手機(jī)廠商使用等等,谷歌則可將其服務(wù)深度集成到系統(tǒng)中獲得利潤(rùn)乾翔。
2008年爱葵,谷歌發(fā)布了第一版Android系統(tǒng)”Android 1.0“施戴,接著在2009年發(fā)布了1.1版本,隨后在1.5版本開始出現(xiàn)以甜點(diǎn)命名版本萌丈,具體版本如下:
Android Beta璧瞬,發(fā)布于2007年11月5日磺樱,同時(shí)的軟件開發(fā)套件(SDK),發(fā)布于2007年11月12日。 11月5日被認(rèn)為是Android的"生日"垫挨。
Android版本名稱Code name | Android版本 | 版本發(fā)布時(shí)間 | 對(duì)應(yīng)API |
---|---|---|---|
(no code name) | 1.0 | 2008年9月23日 | API level 1 |
(no code name) | 1.1 | 2009年2月2日 | API level 2 |
Cupcake | 1.5 | 2009年4月17日 | API level 3,NDK 1 |
Donut | 1.6 | 2009年9月15日 | API level 4,NDK 2 |
Eclair | 2.0.1 | 2009年12月3日 | API level 6 |
Eclair | 2.1 | 2010年1月12日 | API level 7,NDK3 |
Froyo | 2.2.x | 2010年1月12日 | API level 8,NDK 4 |
Gingerbread | 2.3 – 2.3.2 | 2011年1月1日 | API level 9,NDK5 |
Gingerbread | 2.3.3 – 2.3.7 | 2011年9月2日 | API level 10 |
Honeycomb | 3.0 | 2011年2月24日 | API level 11 |
Honeycomb | 3.1 | 2011年5月10日 | API level 12,NDK 6 |
Honeycomb | 3.2.x | 2011年7月15日 | API level 13 |
Ice Cream | Sandwich 4.0.1 – 4.0.2 | 2011年10月19日 | API level 14,NDK 7 |
Ice Cream | Sandwich 4.0.3 – 4.0.4 | 2012年2月6日 | API level 15,NDK 8 |
Jelly Bean | 4.1 | 2012年6月28日 | API level 16 |
Jelly Bean | 4.1.1 | 2012年6月28日 | API level 16 |
Jelly Bean | 4.2-4.2.2 | 2012年11月 | API level 17 |
Jelly Bean | 4.3 | 2013年7月 | API level 18 |
KitKat | 4.4 | 2013年7月24日 | API level 19 |
Kitkat Watch | 4.4W | 2014年6月 | API level 20 |
Lollipop(Android L) | 5.0/5.1 | 2014年6月25日 | API level 21/API level 22 |
Marshmallow(Android M) | 6.0 | 2015年5月28日 | API level 23 |
Nougat(Android N) | 7.0 | 2016年5月18日 | API level 24 |
Nougat(Android N) | 7.1 | 2016年12月 | API level 25 |
Oreo(Android O) | 8.0 | 2017年8月22日 | API level 26 |
Oreo(Android O) | 8.1 | 2017年12月5日 | API level 27 |
Pie (Android P)不是鳳梨酥(PineappleCake) | 9.0 | 2018年8月7日 | API level 28 |
Android的版本,有個(gè)API Level敞临,對(duì)應(yīng)著某個(gè)Android發(fā)布版本的名稱简珠。
Android系統(tǒng)架構(gòu)
上面我們大概了解了Android的起源以及對(duì)應(yīng)的版本,并且也大概知道Android是基于Linux系統(tǒng)開發(fā)出來(lái)的移動(dòng)終端系統(tǒng)惭墓,那接下來(lái)我們來(lái)了解下Android系統(tǒng)的內(nèi)部架構(gòu)坛梁,Android大致可以分為四層架構(gòu):Linux內(nèi)核層、系統(tǒng)運(yùn)行庫(kù)層腊凶、應(yīng)用框架層划咐、應(yīng)用層。
Linux內(nèi)核層:
Android系統(tǒng)基于Linux內(nèi)核钧萍,這一層為Android設(shè)備的各種硬件提供了底層的去驅(qū)動(dòng)尖殃,如顯卡驅(qū)動(dòng)、音頻驅(qū)動(dòng)划煮、相機(jī)驅(qū)動(dòng)送丰、藍(lán)牙驅(qū)動(dòng)、WIFI驅(qū)動(dòng)弛秋、電源管理等器躏。系統(tǒng)運(yùn)行庫(kù)層:
這層通過(guò)一些C/C++庫(kù)為Android系統(tǒng)提供了主要的特性支持,例如SQLite庫(kù)提供了數(shù)據(jù)庫(kù)的支持蟹略,OpenGL|ES庫(kù)提供了3D繪圖的支持登失,Webkit庫(kù)提供了瀏覽器內(nèi)核的支持等等。
同樣在這一層挖炬,還有谷歌為我們提供的Android運(yùn)行時(shí)庫(kù)揽浙,它主要提供了一些核心庫(kù),能夠允許開發(fā)者使用Java語(yǔ)言來(lái)編寫Android應(yīng)用意敛。另外馅巷,Android運(yùn)行時(shí)庫(kù)中還包含了Dalvik虛擬機(jī)(5.0系統(tǒng)之后改為ART運(yùn)行環(huán)境,這兩種環(huán)境在本質(zhì)上有很大的區(qū)別草姻,導(dǎo)致Android在運(yùn)行性能方面更加優(yōu)越钓猬,具體區(qū)別在后期會(huì)獨(dú)篇說(shuō)明,這里不過(guò)多闡述)撩独,它使得每個(gè)Android應(yīng)用都能運(yùn)行在獨(dú)立的進(jìn)程中敞曹,并且擁有自己的虛擬機(jī)實(shí)例账月。相對(duì)比于Java虛擬機(jī),Android虛擬機(jī)是專門為移動(dòng)設(shè)備定制的澳迫,它針對(duì)手機(jī)內(nèi)存局齿、CPU性能有限等情況做了優(yōu)化處理。應(yīng)用框架層
這層主要提供了構(gòu)建應(yīng)用程序時(shí)可能用到的各種API橄登,Android自帶的一些核心應(yīng)用就是使用這些API完成的项炼。應(yīng)用層
所有安裝在手機(jī)上的應(yīng)用程序都屬于這一層的,比如系統(tǒng)內(nèi)置的聯(lián)系人示绊、短信等程序锭部,或者從應(yīng)用商城上下載下來(lái)的應(yīng)用以及自己開發(fā)的程序都屬于這層。
Android系統(tǒng)架構(gòu)可以參考如下圖:
Android開發(fā)環(huán)境搭建
針對(duì)于開發(fā)環(huán)境搭建面褐,都是每個(gè)開發(fā)者老生常談的必要走的一步拌禾,這里就不多累贅,只是貼出各個(gè)環(huán)境下載鏈接展哭,便于日后查詢配置使用湃窍。
- JDK
- Android Studio(可能部分小伙伴需要墻,也可以訪問(wèn)百度云盤資源)
-
Android SDK一般這塊不需要單獨(dú)下載匪傍,谷歌已經(jīng)將其集成到Android Studio中了您市,如果小伙伴有需要下載,也可以在 Android Studio上瀏覽到
Command line tools only
選擇即可役衡。
關(guān)于小伙伴在使用Android Studio過(guò)程中可能會(huì)遇到一些構(gòu)建常見(jiàn)問(wèn)題茵休,可以詳情了解下我的另外一篇文字《Android Studio 構(gòu)建常見(jiàn)出錯(cuò)問(wèn)題匯總》,以及《Android Studioc常用快捷鍵匯總》,不定時(shí)更新哦手蝎!
Android Studio目錄結(jié)構(gòu)分析
Android在早期開發(fā)還是使用Eclipse比較多榕莺,但自從2013年官方推出Android Studio(以下簡(jiǎn)稱AS)之后,Android開發(fā)更多的傾向于使用AS開發(fā)棵介,而且在推出AS之后钉鸯,官方也相應(yīng)停止了Eclipse開發(fā)Android對(duì)應(yīng)的ADT更新,所以現(xiàn)在大部分都是采用AS開發(fā)邮辽。在這里有必要扯一下AS目錄結(jié)構(gòu)唠雕,畢竟兩個(gè)IDE的編譯機(jī)制是有所不同的,在Eclipse采用的Ant方式構(gòu)建編譯項(xiàng)目吨述,而在AS中采用的是Gradle岩睁。
Eclipse在這我就不過(guò)多闡述了,我們要跟緊時(shí)代腳步锐极,所以這里主要講下AS中項(xiàng)目對(duì)應(yīng)目錄結(jié)構(gòu)的功能與作用笙僚,新建一個(gè)項(xiàng)目,可得到如下所示:
.gradle和.idea
這兩個(gè)目錄下放置的都是AS自動(dòng)生成的一些文件灵再,所以這塊我們不用關(guān)心肋层,在拷貝項(xiàng)目備份或者版本管理時(shí)候,可以忽略這兩個(gè)目錄翎迁。app
項(xiàng)目中的代碼栋猖、資源等內(nèi)容幾乎都在這個(gè)目錄下,日常編寫代碼大部分也都在這個(gè)目錄下進(jìn)行的汪榔,所以這個(gè)目錄的文件結(jié)構(gòu)后面會(huì)單獨(dú)解析具體底層目錄蒲拉。build
在AS高版本中這個(gè)目錄已經(jīng)不存在,低版本中存在這個(gè)目錄痴腌,也是AS編譯時(shí)自動(dòng)生成的文件雌团,不用關(guān)心,在拷貝項(xiàng)目備份或者文件管理時(shí)候士聪,同樣是可以忽略的目錄锦援。gradle
在這個(gè)目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式無(wú)需提前將gradle下載好剥悟,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle灵寺。.gitignore
這個(gè)文件用來(lái)將指定的目錄或文件排除在版本控制(Git)之外的。build.gradle
這個(gè)文件是全局的gradle的構(gòu)建腳本区岗,通常這個(gè)文件中的內(nèi)容是不需要修改的略板。后面會(huì)具有分析gradle構(gòu)建腳本的內(nèi)容。gradle.properties
這個(gè)文件是全局的gradle配置文件慈缔,在這里配置的屬性會(huì)影響到項(xiàng)目中所有的gradle編譯腳本叮称。gradlew 和 gradlew.bat
這個(gè)兩個(gè)文件是用來(lái)在命令行界面(Terminal)中執(zhí)行g(shù)radle命令的,其中g(shù)radlew是在Linux或Mac系統(tǒng)中使用的藐鹤,gradlew.bat是在windows系統(tǒng)中使用的颅拦。HelloWorld.iml
iml文件是所有IntelliJ IDEA項(xiàng)目都會(huì)自動(dòng)生成的一個(gè)文件(AS是基于IntelliJ IDEA開發(fā)的),用于標(biāo)識(shí)這是由IntelliJ IDEA項(xiàng)目教藻,不需要修改此文件距帅,可以在備份或者版本控制時(shí)候忽略。local.properties
文件是用于指定本機(jī)中的Android SDK路徑括堤,以及NDK路徑碌秸,通常不需要修改,除非本地環(huán)境發(fā)生改變時(shí)候悄窃。setting.gradle
這個(gè)文件同于指定項(xiàng)目中所有引入的模塊讥电,由于此處只有app一個(gè)模塊,因此該文件這里只引入的app這一個(gè)模塊轧抗。通常情況都是自動(dòng)完成的恩敌,只有手動(dòng)導(dǎo)入模塊時(shí)候,可能需要手動(dòng)去修改横媚。
整個(gè)項(xiàng)目的外層結(jié)構(gòu)基本到這有一個(gè)大致的了解纠炮,接下來(lái)說(shuō)下app目錄月趟,也就是我們代碼經(jīng)常需要修改調(diào)整的目錄下的結(jié)構(gòu),如下所示:
build
這個(gè)目錄和外層的build目錄相似恢口,主要也是包含了編譯自動(dòng)生成的文件孝宗,同樣也無(wú)需關(guān)心,可以備份或者版本控制可以忽略耕肩。libs
項(xiàng)目中使用第三方j(luò)ar包因妇,需要把對(duì)應(yīng)的jar包放在這個(gè)目錄下,放在這個(gè)目錄下的jar包會(huì)被自動(dòng)添加到構(gòu)建路徑里去猿诸。androidTest
此處用來(lái)編寫AndroidTest測(cè)試用例的婚被,可以對(duì)項(xiàng)目進(jìn)行一些自動(dòng)化測(cè)試。java
此處用于編寫應(yīng)用的主要邏輯Java代碼梳虽。res
這個(gè)目錄主要存放應(yīng)用的UI布局字符串等資源址芯,這個(gè)目錄相對(duì)比較復(fù)雜,在子目錄layout下主要存放應(yīng)用的布局文件怖辆,而圖片根據(jù)不同的分辨率存放在以drawble-xxx目錄下是复,當(dāng)然有些類似selector選擇器或者Shape自定義形狀等等這些還是放在drawble中,子目錄values下主要存放字符串竖螃、樣式以及主題等淑廊。
在這個(gè)目錄所有子目錄下有一個(gè)子目錄mipmap-xxx需要特別說(shuō)明以下,mipmap是在Android Jelly Beans 4.3中提出來(lái)的特咆,主要是為了讓程序能夠更好的兼容各種設(shè)備季惩,在處理Launcher Icon圖片渲染方面更加強(qiáng)大。AndroidManifest.xml
這個(gè)文件是整個(gè)應(yīng)用的配置文件腻格,在程序中定義的所有四大組件都必須在這個(gè)文件里注冊(cè)画拾,在這個(gè)文件配置需要的相應(yīng)權(quán)限配置聲明。test
此處用來(lái)編寫Unit Test測(cè)試用例的菜职,是對(duì)項(xiàng)目進(jìn)行自動(dòng)化測(cè)試的另外一種方式青抛。.gitignore
這個(gè)文件用于app模塊內(nèi)的指定的目錄或文件的排除在版本控制(Git)之外,作用與外層的.gitignore
,但一般都在外層的.gitignore
全局設(shè)置了酬核。app.iml
IntelliJ IDEA項(xiàng)目自動(dòng)生成的文件蜜另,不需要去修改與關(guān)心,備份或版本控制時(shí)候可以忽略嫡意。build.gradle
app模塊的gradle構(gòu)建腳本举瑰,這個(gè)文件會(huì)指定很多項(xiàng)目構(gòu)建相關(guān)的配置。proguard-rules.pro
這個(gè)文件用于指定項(xiàng)目代碼的混淆規(guī)則蔬螟,當(dāng)我們的代碼編寫打包成apk時(shí)候此迅,如果不希望別人破解,通常會(huì)將代碼進(jìn)行混淆,從而讓破解者難以閱讀耸序,考慮安全點(diǎn)忍些,一般還會(huì)對(duì)apk進(jìn)行加固。
因?yàn)锳ndroid Studio是采用Gradle來(lái)構(gòu)建項(xiàng)目的佑吝,所以這里對(duì)Gradle的配置文件進(jìn)一步講解坐昙。Gradle是一個(gè)非常先進(jìn)的項(xiàng)目構(gòu)建工具绳匀,它使用了一種基于Groovy的領(lǐng)域特定語(yǔ)言(DSL)來(lái)聲明項(xiàng)目設(shè)置芋忿,摒棄了傳統(tǒng)基于XML(如Ant和Maven)的各種煩瑣配置。
這里先說(shuō)說(shuō)項(xiàng)目外層中build.gradle文件的配置疾棵,如下:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
這些代碼都是自動(dòng)生成的戈钢,大部分情況下不需要我們?nèi)バ薷模驳么蟾胖榔湟馑肌?/p>
首先兩處repositories
的閉包中聲明了google()是尔、jcenter()配置殉了,它們代表不同的代碼托管倉(cāng)庫(kù),很多的Android開源項(xiàng)目都會(huì)或多或少引用了谷歌提供開源項(xiàng)目拟枚,所以需要聲明google()薪铜,而很多的Android開源項(xiàng)目都會(huì)選擇將代碼托管到j(luò)center上,聲明了jcenter之后恩溅,我們就可以很方便的使用任何jcenter上的開源項(xiàng)目了隔箍。
接下來(lái),dependencies閉包中使用了classpath聲明了一個(gè)Gradle插件脚乡。為什么要聲明這個(gè)插件呢蜒滩?原來(lái)Gradle并不只是專門為構(gòu)建Android項(xiàng)目而開發(fā)的,java奶稠、C++等很多項(xiàng)目都可以使用Gradle來(lái)構(gòu)建俯艰。因此想要使用它來(lái)構(gòu)建Android項(xiàng)目,則需要聲明com.android.tools.build:gradle:3.0.1'這個(gè)插件锌订,其中竹握,最后冒號(hào)后面部分是插件的版本號(hào),例如我現(xiàn)在這個(gè)項(xiàng)目中使用的插件版本是3.0.1.
分析完外層的build.gradle文件后辆飘,還需要分析模塊里面的build.gradle文件啦辐,如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.anand.activitylifecycletest"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:0.5'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2'
}
這個(gè)文件相對(duì)復(fù)雜一些,首先第一行應(yīng)用了一個(gè)插件劈猪,一般有兩種值可選:com.android.application
表示這是一個(gè)應(yīng)用程序模塊昧甘,com.android.library
表示這是一個(gè)庫(kù)模塊。應(yīng)用程序模塊與庫(kù)模塊最大的區(qū)別在于一個(gè)是可以直接運(yùn)行的战得,一個(gè)只能作為代碼庫(kù)依附于別的應(yīng)用程序模塊來(lái)運(yùn)行充边。
緊接著是android
這個(gè)閉包,可以配置項(xiàng)目構(gòu)建的各種屬性。其中浇冰,compileSdkVersion
用于指定項(xiàng)目的編譯版本贬媒,這里指定26表示使用Android 8.0系統(tǒng)的SDK編譯,buildToolsVersion
用于指定項(xiàng)目構(gòu)建工具的版本肘习,這里使用了26.0.2版本际乘。
接著是嵌套下的defaultConfig
閉包,defaultConfig
閉包中可以對(duì)項(xiàng)目進(jìn)行更多的配置漂佩。其中脖含,applicationId
用于指定項(xiàng)目的包名,一般修改應(yīng)用包名投蝉,可對(duì)這個(gè)配置進(jìn)行修改养葵。minSdkVersion
用于指定項(xiàng)目最低兼容的Android系統(tǒng)版本,這里指定成15表示最低兼容到Android 4.0系統(tǒng)瘩缆。targetSdkVersion
指定的值表示在該目標(biāo)版本上已經(jīng)做過(guò)了充分測(cè)試关拒,系統(tǒng)將會(huì)為其應(yīng)用程序啟用一些最新的功能和特性。舉例說(shuō)Android 6.0系統(tǒng)中引入了運(yùn)行時(shí)權(quán)限這個(gè)功能庸娱,如果我們將targetSdkVersion
指定成23或者更高着绊,那么系統(tǒng)就會(huì)認(rèn)為你的程序已經(jīng)做好充分測(cè)試,將為你啟用運(yùn)行時(shí)權(quán)限熟尉,而如果將targetSdkVersion
指定成22归露,那么說(shuō)明程序最高只在Android 5.1系統(tǒng)上做過(guò)充分的測(cè)試,Android 6.0系統(tǒng)中引入的新功能自然就不會(huì)啟用臣樱。剩下的versionCode
用于指定項(xiàng)目的版本號(hào)靶擦,versionName
用于指定項(xiàng)目版本名,這個(gè)兩個(gè)在安裝應(yīng)用文件以及版本升級(jí)方面比較重要雇毫。testInstrumentationRunner
為谷歌推薦的
AndroidJUnitRunner
單元測(cè)試(這塊是Android Studio2.2以后推出的玄捕,這塊我也是第一次接觸,后期有學(xué)習(xí)再深入探索)
接著分析下buildTypes
閉包棚放。buildTypes
閉包用于指定生成安裝文件的相關(guān)配置枚粘。通常情況下會(huì)有兩個(gè)子閉包,一個(gè)debug
飘蚯,一個(gè)release
馍迄。debug
閉包用于指定生成測(cè)試版安裝文件的配置,release
閉包用于指定生成正式版安裝文件的配置局骤。另外攀圈,debug
閉包是可以忽略不寫的,因此默認(rèn)情況下我們看到代碼中只有一個(gè)release
閉包峦甩。接下來(lái)赘来,我們來(lái)看下debug
现喳、release
閉包中具體內(nèi)容吧,minifyEnable
用于指定是否對(duì)項(xiàng)目代碼進(jìn)行混淆操作,true
表示混淆犬辰,false
表示不混淆嗦篱。proguardFiles
用于指定混淆時(shí)使用的規(guī)則文件,這里指定了兩個(gè)文件幌缝,第一個(gè)proguard-android.txt
是在Android SDK下\tools\proguard
目錄下灸促,這里是所有項(xiàng)目的通用的混淆規(guī)則;第二個(gè)proguard-rules.pro
是在當(dāng)前項(xiàng)目的根目錄下的涵卵,里面可以編寫當(dāng)前項(xiàng)目特有的混淆規(guī)則浴栽。需要注意的是,通過(guò)AS直接運(yùn)行項(xiàng)目生成都是測(cè)試版本安裝文件缘厢,除非手動(dòng)切換BuildVariants
設(shè)置吃度。
分析完android
閉包甩挫,緊接著分析最后一個(gè)dependencies
閉包贴硫。這個(gè)閉包主要作用在于指定當(dāng)前項(xiàng)目所有的依賴關(guān)系。通常AS項(xiàng)目一共有3種依賴關(guān)系:本地依賴伊者、庫(kù)依賴和遠(yuǎn)程依賴英遭。本地依賴可以對(duì)本地的Jar包、aar包或者目錄添加依賴關(guān)系亦渗,庫(kù)依賴可以對(duì)項(xiàng)目中的庫(kù)模塊添加依賴關(guān)系挖诸,遠(yuǎn)程依賴則可以對(duì)jcenter庫(kù)上的開源項(xiàng)目添加依賴關(guān)系。
觀察dependencies
閉包中的配置法精,第一行implementation fileTree
就是一個(gè)本地依賴聲明多律,表示將 libs
目錄下所有.jar
后綴的文件都添加到項(xiàng)目的構(gòu)建路徑當(dāng)中。而第二行的implementation
則是遠(yuǎn)程依賴聲明搂蜓,com.android.support:appcompat-v7:26.0.0-beta1
就是一個(gè)標(biāo)準(zhǔn)的遠(yuǎn)程依賴庫(kù)格式狼荞,其中com.android.support
是域名部分,用于和其他公司的庫(kù)做區(qū)分帮碰;appcompat-v7
是組名稱相味,用于和同一個(gè)公司中不同的庫(kù)做區(qū)分;26.0.0-beta1
是版本號(hào)殉挽,用于和同一個(gè)庫(kù)不同的版本做區(qū)分丰涉。加上這句聲明后,Gradle在構(gòu)建項(xiàng)目時(shí)會(huì)首先檢查一下本地是否已經(jīng)存在這個(gè)庫(kù)的緩存斯碌,如果沒(méi)有的話則會(huì)自動(dòng)去互聯(lián)網(wǎng)下載一死,然后再添加到項(xiàng)目的構(gòu)建路徑當(dāng)中。至于庫(kù)依賴這里沒(méi)有使用到傻唾,它的基本格式是implementation project
后面加上要依賴的庫(kù)名稱投慈,例如有一個(gè)庫(kù)模塊的名稱叫helper,那么添加這個(gè)庫(kù)依賴的聲明只需要加入implementation project(':helper')
即可。后面一些是聲明主要是為了聲明測(cè)試用例庫(kù)的逛裤,后期會(huì)單獨(dú)詳細(xì)說(shuō)明下瘩绒,具體參考Android 項(xiàng)目中的幾種單元測(cè)試用例。
Android 的日志工具使用
Android中使用的日志工具是Log(android.util.Log)
,這個(gè)類提供了5個(gè)方法來(lái)打印日志带族。
- Log.v()锁荔。用于打印那些最為瑣碎的、意義最小的日志信息蝙砌。對(duì)應(yīng)級(jí)別verbose阳堕,是Android日志里面級(jí)別最低的一種。
- Log.d()择克。用于打印一些調(diào)式信息恬总,這些信息對(duì)你調(diào)試程序和分析問(wèn)題有幫助的。對(duì)應(yīng)級(jí)別debug肚邢,比verbose高一級(jí)壹堰。
- Log.i()。用于打印一些比較重要的數(shù)據(jù)骡湖。這些數(shù)據(jù)應(yīng)該是開發(fā)者非常想要看到的贱纠,可以幫助開發(fā)者分析用戶行為數(shù)據(jù)。對(duì)應(yīng)級(jí)別info,比debug高一級(jí)响蕴。
- Log.w()谆焊。用于打印一些警告信息,提示程序在這個(gè)地方可能會(huì)有潛在的風(fēng)險(xiǎn)浦夷,最好去修復(fù)一下這些出現(xiàn)警告的地方辖试。對(duì)應(yīng)級(jí)別warn,比info高一級(jí)。
- Log.e()劈狐。用于打印程序中的錯(cuò)誤信息罐孝,比如程序進(jìn)入到了catch語(yǔ)句當(dāng)中。當(dāng)有錯(cuò)誤信息打印出來(lái)的時(shí)候懈息,一般都代表你的程序出現(xiàn)嚴(yán)重問(wèn)題了肾档,必須盡快修復(fù)。對(duì)應(yīng)級(jí)別error辫继,比warn高一級(jí)怒见。
關(guān)于為什么使用Log而不使用System.out疑問(wèn)?
System.out.print
對(duì)應(yīng)Java初學(xué)者開說(shuō)應(yīng)該很熟悉姑宽,在Eclipse中syso就可以快速打印出信息來(lái)遣耍,那么為什么Android不使用這個(gè)方法,而采用多級(jí)別的Log呢炮车,主要的原因是打印不可控舵变、打印時(shí)間無(wú)法確定酣溃、不能添加過(guò)濾器、日志沒(méi)級(jí)別區(qū)分纪隙。對(duì)于程序比較復(fù)雜的情況下赊豌,日志比較多的情況下,快速定位問(wèn)題無(wú)法很快定位到绵咱。
關(guān)于Log日志一些快捷鍵操作可以參考《Android Studioc常用快捷鍵匯總》中的Tab組合快捷鍵碘饼。
除了快捷鍵, AS還為L(zhǎng)og日志提供了locat方便我們過(guò)濾查詢?nèi)罩颈妫屛覀兛梢钥焖俣ㄎ坏綄?duì)應(yīng)的日志上艾恼。AS目前為開發(fā)者提供了3個(gè)過(guò)濾器,Show only selected application
表示只顯示當(dāng)前選中程序中的日志麸锉,Firebase
是谷歌提供的一個(gè)分析工具钠绍,No Filters
相當(dāng)于沒(méi)有過(guò)濾器,會(huì)把所有的日志都顯示出來(lái)花沉。當(dāng)然除了一首AS提供的三種過(guò)濾器柳爽,也可以自定義自己的過(guò)濾器,選擇Edit Filter Configuration
會(huì)彈出一個(gè)過(guò)濾器配置界面主穗,可以自行配置自定義過(guò)濾器泻拦,在Log Tag中對(duì)需要過(guò)濾的tag進(jìn)行配置。