Android 系統(tǒng)概要 ——《第一行代碼 Android》

《第一行代碼 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系統(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)目,可得到如下所示:

Project模式的項(xiàng)目結(jié)構(gòu)
  1. .gradle和.idea
    這兩個(gè)目錄下放置的都是AS自動(dòng)生成的一些文件灵再,所以這塊我們不用關(guān)心肋层,在拷貝項(xiàng)目備份或者版本管理時(shí)候,可以忽略這兩個(gè)目錄翎迁。

  2. app
    項(xiàng)目中的代碼栋猖、資源等內(nèi)容幾乎都在這個(gè)目錄下,日常編寫代碼大部分也都在這個(gè)目錄下進(jìn)行的汪榔,所以這個(gè)目錄的文件結(jié)構(gòu)后面會(huì)單獨(dú)解析具體底層目錄蒲拉。

  3. build
    在AS高版本中這個(gè)目錄已經(jīng)不存在,低版本中存在這個(gè)目錄痴腌,也是AS編譯時(shí)自動(dòng)生成的文件雌团,不用關(guān)心,在拷貝項(xiàng)目備份或者文件管理時(shí)候士聪,同樣是可以忽略的目錄锦援。

  4. gradle
    在這個(gè)目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式無(wú)需提前將gradle下載好剥悟,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle灵寺。

  5. .gitignore
    這個(gè)文件用來(lái)將指定的目錄或文件排除在版本控制(Git)之外的。

  6. build.gradle
    這個(gè)文件是全局的gradle的構(gòu)建腳本区岗,通常這個(gè)文件中的內(nèi)容是不需要修改的略板。后面會(huì)具有分析gradle構(gòu)建腳本的內(nèi)容。

  7. gradle.properties
    這個(gè)文件是全局的gradle配置文件慈缔,在這里配置的屬性會(huì)影響到項(xiàng)目中所有的gradle編譯腳本叮称。

  8. gradlew 和 gradlew.bat
    這個(gè)兩個(gè)文件是用來(lái)在命令行界面(Terminal)中執(zhí)行g(shù)radle命令的,其中g(shù)radlew是在Linux或Mac系統(tǒng)中使用的藐鹤,gradlew.bat是在windows系統(tǒng)中使用的颅拦。

  9. HelloWorld.iml
    iml文件是所有IntelliJ IDEA項(xiàng)目都會(huì)自動(dòng)生成的一個(gè)文件(AS是基于IntelliJ IDEA開發(fā)的),用于標(biāo)識(shí)這是由IntelliJ IDEA項(xiàng)目教藻,不需要修改此文件距帅,可以在備份或者版本控制時(shí)候忽略。

  10. local.properties
    文件是用于指定本機(jī)中的Android SDK路徑括堤,以及NDK路徑碌秸,通常不需要修改,除非本地環(huán)境發(fā)生改變時(shí)候悄窃。

  11. 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),如下所示:

app目錄下的結(jié)構(gòu)
  1. build
    這個(gè)目錄和外層的build目錄相似恢口,主要也是包含了編譯自動(dòng)生成的文件孝宗,同樣也無(wú)需關(guān)心,可以備份或者版本控制可以忽略耕肩。

  2. libs
    項(xiàng)目中使用第三方j(luò)ar包因妇,需要把對(duì)應(yīng)的jar包放在這個(gè)目錄下,放在這個(gè)目錄下的jar包會(huì)被自動(dòng)添加到構(gòu)建路徑里去猿诸。

  3. androidTest
    此處用來(lái)編寫AndroidTest測(cè)試用例的婚被,可以對(duì)項(xiàng)目進(jìn)行一些自動(dòng)化測(cè)試。

  4. java
    此處用于編寫應(yīng)用的主要邏輯Java代碼梳虽。

  5. 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)大。

  6. AndroidManifest.xml
    這個(gè)文件是整個(gè)應(yīng)用的配置文件腻格,在程序中定義的所有四大組件都必須在這個(gè)文件里注冊(cè)画拾,在這個(gè)文件配置需要的相應(yīng)權(quán)限配置聲明。

  7. test
    此處用來(lái)編寫Unit Test測(cè)試用例的菜职,是對(duì)項(xiàng)目進(jìn)行自動(dòng)化測(cè)試的另外一種方式青抛。

  8. .gitignore
    這個(gè)文件用于app模塊內(nèi)的指定的目錄或文件的排除在版本控制(Git)之外,作用與外層的.gitignore,但一般都在外層的.gitignore全局設(shè)置了酬核。

  9. app.iml
    IntelliJ IDEA項(xiàng)目自動(dòng)生成的文件蜜另,不需要去修改與關(guān)心,備份或版本控制時(shí)候可以忽略嫡意。

  10. build.gradle
    app模塊的gradle構(gòu)建腳本举瑰,這個(gè)文件會(huì)指定很多項(xiàng)目構(gòu)建相關(guān)的配置。

  11. 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)行配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忽媒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子腋粥,更是在濱河造成了極大的恐慌晦雨,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隘冲,死亡現(xiàn)場(chǎng)離奇詭異闹瞧,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)展辞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門奥邮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人罗珍,你說(shuō)我怎么就攤上這事洽腺。” “怎么了覆旱?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵蘸朋,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扣唱,道長(zhǎng)藕坯,這世上最難降的妖魔是什么团南? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮炼彪,結(jié)果婚禮上吐根,老公的妹妹穿的比我還像新娘。我一直安慰自己辐马,他們只是感情好佑惠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著齐疙,像睡著了一般膜楷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贞奋,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天赌厅,我揣著相機(jī)與錄音,去河邊找鬼轿塔。 笑死特愿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勾缭。 我是一名探鬼主播揍障,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俩由!你這毒婦竟也來(lái)了毒嫡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幻梯,失蹤者是張志新(化名)和其女友劉穎兜畸,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碘梢,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咬摇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了煞躬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肛鹏。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恩沛,靈堂內(nèi)的尸體忽然破棺而出在扰,到底是詐尸還是另有隱情,我是刑警寧澤复唤,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布健田,位于F島的核電站,受9級(jí)特大地震影響佛纫,放射性物質(zhì)發(fā)生泄漏妓局。R本人自食惡果不足惜总放,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望好爬。 院中可真熱鬧局雄,春花似錦、人聲如沸存炮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)穆桂。三九已至宫盔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間享完,已是汗流浹背灼芭。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留般又,地道東北人彼绷。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茴迁,于是被迫代替她去往敵國(guó)和親寄悯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容