當前位置:
首頁 > 最新 > Android Studio項目模板全面解析

Android Studio項目模板全面解析

今日科技快訊

7月9日消息,香港首支同股不同權的新股小米(01810-HK)在港交所正式掛牌交易,開盤價16.6港元,隨後一度跌到16港元。以開盤價計算,小米市值超470億美元。雷軍個人財富達到124億美元,全球排名第115。開盤後破發的小米,臨近午盤股價一度站上發行價,達到17港元。

作者簡介

本篇來自王鑫的投稿,分享了從手寫最簡單的Android程序到Android Studio項目模板的全面解析,一起來看看!希望大家喜歡。

王鑫的博客地址:

https://relish.wang/posts/24586/

前言

先上對比圖(左側是我們手動構建的最簡單的Android項目;右側是Android Studio默認創建的項目模板工程):

正文

進入正題前,先說個與手寫程序(不藉助IDE)類似的場景。我回想起以前初學Java時的場景—— 如何用記事本寫一個HelloWorld。

先寫個最簡單的Java程序:

在當前目錄下運行javac A.java(編譯A.java文件,生成A.class文件)

在當前目錄下運行javac A(執行class文件)

就會看到Hello Java!被列印在控制台(終端)上

用記事本開發Java程序確實簡單,三兩句話就講完了。Android程序有那麼多文件(AndroidManifest.xml、啟動的Activity、layout文件、icon圖標、strings.xml、styles.xml文件),這可咋整啊?

要是你認同這句話, 說明你早就已經習慣於Android Studio為你生成的項目模板(以下簡稱」AS項目模板」), 而失去了作為一位Android開發者自我的判斷——一個最簡單的Android程序到底需要哪些文件。

AS項目模板(未在括弧里標註的文件/文件夾都是gradle相關的, 下文會詳細講解):

我可以告訴你, 上面所說的文件里,其實只有AndroidManifest.xml是必須的(圖形頁面對於Android程序來說並不是必須的, 比如只運行在後台的Service)。但是為了本文章的展示效果, 還是保留Activity。(有Activity也並不意味著一定需要layout.xml)

準備

前面丟了些懸念, 但我們還不能進入正題。先做或確保一些準備工作。我們需要準備三樣東西: Java SDK、Android SDK、Gradle SDK 。前兩樣是Android開發必備的環境, 作為Android開發者自然不用多說。(請確保配置了ANDROID_HOME)。第三樣是項目自動化構建工具(gradle), 可以用於構建Android項目。

配置gradle

如果你是macOS用戶, 只需執行一條命令即可配置好最新版本的gradle環境:

brew install gradle

如果你使用的是其他操作系統, 可以參看:

https://gradle.org/install/

(確保配置了GRADLE_HOME)。配置完畢後運行gradle -v, 檢查是否配置完成。

寫一個最最簡單的Android程序

開門見山, 先放目錄結構。需要手動編寫的就三個文件

MainActivity.java 內容如下:

AndroidManifest.xml 內容如下:

build.gradle 內容如下:

buildscript {

repositories {

jcenter()

google()

}

dependencies {

classpath"com.android.tools.build:gradle:3.1.3"

}

}

allprojects{

repositories{

jcenter()

google()

}

}

apply plugin:"com.android.application"

android {

compileSdkVersion27

}


接下來才是真正見證奇蹟的時刻。

在demo(項目根目錄)下執行gradle assemble, 如果你看到下圖的執行結果說明運行成功了, 可以略過下文的錯誤說明, 請看執行完成。

如果你遇到如下錯誤, 則說明你未配置ANDROID_HOME環境變數。

解決方案有二:

1) 配置ANDROID_HOME環境變數。下圖是筆者電腦上的配置:

2) 在demo(項目根目錄)下新建local.properties文件, 輸入AndroidSDK所在路徑:

下圖是筆者電腦上的配置:

執行完成

執行完成後目錄結構如下:

在/build/outputs/apk的debug和release文件下就可以看到生成的apk文件了。

安裝apk文件後, 桌面圖標如下(不同Android版本上顯示的默認logo不同):

運行可以看到如下畫面:

也許看到這裡的讀者開始有些疑問了。為什麼只要這麼三個文件就夠了?哪怕構建後也只多了兩個文件夾?AndroidStudio生成的空項目里還有setting.gradle、.idea文件夾、gradle文件夾、*.iml文件、gradlew、gradlew.bat等, 這麼多文件呢!


如果你覺得這篇文章就這麼結束了, 那你就想得太簡單了。莫慌, 正片開始!接下來我要講的是, 這個項目如何一步一步轉化為我們熟悉的AndroidStudio的默認創建項目。


Gradle Wrapper是對Gradle的一層包裝, 便於團隊開發過程中統一Gradle構建的版本。 我們在項目開發過程中, 用的都是Wrapper這種方式。所以前面用的gradle相關命令建議都改為gradlew的命令(如:gradle assemble改為./gradlew assemble)。

在demo(項目根目錄)下執行gradle wrapper, 執行完成後目錄結構下新增的文件/文件夾如下:

gradlew和gradlew.bat分別是Linux和Windows下的可執行腳本。

gradle-wrapper.jar是具體業務邏輯實現的jar包。gradlew最終是使用這個jar包來執行相關的Gradle操作。

gradle-wrapper.properties是配置文件, 用於配置使用哪個版本的Gradle等。

打開gradle-wrapper.properties文件, 可以看到以下內容:

這裡我們基本只需關注distributionUrl即可, 這個欄位決定了你的gradle wrapper依賴哪個gradle版本。

為什麼要使用Wrapper?使用Wrapper有什麼好處?

因為使用gradle wrapper的方式不需要提前將gradle下載好,而是會自動根據本地的緩存情況決定是否需要聯網下載gradle。而且假設每個開發者電腦上未安裝/配置gradle環境, 那麼他/她仍能通過執行gradlew命令執行gradle相關任務。而且wrapper規定了使用的gradle版本, 在團隊開發中, 執行gradlew命令運行的都是同一個版本的gradle。避免了每個團隊成員電腦上配置的gradle版本不同而帶來的執行結果的差異。


settings.gradle

到這裡為止, 先來看一下我們項目的目錄結構:

仔細觀察發現, 少了settings.gradle文件, 而且這個src目錄外面應該再包一層app目錄…即便這樣app里也少了一些其他的文件…莫慌, 我們一點點來分析。

settings.gradle文件大多數的作用是為了配置子工程(moudle)。但由於我們這個」最簡單的Android程序」是一個單工程的項目, 所以settings.gradle並不是必須的。但是, 在實際開發過程中, 項目(Project)大多為多工程(module), 因此AS項目模板是會默認配置好settings.gradle, 並且主工程也被包裝成一個名為app的子工程(moudle)。

settings.gradle的內容也很簡單:

如果有多個module則用逗號隔開(不過我們這次不需要):

子工程配置

在demo(項目根目錄)下, 新建app文件夾,將demo(項目根目錄)下的src文件夾和build.gradle移動/剪切到新建的app目錄下。

這時再次執行./gradlew assemble, 已經可以生成apk文件了。但總覺得還是跟AS項目模板有些不同——根目錄少了一個build.gradle文件。此時的工程目錄:

既然是多工程配置, 那麼每個子工程(module)都需要的配置就可以做成項目(project)配置, 減少重複代碼。因此我們把./app/build.gradle內的部分內容移動到根目錄下的build.gradle中。

./build.gradle內容:

./app/build.gradle內容:

可以看到根目錄下的build.gradle已經和AS項目模板長得很像了, 區別在與下面這段代碼:

這裡定義了一個名為clean的gradle任務(task),我們可以通過運行./gradlew clean執行這個任務。它的執行結果就是刪除主項目的build文件夾。忘了說, 現在再執行./gradlew assemble, build文件夾會生成在app目錄下。再執行./gradlew clean就會刪除app目錄下的build文件夾。

其他未介紹的文件

其實文章講解到這裡, 我們手動修改的項目已經和AS項目模板大致相同了。因為此文介紹的重點其實是gradle構建工具和一個最簡單的Android項目需要那些文件。但鑒於這裡還有一些文件未提及,筆者決定簡單介紹一下它們。

.gitignore文件通常需要填寫的內容:

app/.gitignore文件通常需要填寫的內容:


文章講解到這裡, 我們手動修改的項目和AS項目模板的區別剩下app(主工程目錄)目錄下的文件內容、目錄結構不同了。

二者不同的地方都已經用黃框和藍框標出來了。其中黃框標註的文件已經在前文介紹過它們的作用了。下面介紹一下藍框里的文件/文件夾。

單元測試

androidTest文件夾和test文件夾分別是Android單元測試和Java單元測試相關的目錄。AS模板項目所用的單元測試框架是Java單元測試框架junit、AndroidJUnit、Android UI自動化測試框架espresso。

由於篇幅原因,關於單元測試的用法就不在此文中詳細描述,感興趣的讀者可以查閱文末的引用資料或自行搜索相關資料進行學習。

資源文件

所有的資源文件夾都有-v[api-level]的形式、-[各國語言縮寫]國際化資源的形式。如:drawable-zh-ldpi、values-en、drawable-v21。

drawable

存放圖片/圖標文件以及樣式相關的文件

如: ic_avatar.png分別在drawable-v19和drawable-v21分別有兩個長得不同的圖標文件, 如果運行的手機是Android5.1(API22)的, 那麼它會載入drawable-v21下的ic_avatar.png;但如果僅在drawable-v19下放置了ic_avatar.png,drawable-v21沒有的話, 在這台手機上運行時就會載入drawable-v19下的ic_avatar.png;如果drawable-v[API-version]此類文件夾未放置ic_avatar.png圖標, 則會載入對應解析度文件夾下的ic_avatar.png; 要是各解析度的文件夾里也沒有ic_avatar.png的話,就會載入drawable文件夾下的ic_avatar.png。

圖標載入順序:

drawable-v[對應的高API]->drawble-v[低API]->drawable-[對應高解析度]dpi->drawable-[低解析度]dpi->drawable

layout

布局文件載入順序:

(根據屏幕狀態而定)layout-land或layout-port->layout

mipmap

用法與drawable一致。區別在於: mipmap文件夾僅僅用於放置app的logo圖標。

values

AS項目模板:

除此之外還可以有以下文件:

其實並不需要拘泥於這些文件名, 想取啥文件名都行, 甚至這些文件里的內容也可以全寫在一個文件里(但推薦寫法還是分開寫, 各司其職):

其他資源文件

這裡還有一些常見資源文件/文件夾未提及, 將在下方表格中列出:


AS項目模板的app/build.gradle文件內容:

implementation vs compile

從Android Gradle plugin 3.0開始推薦使用implementation和api來替換原先的compile。理論上你可以把所有的compile替換成api。下面說說它們的區別:

其他改動:

provided -> compileOnly

apk -> runtimeOnly

testCompile -> testImplementation // 編譯測試用例時依賴, 不會打包到發布的產品中

androidTestCompile -> androidTestImplementation // 編譯測試用例時依賴, 不會打包到發布的產品中


AS項目模板的AndroidManifest.xml文件內容:

總結

本來只是想介紹一個不藉助IDE可以手寫出來的最簡單的Android程序的教程。講著講著就想把Android Studio的模板工程目錄結構、文件作用都說了一遍, 不知不覺寫了這麼多。也把我們這個最簡單的Android程序一步步拓展成了Android Studio的模板工程。希望各位讀者在體會到Android Studio為我們廣大Android開發者的開發工作帶來莫大的幫助的同時, 明白Android Studio為我們都做了哪些事。

引用資料

Wrapper (gradlew):

https://www.zybuluo.com/xtccc/note/275168

Gradle官方文檔:

https://docs.gradle.org/current/dsl/index.html

Android單元測試-如何開始?

https://www.jianshu.com/p/bc99678b1d6e

自適應圖標(Adaptive icons):

https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive

遷移到插件3.0.0:

https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration#new_configurations

或者掃一掃關注我的公眾號


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 郭霖 的精彩文章:

TAG:郭霖 |