Android系统架构
Linux 内核层
Android系统是基于Linux内核的, ART 依赖 Linux 内核层来实现线程和低内存管理等功能,这一层为Android设备的各种硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等
硬件抽象层 (HAL)
HAL 层给 Java API framework 层提供设备硬件功能的接口,HAL 由多个库模块组成,每个库模块为特定类型的硬件组件实现接口,例如相机和蓝牙模块,当 framework 层访问硬件设备时,Android 系统会为该硬件组件加载库模块
Android Runtime (ART)
从 Android 5.0 开始,每个应用程序都在自己的进程中运行,并具有自己的 ART,ART 旨在通过执行 DEX 文件在低内存设备上运行多个虚拟机
系统运行库层 Native C/C++ Libraries
许多核心 Android 系统组件和服务,例如 ART 和 HAL,他们都是从本地代码构建的,而他们的构建是需要系统运行库层所提供的的 C/C++ 本地库的,Android 平台提供 framework 层来公开这些本地库的部分功能,例如 OpenGL ES
Framework 层
提供了构建应用程序时可能用到的各种 API
应用层
安装在手机上的应用程序都是属于这一层
开发环境
下载 Google 集成好的工具:
https://developer.android.google.cn/studio
安装过程很简单,直接 “Next” 就可以了
新建项目和模拟器
新建项目
通过 File-> New -> New Project 创建项目,如下:
创建模拟器
点击下方的图标
选择自己想要的型号
选择版本,如果还没下载,就点击下载
更改配置,一般默认就行
点击下面圈出的图标就可以启动模拟器
Project 模式下的项目结构
将左侧的结构模式切换为Project 模式
.gradle和.idea
这两个目录下放置的都是 Android Studio 自动生成的一些文件,无须关心,也不用去手动编辑
app
项目中的代码、资源等内容都是放置在这个目录下的,开发工作也基本是在这个目录下进行的
build
这个目录主要包含了一些在编译时自动生成的文件,也不需要过多关心
gradle
这个目录下包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。Android Studio 默认就是启用 gradle wrapper 方式的,如果需要更改成离线模式,可以点击 File -> Settings -> Build, Execution, Deployment -> Gradle,进行配置更改
.gitignore
这个文件是用来将指定的目录或文件排除在版本控制之外的
build.gradle
这是项目全局的 gradle 构建脚本,通常这个文件中的内容是不需要修改的
gradle.properties
这个文件是全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本
gradlew 和 gradlew.bat
这两个文件是用来在命令行界面中执行 gradle 命令的,其中 gradlew 是在 Linux 或 Mac 系统中使用的,gradlew.bat 是在 Windows 系统中使用的
local.properties
这个文件用于指定本机中的 Android SDK 路径,通常不需要修改。除非你本机中的 Android SDK 位置发生了变化,那么就将这个文件中的路径改成新的位置即可
settings.gradle
这个文件用于指定项目中所有引入的模块
app 目录下的结构
build
这个目录和外层的build目录类似,也包含了一些在编译时自动生成的文件,不需要过多关心
libs
如果你的项目中使用到了第三方 jar 包,就需要把这些 jar 包都放在 libs 目录下,放在这个目录下的 jar 包会被自动添加到项目的构建路径里
androidTest
用来编写 Android Test 测试用例的,可以对项目进行一些自动化测试
java
放置我们所有Java代码的地方(Kotlin代码也放在这里),展开该目录,你将看到系统帮我们自动生成了一个MainActivity文件
res
在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在 drawable 目录下,布局放在 layout 目录下,字符串放在 values 目录下
AndroidManifest.xml
这是整个 Android 项目的配置文件,你在程序中定义的所有四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明
test
此处是用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式
.gitignore
这个文件用于将 app 模块内指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似
build.gradle
这是 app 模块的 gradle 构建脚本,这个文件中会指定很多项目构建相关的配置
proguard-rules.pro
这个文件用于指定项目代码的混淆规则,当代码开发完成后打包成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读
res 目录下的结构
目录 | 作用 |
---|---|
以“drawable”开头的目录 | 放图片 |
以“mipmap”开头的目录 | 放应用图标 |
以“values”开头的目录 | 放字符串、样式、颜色等配置 |
以“layout”开头的目录 | 放布局文件 |
为了让程序能够更好地兼容各种设备,可以自己创建drawable-hdpi、drawable-xhdpi、drawable-xxhdpi等目录,程序运行的时候,会根据当前运行设备分辨率的高低选择加载哪个目录下的图片,如果只有一份图片,把图片都放在drawable-xxhdpi(主流的设备分辨率)目录下
AndroidManifest.xml
build.gradle文件
Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来进行项目设置
最外层目录下的build.gradle文件
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
/*分别对应了一个代码仓库
* google仓库中包含的主要是Google自家的扩展依赖库
* 而mavenCentral仓库中包含的大多是一些第三方的开源库*/
google()
mavenCentral()
}
/*声明了两个插件:一个Gradle插件和一个Kotlin插件*/
dependencies {
/*因为Gradle并不是专门为构建Android项目而开发的,
* Java、C++等很多种项目也可以使用Gradle来构建,
* 因此如果我们要想使用它来构建Android项目,
* 则需要声明com.android.tools.build:gradle:7.0.1这个插件*/
classpath "com.android.tools.build:gradle:7.0.1"
/*Kotlin插件则表示当前项目是使用Kotlin进行开发的,
* 如果是Java版的Android项目,则不需要声明这个插件*/
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.20"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
app目录下的build.gradle文件
/*应用插件*/
plugins {
/*com.android.application表示这是一个应用程序模块,
* com.android.library表示这是一个库模块。
* 应用程序模块是可以直接运行的,库模块只能作为代码库依附于别的应用程序模块来运行*/
id 'com.android.application'
/*应用了kotlin-android插件,想要使用Kotlin来开发Android项目,这个插件就是必须应用的
* 还有kotlin-android-extensions插件,实现了一些非常好用的Kotlin扩展功能*/
id 'kotlin-android'
}
/*这个闭包中我们可以配置项目构建的各种属性*/
android {
/*指定项目的编译版本*/
compileSdk 30
/*对项目的更多细节进行配置*/
defaultConfig {
/*每一个应用的唯一标识符*/
applicationId "com.example.androidstudy"
/*指定项目最低兼容的Android系统版本*/
minSdk 21
/*在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性
* 比如Android 6.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定
* 成23或者更高,那么系统就会为你的程序启用运行时权限功能,低于23就不会有该功能*/
targetSdk 30
/*指定项目的版本号*/
versionCode 1
/*指定项目的版本名*/
versionName "1.0"
/*在当前项目中启用JUnit测试*/
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
/*用于指定生成安装文件的相关配置
* 通常只会有两个子闭包:一个是debug(可忽略),一个是release*/
buildTypes {
release {
/*指定是否对项目的代码进行混淆*/
minifyEnabled false
/*用于指定混淆时使用的规则文件
* proguard-android-optimize.txt是在/tools/proguard目录下的,里面是所有项目通用的混淆规则
* proguard-rules.pro是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则*/
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
/*指定当前项目所有的依赖关系,
* 包括本地依赖(本地的jar包或目录)、库依赖(项目中的库模块)和远程依赖(jcenter仓库上的开源项目)*/
dependencies {
/*本地依赖声明,表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径中*/
implementation fileTree(dir: 'libs', includes: ['*.java'])
/*库依赖*/
implementation project(':helper')
/*远程依赖声明,Gradle在构建项目时会首先检查一下本地是否已经有这个库的缓存,
* 如果没有的话则会自动联网下载,然后再添加到项目的构建路径中*/
implementation 'androidx.core:core-ktx:1.3.2'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.3.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
/*声明测试用例库,忽略*/
testImplementation 'junit:junit:4.+'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
Android 的日志工具 Log
方法 | 对应级别 | 说明 |
---|---|---|
Log.v() | verbose | 用于打印那些最为琐碎的、意义最小的日志信息 |
Log.d() | debug | 用于打印一些调试信息,这些信息对你调试程序和分析问题应该是有帮助的 |
Log.i() | info | 用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以帮你分析用户行为的数据 |
Log.w() | warn | 用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方 |
Log.e() | error | 用于打印程序中的错误信息,比如程序进入了catch语句中。当有错误信息打印出来的时候,一般代表你的程序出现严重问题了,必须尽快修复 |
Android各版本对应的SDK版本
Android 版本指的是 Platform Version,而 SDK 版本指的是 API Level,对应关系可以再以下网址查看,不过需要外网才行
https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels
平台版本 | API 级别 | VERSION_CODE |
---|---|---|
Android 10.0 | 29 | Q |
Android 9 | 28 | P |
Android 8.1 | 27 | O_MR1 |
Android 8.0 | 26 | O |
Android 7.1、Android 7.1.1 | 25 | N_MR1 |
Android 7.0 | 24 | N |
Android 6.0 | 23 | M |
Android 5.1 | 22 | LOLLIPOP_MR1 |
Android 5.0 | 21 | LOLLIPOP |
Android 4.4W | 20 | KITKAT_WATCH |
Android 4.4 | 19 | KITKAT |
Android 4.3 | 18 | JELLY_BEAN_MR2 |
Android 4.2、Android 4.2.2 | 17 | JELLY_BEAN_MR1 |
Android 4.1、Android 4.1.1 | 16 | JELLY_BEAN |
Android 4.0.3、Android 4.0.4 | 15 | ICE_CREAM_SANDWICH_MR1 |
Android 4.0、Android 4.0.1、Android 4.0.2 | 14 | ICE_CREAM_SANDWICH |
Android 3.2 | 13 | HONEYCOMB_MR2 |
Android 3.1.x | 12 | HONEYCOMB_MR1 |
Android 3.0.x | 11 | HONEYCOMB |
Android 2.3.4、Android 2.3.3 | 10 | GINGERBREAD_MR1 |
Android 2.3.2、Android 2.3.1、Android 2.3 | 9 | GINGERBREAD |
Android 2.2.x | 8 | FROYO |
Android 2.1.x | 7 | ECLAIR_MR1 |
Android 2.0.1 | 6 | ECLAIR_0_1 |
Android 2.0 | 5 | ECLAIR |
Android 1.6 | 4 | DONUT |
Android 1.5 | 3 | CUPCAKE |
Android 1.1 | 2 | BASE_1_1 |
Android 1.0 | 1 | BASE |