Android系统架构
- 1. Linux内核层
- 2. 系统运行库层
- 3. 应用框架层
- 4. 应用层
Android 四大组件
- 活动(Activity),应用中看到的东西,都是放在活动中
- 服务(Service),在后台默默运行
- 广播接收器(Broadcast Recevier),接收来自各处的广播消息
- 内容提供器(Content Provider),为应用程序之间共享数据提供了可能
项目目录
任何新建的项目目录都会默认使用 Android 模式的项目结构,但这并不是真正的项目结构,而是被 Android Studio转换过的。这种项目结构简洁明了,适合进行快速开发。
切换成 Project,这就是项目真实的目录结构:
- .gradle 和 .idea
- 这两个目录下放置的都是 Android Studio 自动生成的一些文件,无需关心
- app
- 项目中的代码、资源等内容几乎都是放置在这个目录下
- gradle
- 这个目录下包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 gradle 下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。Android Studio 默认没有启动 gradle wrapper 的方式,如果需要打开,可以点击 File/Settings/Build,Execution, Deployment/Gradle,进行配置更改。
- .gitnore
- 将指定的目录或文件排除在版本控制之外
- build.gradle
- 项目全局的 gradle 构建脚本,通常这个文件的内容是不需要修改的。
- gradle.properties
- 全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。
- gradlew 和 gradlew.bat
- 这两个文件是用来在命令行界面中执行 gradle 命令的,其中 gradlew 是在 Linux 或 Mac 系统中使用,gradlew.bat 是在 windows 系统中使用的。
- HelloWorld.iml
- iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件(Android Studio 是基于 IntelliJ IDEA开发的),用于标识这是一个 IJ项目,不需要修改这个文件中的任何内容。
- local.properties
- 指定本机中的 Android SDK 路径,通常内容都是自动生成的,我们并不需要修改,除非sdk位置发生变化。
- settings.gradle
- 用于指定项目中所有引入的模块。由于 HelloWorld 项目中只有一个 app 模块,因此该文件也就只引入了 app 这一个模块。通常情况下模块的引入都是自动完成的。
app项目结构:
- build
- 包含一些在编译是自动生成的文件
- libs
- 如果项目使用到了第三方 jar 包,就需要把这些 jar 包放在 libs 目录下,放在这个目录下的 jar 包都会被自动添加到构建路径中去
- androidTest
- 用来编写 Android Test 测试用例的,可以对项目进行一些自动化测试
- java
- 放置所有 java 代码
- res
- 项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。图片——drawable,布局——layout,字符串——values
- AndroidManifest.xml
- 整个 Android 项目的配置文件,在程序中定义的 四大组件 都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
- test
- 用来编写 Unit Test 测试用例,是对项目进行自动化测试的另一种方式
- .gitignore
- 将 app 模块内的指定的目录或文件排除在版本控制之外
- app.iml
- IntelliJ IDEA 自动生成的文件,无需关心
- build.gradle
- app模块的 gradle 构建脚本,这个文件中会指定很多项目构建相关的配置
- proguard-rules.po
- 指定项目代码的混淆规则,当代码开发完成后打包成安装包文件
res 目录结构

- 以 drawable 开头的文件夹都是用来放图片
- 以 mipmap 开头的文件夹都是用来放应用图标
- 以 values 开头的文件夹都是用来放字符串、样式、颜色等配置
- layout 文件夹是用来放布局文件的
在 代码 中,通过 R.String.hello_world 获得字符串的引用
在 XML 中,通过 @string/hello_world 获得字符串的引用
详解 build.gradle文件
Android Studio 是采用 Gradle 来构建项目。Gradle 是一个非常先进的项目构建工具,摒弃了传统基于 XML(如 Ant 和 Maven)的各种烦琐配置。
项目中有两个 build.gradle 文件,
外层
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// jcenter 是一个代码托管仓库,声明这个配置之后,就可以在项目中轻松引用任何 jcenter 上的开源项目
buildscript {
repositories {
google()
jcenter()
}
// classpath 声明一个 Gradle 插件,因为 Gradle 并不是专门为构建 Android 项目而开发的
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
内层,app 目录下的 build.gradle 文件
// 应用一个插件,application-应用程序模块,library-库模块
apply plugin: 'com.android.application'
// 配置项目构建的各种属性
android {
compileSdkVersion 28 // 指定项目的编译版本,28-android9.0
// 对项目的更多细节进行配置
defaultConfig {
applicationId "com.example.helloworld" // 指定项目的包名
minSdkVersion 15 // 指定项目最低兼容的 Android系统版本,15-4.0
targetSdkVersion 28 // 28表示在该版本上已充分测试,系统会启用新功能和特性
versionCode 1 // 项目的版本号
versionName "1.0" // 项目的版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
// 用于指定生成安装文件的相关配置,debug-测试版(可忽略不写),release-正式版
buildTypes {
release {
minifyEnabled false // 是否对项目的代码进行混淆
// 混淆时使用的规则文件,1-sdk目录下,所有项目通用;2-当前项目根目录下,当前特有
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
}
}
// 指定当前项目所有的依赖关系,本地依赖、库依赖、远程依赖
dependencies {
// 本地依赖,将 libs 目录下所有 .jar 后缀的文件都添加到项目的构建路径中
implementation fileTree(dir: 'libs', include: ['*.jar'])
// 远程依赖库,域名:组名称:版本号
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
日志工具 Log 的使用
- Log.v() 用于打印最为琐碎的,意义最小的日志信息,对应级别 verbose ,最低
- Log.d() 打印一些调试信息,对调试程序和分析问题有帮助,对应级别 debug,
- Log.i() 打印一些比较重要的数据,帮助分析用户行为数据,对应级别 info,比 debug 高一级
- Log.w() 打印一些警告信息,提示程序在这个地方可能会潜在的风险,对应级别 warn
- Log.e() 打印程序中的一些错误信息,代表程序出现严重问题了,对应级别 error