Android:解析目錄結(jié)構(gòu)

原創(chuàng):有趣知識點(diǎn)摸索型文章
創(chuàng)作不易朽合,請珍惜鉴裹,之后會(huì)持續(xù)更新,不斷完善
個(gè)人比較喜歡做筆記和寫總結(jié)廷没,畢竟好記性不如爛筆頭哈哈糊饱,這些文章記錄了我的IOS成長歷程,希望能與大家一起進(jìn)步
溫馨提示:由于簡書不支持目錄跳轉(zhuǎn)颠黎,大家可通過command + F 輸入目錄標(biāo)題后迅速尋找到你所需要的內(nèi)容

目錄

  • 一另锋、運(yùn)行項(xiàng)目
  • 二、工程的目錄結(jié)構(gòu)
  • 三狭归、解析默認(rèn) Demo

一夭坪、運(yùn)行項(xiàng)目

打開 Android Studio 創(chuàng)建一個(gè)新的 Empty Activity 項(xiàng)目,命名為 BoostTestIOS过椎。

進(jìn)入開發(fā)界面后室梅,我們發(fā)現(xiàn)沒有可以運(yùn)行的模擬器。

于是在Tools工具欄中選擇 Device Manager打開設(shè)備管理器疚宇,并在其中點(diǎn)擊Create Device按鈕來打開創(chuàng)建新設(shè)備面板亡鼠。

選擇一個(gè)設(shè)備型號,按需選擇灰嫉,然后點(diǎn)擊 Next 進(jìn)行安裝拆宛。

在自己需要的版本后面點(diǎn)擊下載。

現(xiàn)在就可以在 Device Manager 上看到我們的模擬器了讼撒。

點(diǎn)擊運(yùn)行浑厚。就可以看到項(xiàng)目順利運(yùn)行起來了股耽。


二、工程的目錄結(jié)構(gòu)

Android 結(jié)構(gòu)模式

任何一個(gè)新建的項(xiàng)目都會(huì)默認(rèn)使用Android模式的項(xiàng)目結(jié)構(gòu)钳幅,但這并不是項(xiàng)目真實(shí)的目錄結(jié)構(gòu)物蝙,而是被Android Studio轉(zhuǎn)換過的。這種項(xiàng)目結(jié)構(gòu)簡潔明了敢艰,適合進(jìn)行快速開發(fā)诬乞。

項(xiàng)目結(jié)構(gòu)模式下的目錄分析

點(diǎn)擊上圖當(dāng)中的Android區(qū)域可以切換項(xiàng)目結(jié)構(gòu)模式。

  • .gradle 和 .idea:這兩個(gè)目錄下放置的都是 Android Studio 自動(dòng)生成的一些文件钠导,我們無需關(guān)心震嫉,也不要手動(dòng)編輯。
  • app:項(xiàng)目中的代碼牡属、資源等內(nèi)容都是放置在這個(gè)目錄下票堵,我們后面的開發(fā)工作也基本是在這個(gè)目錄下進(jìn)行。
  • build:這個(gè)目錄主要包含了一些在編譯時(shí)自動(dòng)生成的文件逮栅,無需過多關(guān)心悴势。
  • gradle:目錄下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前將gradle下載好措伐,而是會(huì)自動(dòng)根據(jù)本地的緩存情況決定是否需要聯(lián)網(wǎng)下載gradle特纤。Android Studio默認(rèn)就是啟動(dòng)gradle wrapper方式的,如果需要更改成離線模式侥加,可以點(diǎn)擊Android Studio導(dǎo)航欄—FileSettingsBuild捧存、ExecutionDeploymentGradle進(jìn)行配置更改官硝。
  • gitignore:這個(gè)文件是用來指定的目錄或文件排除在版本控制之外的矗蕊。
  • build.gradle:項(xiàng)目全局的 gradle 構(gòu)建腳本,通常這個(gè)文件內(nèi)容不需要修改氢架。
  • gradle.properties: 這個(gè)文件是全局的gradle配置文件傻咖,在這里配置的屬性將會(huì)影響到項(xiàng)目中所有的gradle編譯腳本。
  • gradlew 和 gradlew.bat:這兩個(gè)文件是用來在命令行界面中執(zhí)行gradle命令的岖研,其中gradlew是在Linux或Mac系統(tǒng)中使用的卿操,gradlew.bat是在Windows系統(tǒng)中使用的。
  • local.properties:這個(gè)文件用于指定本機(jī)中的Android SDK路徑孙援,通常是自動(dòng)生產(chǎn)的害淤,我們并不需要修改。除非你本機(jī)中的Android SDK位置發(fā)生了變化拓售,那么就將這個(gè)文件中的路徑修改成新的位置即可窥摄。
  • settings.gradle: 這個(gè)文件用于制定項(xiàng)目中所有引入的模塊。由于Hello World項(xiàng)目中只有一個(gè)app模塊础淤,因此該文件中也就只引入了app這一個(gè)模塊崭放。通常下哨苛,模塊的引入是自動(dòng)完成的,需要我們手動(dòng)修改這個(gè)文件的場景可能比較少币砂。
app 目錄下的內(nèi)容分析

app目錄外其他都是自動(dòng)生成建峭。app目錄下內(nèi)容是重點(diǎn)。

  • build: 和外層build目錄類似决摧,也包含了一些在編譯時(shí)自動(dòng)生成的文件亿蒸,不過它里面內(nèi)容更復(fù)雜,不需過多關(guān)心掌桩。
  • libs: 如項(xiàng)目使用了第三方jar包边锁,就需要存放在該目錄下。目錄下的jar包會(huì)被自動(dòng)添加到項(xiàng)目的構(gòu)建路徑里波岛。
  • androidTest: 用來編寫AndroidTest測試用例砚蓬,可以對項(xiàng)目進(jìn)行自動(dòng)化測試。
  • java: 存放所有Java代碼(包括Kotlin)盆色,展開該目錄,將看到系統(tǒng)幫我們自動(dòng)生成了一個(gè)MainActivity文件祟剔。
  • AndroidManifest.xml: 整個(gè)Android項(xiàng)目的配置文件隔躲,可在程序中定義所有四大組件都需要在這個(gè)文件里注冊,還可以在這個(gè)文件里給應(yīng)用程序添加權(quán)限聲明物延。會(huì)經(jīng)常用到宣旱。
  • text: 用來編寫UnitTest測試用例的,是對項(xiàng)目進(jìn)行自動(dòng)化測試的另一種方式叛薯。
  • gitignore:app模塊內(nèi)指定的目錄或文件排除在版本控制之外浑吟,作用和外層的.gitignore文件類似。
  • build.gradle: app模塊的gradle構(gòu)建腳本耗溜,會(huì)指定很多項(xiàng)目構(gòu)建相關(guān)的配置组力。
  • proguard-rules.pro: 用于指定項(xiàng)目代碼的混淆規(guī)則,當(dāng)代碼開發(fā)完成打包成安裝包文件抖拴,如不希望代碼被破解燎字,通常會(huì)將代碼進(jìn)行混淆,從而讓破解者難以閱讀阿宅。
  • res: 項(xiàng)目中所使用到的所有圖片候衍,布局,字符串等資源洒放。該文件下還有很多子目錄蛉鹿。 圖片 drawable、布局layout往湿、字符串values妖异。
res 目錄下的內(nèi)容分析

展開res目錄如下惋戏。之所以有這么多mipmap開頭的文件夾,其實(shí)主要是為了讓程序能夠更好地兼容各種設(shè)備随闺。在制作程序的時(shí)候最好能夠給同一張圖片提供幾個(gè)不同分辨率的版本日川,分別放在這些文件夾下,然后當(dāng)程序運(yùn)行的時(shí)候矩乐,會(huì)自動(dòng)根據(jù)當(dāng)前運(yùn)行設(shè)備分辨率的高低選擇加載哪個(gè)文件夾下的圖片龄句。

  • 所有以drawable開頭的文件夾都是用來放圖片的
  • 所有以mipmap開頭的文件夾都是用來放應(yīng)用圖標(biāo)的
  • 所有以values開頭的文件夾都是用來放字符串、樣式散罕、顏色等配置的
  • layout文件夾是用來放布局文件的

打開res/values/strings.xml文件分歇,內(nèi)容如下所示:

<resources>
    <string name="app_name">BoostTestAndroid</string>
</resources>

可以看到,這里定義了一個(gè)應(yīng)用程序名的字符串欧漱,我們有以下兩種方式來引用它职抡。

  • 在代碼中通過R.string.app_name 可以獲得該字符串的引用。
  • 在XML中通過@string/app_name 可以獲得該字符串的引用误甚。

修改應(yīng)用程序的名稱及圖標(biāo)缚甩。打開AndroidManifest.xml文件,找到如下代碼:

// 圖標(biāo)
android:icon="@mipmap/ic_launcher"
// 應(yīng)用名稱
android:label="@string/app_name"
build.gradle文件

Android Studio是采用Gradle來構(gòu)建項(xiàng)目的窑邦。Gradle是一個(gè)非常先進(jìn)的項(xiàng)目構(gòu)建工具擅威,它使用了一種基于Groovy的領(lǐng)域特定語言(DSL)來聲明項(xiàng)目設(shè)置,摒棄了傳統(tǒng)基于XML(如AntMaven)的各種煩瑣配置冈钦。項(xiàng)目中有兩個(gè)build.gradle文件郊丛,一個(gè)是在最外層目錄下的,一個(gè)是在app目錄下的瞧筛。這兩個(gè)文件對構(gòu)建Android Studio項(xiàng)目都起到了至關(guān)重要的作用厉熟。

app目錄下的build.gradle文件。這些代碼都是自動(dòng)生成的较幌,雖然語法結(jié)構(gòu)看上去可能有點(diǎn)難以理解揍瑟,但是如果我們忽略語法結(jié)構(gòu),只看最關(guān)鍵的部分绅络,其實(shí)還是很好懂的月培。第一行應(yīng)用了一個(gè)插件。一般可以選擇:1恩急、com.android.application表示這是一個(gè)應(yīng)用程序模塊杉畜,2、com.android.library 表示這是一個(gè)庫模塊衷恭。兩者的最大區(qū)別是:一個(gè)是可以直接運(yùn)行的此叠;一個(gè)只能作為代碼庫依賴于別的應(yīng)用程序來運(yùn)行。

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

下面是一個(gè)Android包随珠,用于配置項(xiàng)目構(gòu)建的各種屬性灭袁。

android {
    namespace 'com.example.boosttestandroid'
    compileSdk 32 // 用于指定項(xiàng)目的編譯版本

    defaultConfig {// 對項(xiàng)目的更多細(xì)節(jié)進(jìn)行配置
        applicationId "com.example.boosttestandroid" // 用于指定項(xiàng)目的包名
        minSdk 21 // 用于指定項(xiàng)目最低兼容的Android系統(tǒng)版本
        targetSdk 32 // 指定的值表示你在該目標(biāo)版本上已經(jīng)做過了充分的測試猬错,系統(tǒng)將會(huì)為你的應(yīng)用程序啟用一些最新的功能和特性
        versionCode 1 // 指定項(xiàng)目的版本號
        versionName "1.0" // 指定項(xiàng)目的版本名

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {// 用于指定生成安裝文件的相關(guān)配置
        release {// 用于指定生成正式版安裝文件的配置
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

指定當(dāng)前項(xiàng)目所有的依賴關(guān)系.一般有三種依賴:本地依賴、庫依賴和遠(yuǎn)程依賴茸歧。

  • 本地依賴可以對本地的Jar包或目錄添加依賴關(guān)系
  • 庫依賴可以對項(xiàng)目中的庫模塊添加依賴關(guān)系
  • 遠(yuǎn)程依賴則可以對jcenter庫上的開源項(xiàng)目添加依賴關(guān)系
dependencies {
    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

三倦炒、解析默認(rèn) Demo

首先我們可以看到,MainActivity 是繼承自 AppCompatActivity 的软瞎。AppCompatActivityAndroidX提供的一種向下兼容的Activity逢唤,可以使Activity在不同系統(tǒng)版本中的功能保持一致性。ActivityAndroid系統(tǒng)提供的一個(gè)活動(dòng)基類涤浇,我們項(xiàng)目中所有的活動(dòng)都必須繼承它或者它的子類才能擁有活動(dòng)的特性鳖藕。(AppCompatActivityActivity的子類)。

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

然后可以看到MainActivity中有一個(gè)onCreate()方法只锭,這個(gè)方法是一個(gè)活動(dòng)被創(chuàng)建時(shí)必定要執(zhí)行的方法著恩,其中只有兩行代碼,并且沒有Hello World!的字樣蜻展。那么之前app中顯示的Hello World!是在哪里定義的呢喉誊?

其實(shí)Android程序的設(shè)計(jì)講究邏輯和視圖分離,因此是不推薦在活動(dòng)中直接編寫界面的纵顾,更加通用的一種做法是裹驰,在布局文件中編寫界面,然后在活動(dòng)中引入進(jìn)來片挂。可以看到贞盯,在onCreate()方法的第二行調(diào)用了setContentView()方法音念,就是這個(gè)方法給當(dāng)前的活動(dòng)引入了一個(gè)activity_main布局,那Hello World!一定就是在這里定義的了躏敢!我們快打開這個(gè)文件看一看闷愤。

切換到text視圖:

終于找到hello world的定義了。

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載件余,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者讥脐。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啼器,隨后出現(xiàn)的幾起案子旬渠,更是在濱河造成了極大的恐慌,老刑警劉巖端壳,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件告丢,死亡現(xiàn)場離奇詭異,居然都是意外死亡损谦,警方通過查閱死者的電腦和手機(jī)岖免,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門岳颇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颅湘,你說我怎么就攤上這事话侧。” “怎么了闯参?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵瞻鹏,是天一觀的道長。 經(jīng)常有香客問我赢赊,道長乙漓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任释移,我火速辦了婚禮叭披,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘玩讳。我一直安慰自己涩蜘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布熏纯。 她就那樣靜靜地躺著同诫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樟澜。 梳的紋絲不亂的頭發(fā)上误窖,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機(jī)與錄音秩贰,去河邊找鬼霹俺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毒费,可吹牛的內(nèi)容都是我干的丙唧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼觅玻,長吁一口氣:“原來是場噩夢啊……” “哼想际!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起溪厘,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤胡本,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后畸悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體打瘪,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闺骚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片彩扔。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖僻爽,靈堂內(nèi)的尸體忽然破棺而出虫碉,到底是詐尸還是另有隱情,我是刑警寧澤胸梆,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布敦捧,位于F島的核電站,受9級特大地震影響碰镜,放射性物質(zhì)發(fā)生泄漏兢卵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一绪颖、第九天 我趴在偏房一處隱蔽的房頂上張望秽荤。 院中可真熱鬧,春花似錦柠横、人聲如沸窃款。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晨继。三九已至,卻和暖如春搬俊,著一層夾襖步出監(jiān)牢的瞬間紊扬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工唉擂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珠月,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓楔敌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驻谆。 傳聞我的和親對象是個(gè)殘疾皇子卵凑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

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