1.1 了解全貌——Android 王国简介
1.1.1 Android 系统框架
Android系统框架分为四层
应用层:所有的应用都在这层,如地图,电话,以及我们自己开发的应用
应用框架层:应用调用的api都在这层
系统运行库层:这层比较负责,主要是c++所写的关于安卓特性的库,如webKit浏览器,SQLite数据库,OpenGL提供了3D绘图等,还有一个android运行时库,提供了一系列核心库,让java可以编写android应用,同时android运行时库还包含一个Dalvik虚拟机,可以让每一个应用都运行在独立的进程中,启动一个Dalvik虚拟机,在android5.0,Dalvik虚拟机被ART运行环境取代。
Linux内核层:系统硬件驱动曾层
1.1.2 Android已经发布的版本
比较大的改变:
Android5.0用ART运行环境取代了Dalvik虚拟机。ART是运行时环境,对代码在安装时进行预编译,启动很快,但是安装慢,占用内存大;而Dalvik虚拟机,是启动时候编译,比较慢。
1.1.3 Android 应用开发特色
四大组件
丰富的系统控件
SQLite数据库
强大的多媒体
地理位置定位
1.2 手把手带你搭建开发环境
1.2.1 准备所需的工具
JDK:JAVA开发工具包
SDK:Android开发工具包
1.2.2 搭建开发环境
android stuido的安装
1.3 创建你的第一个Android项目
1.3.1 创建HelloWorld项目
创建一个新项目流程
1.3.2 启动模拟器
Android studio自带模拟器
1.3.3 运行HelloWorld
运行项目流程
1.3.4 分析你的第一个Android项目
project下目录结构
.gradle 和 . idea是android studio自动生成的,不需要理会
app:里面是主要代码,等会细说
build:编译时自动生成的文件
gradle:gradle wrapper配置文件
.gitigonre:版本控制的时候,哪些不需要提交一类的
build.gradle:全局的build构建脚本
gradle.properties:全局的build配置文件
gradlew和gradlew.bat:执行命令行的gradle命令,其中gradlew是window系统的,bat是mac或Linux系统的
HellowWorld.iml:识别IntelliJ IDEA项目
local.properties:是存放SDK位置的
settings.gradle:识别项目引入模块的
app下目录结构
build:编译时自动生成的
libs:第三方的jar包都放在里面
src:代码,资源,测试文件
androidTest:编写测试用例的
man:资源文件和代码文件存放的地方,最重要的文件夹
java:java代码存放的地方
res:资源文件存放,入图片,文字等
AndroidManifest:配置文件,四大组件的注册,权限申请等
test:自动化测试
.gitigonre:版本控制时候,哪些不提交一类的控制
app.iml:识别IntelliJ IDEA项目
build.gradle:gradle构建脚本,有很多构建相关的
proguard-rules.pro:混淆相关的
androidTest和test文件夹区别, androidTest是整合测试。可以运行在设备或虚拟设备上.需要编译打包为APK在设备上运行,可以实时查看细节.test是单元测试类.运行在本地开发机上,可以脱离Android运行时环境,速度快。其实我现在也不懂
AppCompatActivity是一种向下兼容的Activity
1.3.5 详解项目中的资源
res文件夹里面有drawable文件夹,以及多个mipmap文件夹,其中mipmap文件夹是放应用图标了,而drawable文件夹是用来放图片的,
其中对应的密度大概是这个样子的
一般来说,对应的图片应该放在对应的密度的文件夹里面,但是很多时候UI只给了一套图,我们建议放在xxhdpi文件夹里面,因为找图片的顺序是先在目标密度的文件夹里面寻找,然后往高层密度的文件夹里面寻找,找不到再往低层密度文件夹寻找。比如 我的手机屏幕密度是xxhdpi,那么drawable-xxhdpi文件夹下的图片就是最适合的图片。 如果drawable-xxhdpi文件夹下有这张图就会优先被使用,在这种情况下,图片是不会被缩放的。如果drawable-xxhdpi文件夹下没有这张图时, 系统就会自动去其它文件夹下找这张图了,优先会去更高密度的文件夹下找这张图片,我们当前的场景就是drawable-xxxhdpi文件夹,然后发现这里也没有android_logo这张图,接下来会尝试再找更高密度的文件夹,发现没有更高密度的了,这个时候会去drawable-nodpi文件夹找这张图,发现也没有,那么就会去更低密度的文件夹下面找,依次是drawable-xhdpi -> drawable-hdpi -> drawable-mdpi -> drawable-ldpi。这个 drawable-nodpi文件夹, 是一个密度无关的文件夹,放在这里的图片系统就不会对它进行自动缩放,原图片是多大就会实际展示多大,但是主意顺序
所以在如果我手机的密度是mdpi,图片宽是像素320px,放到mdpi文件夹,图片大小保持不变,如果我的图片放在了xhdpi里面,会默认图片是一张高密度的图片,适合xhdpi使用,而现在我是mdpi,会对图片进行缩小,防止图片过大,160/240*320 就会变成213,约缩小成了0.6倍;如果我把图片放在了ldpi文件夹里面,如果我把图片放到ldpi里面,手机原本是mdpi,就是160/120*320大约等于427,约放大了1.3倍。(数据没有实践,因为没有找到合适的分辨率机器)
在实际的过程中,如果我们放的文件夹密度过小,而手机密度过大,系统会自动帮我们放大图片,这样比较占用内存,所以我们尽量放在大密度的文件夹里面,我们选用xxhdpi文件夹,一是因为市面上这样的手机比较多,二是市面上高于xxhdpi密度手机很少了,所以大部分是正好密度的图片或者系统会帮我们缩小
在应用资源文件的时候,可以通过R.string.app_name引用,或者@string/app_name
1.3.6 详解build.gradle文件
最外层的build.gradle文件
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
}
}
两处repositories的闭包中都声明了一个jcenter()代表的一个代码托管仓库,声明了这个可以很 容易的使用这仓库里面的代码
dependencies的闭包里面的 classpath 'com.android.tools.build:gradle:2.3.3'是声明了一个gradle插件,因为gradle不仅仅是android,里面还有很多如c++等
app里面的build.gradle文件
android {
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.example.pc.mymanifest"
minSdkVersion 15
targetSdkVersion 24
versionCode 3
versionName "火腿"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:24.2.1'
testCompile 'junit:junit:4.12'
}
compileSdkVersion:编译的sdk版本,我们一般选用高版本,不是运行版本,不太理解这句话什么意思
buildToolsVersion:项目构建工具的版本
applicationId :项目的id,就是包名
minSdkVersion:最低适配的版本
targetSdkVersion:适配的目标版本
versionCode:当前app版本
versionName:当前app名称
buildTypes安装文件的相关配置,通常有两个闭包,一个是debug,一个是release,其中debug是测试版本,可以不写,release里面分析如下
minifyEnabled:是否混淆
proguardFiles:混淆文件规则
dependencies闭包里面都是放的相关的依赖关系,通常有三种依赖,本地依赖,库依赖,远程依赖,
compile fileTree是本地依赖,是对本地的jar包或者目录添加依赖
compile是远程依赖,com.android.support:appcompat-v7:24.2.1 表示com.android.support是域名, appcompat-v7是库名称, 24.2.1是版本
compile project是库依赖的意思,这边没有用到
1.4 前行必备——掌握日志工具的使用
1.4.1 使用Android的日志工具Log
Log.v()
Log.d()
Log.i()
Log.w()
Log.e()
1.4.2 为什么使用Log而不使用System.out
Log可以自动生成,打下logt,自动生成Log所需的TAG,是当前的Activity名称,打下logd,然后按Tab键,可以自动生成Log.d()打印
Log可以添加过滤器
show only selected application:只显示当前程序的Log
Firebase:是谷歌的一个过滤器
No Filters:相当于没有过滤器
Edit Filter Configuration:自定义过滤器
一般只需要写过滤器名称和LogTag就可以了,LogTag就是Log的参数tag。
1.5 小结与点评
一些基础知识需要记一下,Android的框架层以及对build文件的分析