前言
筆者是一名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.xcodeproj或xxx.xcworkspace文件來打開項目真朗。而是需要打開Android Studio,點擊Open an existing Android Studio project 或 Improt project 來導入項目僧诚。當然,因為我們之前打開過HelloWorld項目蝗碎,所以直接從左側的歷史記錄打開就可以湖笨。
接下來,我們來看左側的項目文件目錄
這里并不是項目正式的文件目錄結構蹦骑,而是被Android Studio 轉換過的慈省。作為初學者,我們首先切換項目結構模式為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、資源類型
- 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
繼承自活動AppCompatActivity
,MainActivity
在被創(chuàng)建的回調onCreate
里心剥,加載了布局文件activity_main
邦尊。
結語
現在,Android項目的大致結構我們已經初步了解优烧。接下來蝉揍,我們要學習一個Android中的日志工具類Log(android.until.Log)。這將有助于我們以后的開發(fā)調試畦娄。