1.1 了解全貌
1.1.1 Android系统架构
Linux内核层(Linux kernel)
Android基于Linux内核,该层为Android设备的硬件提供底层驱动
系统运行库层(Libraries+Android Runtime)
该层通过一些C/C++库为Android系统提供特性支持。
SQLite库,OpenGL|ES库(3D绘图支持),Webkit库(浏览器内核支持)
Android运行时库:核心库,允许开发者使用Java编写应用程序,
Android运行时库还包含Dalvik虚拟机,5.0后改为ART定制的虚拟机
它使每一个Android应用运行在独立进程中并拥有一个自己的虚拟机实例
应用框架层(Application Framework)
提供构建应用程序时可使用的API,Android自带的一些核心应用会使用,开发者也可用
应用层(Application)
所有安装在手机上的应用属于该层
Android5.0以上系统已占据超过85%Android市场份额
1.1.3 Android应用开发特色
四大组件
组件 | Description |
---|---|
Activity | 应用程序的门面,你看到的所有东西都在其中 |
Service | 后台默默运行(即使你退出) |
BroadcastReceiver | 接收各处的广播,如电话、短信,也可向外发出广播 |
ContentProvider | 在应用程序之间共享数据(在应用中读取系统通讯录) |
系统控件(界面)
UI界面,自带控件,也可自定义控件。
SQLite数据库
嵌入式关系型数据库,支持标准SQL语法,可通过Android封装的API进行操作。
多媒体
音乐拍照视频录像
1.2 搭建环境
1.2.1 工具
JDK:包含了Java的运行环境、工具集合、基础类库等内容。
Android SDK:Android开发工具包,通过引入该工具包来使用Android相关的API。
Android Studio:IDE
1.3.4 分析第一个Android程序
-
.gradle和.idea:自动生成
-
app:项目代码、资源等内容
-
build:编译时自动生成
-
gradle:使用gradle wrapper,会自动选择联网下载gradle
-
.gitignore:指定目录或文件,排除在版本控制外
-
build.gradle:gradle
构建脚本
-
gradle.properties:全局gradle
配置文件
-
gradlew和gradlew.bat:在命令行界面执行gradle命令,前在linux后在Windows
-
HelloWorld.iml:标识IDEA项目
-
local.properties:指定本机Android SDK路径
-
settings.gradle:指定项目引入的模块(一般是自动引入)
app目录结构
-
build:编译时自动生成
-
libs:存放第三方jar包(该目录下jar包会被自动添加到项目的构建路径中)
-
androidTest:编写测试用例,自动化测试
-
java:放Java和Kotlin代码(MainActivity)
-
res:图片放
drawable
、布局放layout
、字符串资源String
-
Android-Manifest.xml:整个项目的配置文件,四大组件在此注册,添加权限声明
-
test:编写Unit Test测试用例
-
.gitignore:将app模块内指定目录或文件排除在版本控制外
-
app.iml:IDEA自动生成
-
build.gradle:app模块的gradle构建脚本,项目构建相关配置
-
proguard-rules.pro:对代码加密,打包成安装包文件时对代码混淆
项目怎样运行
1.Android-Mainfest.xml
四大组件必须在此注册!!!
<!-- 对MainActivity进行注册 --> <activity android:name=".MainActivity"> <intent-filter> <!-- 这是项目的主Activity,点击图标,首先启动的就是这个Activity --> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
2.MainActivity.java
/** * 继承自AppCompatActivity,它是向下兼容的Activity的子类 * * 自定义Activity必须继承Activity类或它的子类 * **/ public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //为当前Activity引入一个activity_main.xml布局文件 setContentView(R.layout.activity_main); } }
3.布局文件activity_main.xml
res/layout目录下
逻辑与视图分离
1.3.5 详解res
drawable:图片
mipmap:放应用图标icon
values:字符串、样式、颜色等配置
layout:放布局文件
多个mipmap为了兼容不同分辨率的设备
应该自己创建drawable-hdpi,xhdpi,xxhdpi等目录
-
在代码中通过R.string.app_name可以获得该字符串的引用。
-
在XML中通过@string/app_name可以获得该字符串的引用。
1.3.6 详解build.gradle文件
Gradle用于构建项目,基于Groovy的领域特定语言DSL,用于进行项目设置,摒弃XML
最外层的gradle文件
google():google自家的扩展依赖库
jcenter():第三方开源库
声明这两行配置后,就可以在项目中轻松引用任何google和jcenter仓库中的依赖库
dependencies闭包中使用classpath声明两个插件:一个Gradle插件和一个Kotlin插件。
Gradle不仅仅能用来构建Android项目,故需要声明;使用Kotlin就需要Kotlin插件
app中的gradle文件
plugin:插件,应用程序模块可直接运行,库模块只作为代码库依附其他应用程序模块运行
android闭包:配置项目构建的各种属性
defaultConfig闭包:配置项目的更多细节
applicationId:不可重复,默认包名
minSDKVersion:最低兼容Android系统版本
targetSdk:表示你在该目标版本上已做充分测试
versionCode:项目版本号
versionName:项目版本名
testInstrumentationRunner:启用JUnit测试,在当前项目中
buildTypes闭包:指定生成安装文件的相关配置
debug子闭包:指定生成测试版安装文件的配置(可忽略不写)
release子闭包:指定生成正式版安装文件的配置
minifyEnabled:指定是否对项目代码进行混淆
proguardFiles:指定混淆规则文件
<Android SDK>/tools/proguard/proguard-android-optimize.txt
项目根目录下的proguard-rules.pro,当前项目特有混淆规则
Android Studio直接运行项目生成的都是测试版安装文件
dependencies闭包:指定当前项目所有依赖关系
implementation fileTree:本地依赖声明,lib目录下.jar后缀文件
implementation:远程依赖声明,域名部分(公司).工程名部分(工程):版本号
Gradle构建项目时会先检查本地是否有这个库的缓存
implementationproject(':helper'):库依赖声明
testImplementation和androidTestImplementation:测试用例库
1.4 使用日志工具
android.util.Log
-
Log.v():打印最为琐碎的、意义最小的日志信息。对应级别verbose,是Android日志里面级别最低的一种。
-
Log.d():打印调试信息,这些信息对你调试程序和分析问题应该是有帮助的。对应级别debug,比verbose高一级。
-
Log.i():用于打印一些比较重要的数据,这些数据应该是你非常想看到的、可以来帮你分析用户行为的数据。对应级别info,比debug高一级。
-
Log.w():用于打印一些警告信息,提示程序在这个地方可能会有潜在的风险,最好去修复一下这些出现警告的地方。对应级别warn,比info高一级。
-
Log.e():用于打印程序中的错误信息,比如程序进入了catch语句中。当有错误信息打印出来的时候,一般代表你的程序出现严重问题了,必须尽快修复。对应级别error,比warn高一级。
在MainActivity.java文件中添加一句Log.d("MainActivity","onCreate execute");
tag用于过滤打印信息,msg打印具体内容
(一般传入当前类名)
程序运行后在Logcat中查看打印信息:包含日志内容、tag名、程序包名、打印时间、进程号
日志的好处
-
日志开关可控制
-
能添加日志标签
-
日志有级别区分
Logcat中的过滤器
目前只有3个过滤器:
-
Show only selectedapplication:只显示选中程序的日志
-
Firebase是Google提供的一个开发者工具和基础架构平台
-
No Filters
-
自定义过滤器
自定义过滤器
Log Tag设置允许显示的日志的tag名称
Logcat日志级别
选中Verbose,不管用何种方法打印日志,都一定会显示
选中Debug,则只显示Debug及以上级别方法打印的日志
...
通过设置级别,只查看你关心的日志。如Error,查看崩溃信息日志。
关键字过滤
当用了过滤器+日志还不能锁定日志内容,通过关键字来显示相应日志,支持正则表达式。