iOS開發(fā)者入門Android開發(fā)筆記(二)-項目結構

前言

筆者是一名iOS開發(fā)者澳迫,最近在學習Android開發(fā)葛躏。作為移動平臺的兩大陣營澈段,iOS和Android開發(fā)既有想通之處悠菜,也有各自不同的特性。本系列文章败富,主要是從iOS開發(fā)者的角度悔醋,類比地去學習Android開發(fā),記錄下自己的一些心得體會兽叮。如果你也對Android開發(fā)感興趣芬骄,并想入門學習。建議可以去看郭霖《第一行代碼》鹦聪。筆者也是通過這本書來入門學習Android開發(fā)的账阻,因此,本文的大部分知識泽本,你都可以在這本書中看到淘太。

這里需要說明的是,筆者手中的《第一行代碼》是第二版观挎。目前此書共有三版琴儿,第一版是在2014年出版,時間相對較早嘁捷,書中使用的開發(fā)工具還是Eclipse造成,內容很多已過時。第二版是2016年出版雄嚣,在第一版的基礎上基于Android7.0進行全面更新晒屎,開發(fā)工具也跟新為Android Studio,不過目前來看缓升,也有部分過時的API鼓鲁。第三版是2020年出版,更新了部分內容的同時港谊,全書改用Google推薦的Kotlin作為開發(fā)語言骇吭。作為初學者,筆者不建議直接從Kotlin學起歧寺,畢竟目前大量的項目還是基于Java開發(fā)燥狰。就好像雖然蘋果主推Swift,但目前大量的項目還是基于Objective-C開發(fā)斜筐。我們可以入門后龙致,進一步學習Kotlin。

一顷链、項目結構

我們上一篇成功創(chuàng)建了第一個Android項目目代,接下來我們以這個項目為例,分析它的項目結構。

首先榛了,我們需要打開項目HelloWorld在讶。這里需要說明的是,我們不能像iOS項目一樣忽冻,直接雙擊xxx.xcodeprojxxx.xcworkspace文件來打開項目真朗。而是需要打開Android Studio,點擊Open an existing Android Studio projectImprot project 來導入項目僧诚。當然,因為我們之前打開過HelloWorld項目蝗碎,所以直接從左側的歷史記錄打開就可以湖笨。

打開項目

接下來,我們來看左側的項目文件目錄

簡化后的文件結構

這里并不是項目正式的文件目錄結構蹦骑,而是被Android Studio 轉換過的慈省。作為初學者,我們首先切換項目結構模式為Project眠菇,來認識真實的目錄結構边败。

切換項目結構模式
Project模式的項目結構

二、重點關注的目錄-APP

APP目錄是需我們重點關注的捎废,以后的開發(fā)基本都是在這個目錄操作笑窜。其中包含了項目的代碼、資源等文件登疗。

1排截、build

編輯自動生成的文件,無需過多關注和修改

2辐益、libs

放置第三方jar包断傲,會被自動添加到構建路徑里

3、src

我們日常開發(fā)的編寫的文件都在此目錄:

->androidTest:編寫Android Instrument Test 測試用例

->test:編寫Android Unit Test 測試用例

-> main:項目主文件目錄

  • java 我們編寫的Java文件
  • res 資源文件智政,類似于iOS的Assets.xcassets文件认罩,包含內容較多,后面會有詳解
  • AndroidManifest.xml续捂,項目配置文件垦垂,類似iOS的Info.plist文件

4、.gitignore

將app模塊內的指定文件或目錄排除在版本控制之外疾忍。

5乔外、app.iml

IntelliJ IDEA 項目自動生成的文件,無需修改一罩。

6杨幼、build.gradle

app模塊的gradle構建腳本,用于指定很多項目構建相關的配置。

/*
應用了一個插件差购,一般兩個可選值:
“com.android.application”-表示當前為應用程序模塊四瘫,可直接運行;
“com.android.library”-表示當前為庫模塊欲逃,只能作為代碼庫找蜜,依附于其它應用程序模塊運行。
*/
apply plugin: 'com.android.application'

android {
    //指定項目的編譯版本
    compileSdkVersion 29
    //項目細節(jié)配置
    defaultConfig {
        //項目包名稳析,區(qū)分應用的唯一標識
        applicationId "com.example.helloworld"
        //最低兼容的Android系統(tǒng)版本
        minSdkVersion 21
        //已充分適配該系統(tǒng)版本新特性
        targetSdkVersion 29
        //項目版本號
        versionCode 1
        //項目版本名
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    //指定生成安裝包文件的相關配置
    buildTypes {
        //debug{} 指定測試版安裝包配置洗做,一般可以忽略不寫
        //指定正式版安裝包文件配置
        release {
            //是否對項目進行代碼混淆
            minifyEnabled false
            //指定混淆使用的規(guī)則文件,
           //proguard-android-optimize.txt 是在Android SDK目錄下彰居,所有項目的通用混淆規(guī)則
          //proguard-rules.pro 是當前項目根目錄下诚纸,可自行編寫當前項目特有混淆規(guī)則
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
//指定當前項目依賴關系1、本地依賴陈惰;2畦徘、庫依賴;3抬闯、遠程jcenter庫依賴井辆。
dependencies {
    //本地依賴,表示將libs目錄下.jar后綴的文件添加到項目的構建目錄
    implementation fileTree(dir: "libs", include: ["*.jar"])
    //遠程依賴
    implementation 'androidx.appcompat:appcompat:1.2.0'
    //遠程依賴
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'

}

7溶握、proguard-rules.pro

用于指定項目代碼混淆規(guī)則杯缺,防止代碼被破解。

三奈虾、其它目錄

除app目錄外的其他目錄夺谁,多是自動生成的,且一般不需要我們去修改的肉微。因此匾鸥,只需簡單了解,或暫時略過碉纳。
1勿负、.gradle和.idea
Android Studio自動生成文件,無需手動編輯劳曹。
2奴愉、build
編譯是自動生成的文件,無需手動編輯铁孵。
3锭硼、gradle
此目錄包含gradle wrapper的配置文件。
4蜕劝、.gitignore
指定目錄或文件排除在版本控制之外檀头。
5轰异、build.gradle
項目全局的gradle構建腳本,通常這個文件不需要修改暑始。
6搭独、gradle.properties
全局gradle配置文件,這里配置的屬性將影響到項目中所有的gradle編譯腳本廊镜。
7牙肝、gradlew和gradlew.bat
用于命令行界面執(zhí)行gradle命令,gradlew用于Linux或Mac系統(tǒng)嗤朴,gradlew.bat用于Windows系統(tǒng)配椭。
8、local.properties
用于指定本機Android SKD路徑雹姊,通常自動生成無需修改颂郎,除非本地Android SKD路徑路徑變化。

四容为、res 資源文件詳解

1、資源類型

res 資源文件
  • drawable 開頭的文件寺酪,用于放圖片
  • layout 放布局文件
  • mipmap 開頭的文件坎背,用于放應用圖標
  • values開頭的文件,放字符串寄雀、樣式得滤、顏色等

mipmap開頭的多個文件,用于適配的分辨率的設備盒犹,類似于iOS中@2x懂更、@3x。同理急膀,drawable文件雖然沒有自動生成沮协,但是需要我們自己創(chuàng)建drawable-hdpi、drawable-xhdpi卓嫂、drawable-xxhdpi慷暂、drawable-xxxhdpi。

這里的布局文件是.xml晨雳,類似于iOS的.xib文件行瑞。支持可視化編輯,也可以代碼編寫餐禁。


布局文件

2血久、資源引用

以下是res/values.strings.xml文件內容:

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

想引用app_name有兩種方式:

  • 在代碼中通過R.string.app_name來獲取內容
  • 在XML文件中通過@string/app_name來獲取內容
    例如在AndroidManifest.xml文件中:
<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        ...
 </application>

五、HelloWorld項目是怎么運行起來的帮非?

我們知道氧吐,iOS項目運行讹蘑,首先是在main.m文件注冊Appdelegate

int main(int argc, char * argv[]) {
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

然后在Appdelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions回到中設置window及其rootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[UIViewController alloc] init];
    [self.window makeKeyAndVisible];

    return YES;
}

而安卓項目的運行,首先需要在AndroidManifest.xml中注冊活動副砍,這里的活動衔肢,就是APP啟動后展示的頁面。

//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.helloworld">

    <application
        ...
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

這里表示注冊了活動MainActivity豁翎,intent-filter中的action android:name="android.intent.action.MAIN"category android:name="android.intent.category.LAUNCHER"表示將MainActivity設置為項目啟動的主頁面角骤。

我們來看下MainActivity文件

package com.example.helloworld;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

這里表示活動MainActivity 繼承自活動AppCompatActivityMainActivity在被創(chuàng)建的回調onCreate里心剥,加載了布局文件activity_main邦尊。

結語

現在,Android項目的大致結構我們已經初步了解优烧。接下來蝉揍,我們要學習一個Android中的日志工具類Log(android.until.Log)。這將有助于我們以后的開發(fā)調試畦娄。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末又沾,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子熙卡,更是在濱河造成了極大的恐慌杖刷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳癌,死亡現場離奇詭異滑燃,居然都是意外死亡,警方通過查閱死者的電腦和手機颓鲜,發(fā)現死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門表窘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甜滨,你說我怎么就攤上這事乐严。” “怎么了艳吠?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵麦备,是天一觀的道長。 經常有香客問我昭娩,道長凛篙,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任栏渺,我火速辦了婚禮呛梆,結果婚禮上,老公的妹妹穿的比我還像新娘磕诊。我一直安慰自己填物,他們只是感情好纹腌,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著滞磺,像睡著了一般升薯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上击困,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天涎劈,我揣著相機與錄音,去河邊找鬼阅茶。 笑死蛛枚,一個胖子當著我的面吹牛,可吹牛的內容都是我干的脸哀。 我是一名探鬼主播蹦浦,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼撞蜂!你這毒婦竟也來了盲镶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤蝌诡,失蹤者是張志新(化名)和其女友劉穎徒河,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體送漠,經...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年由蘑,在試婚紗的時候發(fā)現自己被綠了闽寡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尼酿。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖裳擎,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鹿响,我是刑警寧澤羡微,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站惶我,受9級特大地震影響,放射性物質發(fā)生泄漏绸贡。R本人自食惡果不足惜毅哗,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捧挺。 院中可真熱鬧虑绵,春花似錦、人聲如沸闽烙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至摊溶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莫换,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工拉岁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喊暖。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓陵叽,卻偏偏與公主長得像狞尔,于是被迫代替她去往敵國和親巩掺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內容