1、Android系统架构
为了能够让我们更好的了解android系统的工作原理,我们先来看下系统架构,android系统架构可以分为四层:分别是Linux内核层,系统运行库层,应用框架层,应用层。
1、Linux内核层
Android系统本质上是基于Linux系统开发的,这一层为android设备各种硬件提供驱动,如显示驱动,音频驱动,照相机驱动,蓝牙驱动,Wifi驱动,电源管理。
2、系统运行库层
这一层主要通过C/C++库为android系统提供特性支持,如SQLite提供数据库支持,OpenGL|ES库提供3D绘画的支持,WebKit库提供浏览器内核支持。
3、应用架构层
这一层主要提供构建应用程序需要的各种API接口,Android自带的一些核心应用都是使用这些api完成和实现的,当然,开发者也可以通过这些api构建自己的应用程序。
4、应用开发层
所有安装在手机上的应用程序都是属于这一层,比如系统自带的联系人,短信,我们自己开发程序。
2、安卓已发布的版本
2008年9月 发布1.0版本,随后以惊人的速度发布2.1,2.2,2.3
2011年2月 发布3.0系统
2011年10月 发布4.0系统
2014年 Google io大会发布5.0系统,其中使用art代替dalvik虚拟机,同时还退出android Tv,android Auto,android Wear
2015年 google IO大会推出6.0系统,同时加入运行时权限。
2016年 Google大会推出7.0系统,加入窗口模式功能
2017年 推出8.0系统
3、Android应用开发特色
1、四大组件
Activity,Service,Broadcast Receiver 和 Content Provider。
2.丰富的系统控件
3.SQLite数据库
4、强大的多媒体
5、地理位置定位
4、项目目录结构
1、.gradle和.idea : Anroid studio自动生成的文件,我们一般无需关心,也不用手动编辑
2、app :项目中的代码、资源等内容几乎都放置在此目录下,我们的开发工作也都是在这个目录进行的
3、gradle :这个目录包含gradle wrapper的配置文件,使用gradle wrapper的方式不用提前将gradle下载好,而是自动根据本地的缓存情况决定是否需要联网下载gradle,
4、.gitigore :这个文件指定目录或文件排除在版本控制之外
5、build :包含编译时自动生成的文件
6、build.gradle : 这个项目全局的gradle构建脚本,
7、gradle.properties :这是全局gradle配置文件,这里配置的属性将会影响到项目中所有的gradle编译脚本
8、gradlew/gradlew.bat :这两个文件用来在执行界面执行gradle命令的,gradlew是在linux系统或max系统,gradlew.bat是在window系统中使用
9、.iml : iml文件是所有IntelliJ IDEA项目自动生成的文件,android是基于Intellij IDEA开发的,
10、local.properties : 这个文件指定sdk路径,通常内容是自动生成的,我们不需要修改,除非adk目录发生变化。
11、settings.gradle :这个文件用于指定项目中所有引入的模块。
下面我们来对app目录下的内容进行详细分析:
1、build :这个目录和外层的build目录类似,主要包含编译时自动生成的文件,
2、libs : 如果你的项目中使用了第三方jar包,就需要把这些jar包放在libs目录下,这个这个目录下的jar都会自动添加到构建路径中去
3、androidTest : 此处用来编写Android Test测试用例的,可以对项目进行自动化测试。
4、java :java目录放置我们所有的java代码,
5、res :里面包含项目中使用的图片,布局,字符串等资源,当然这目录下还有很多子目录,drawable目录放图片,layout目录放布局文件,values放字符串
6、AndroidManifest.xml :这是整个项目的配置文件,你程序中所有的四大组件的注册都是放在这个文件中,另外还可以在文件中给应用声明权限
7、test : 用来编写Unit test测试用例的。
8、app.iml :和外面的iml一样
9、build.gradle : app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置
10、proguard-rules.pro : 这个文件用于指定代码的混淆
5、项目分析
之前我们讲过四大组件中的Activity就是应用的门面,所有我们能够看见的画面都是显示 在Activity中,所以我们所有的页面都是继承Activity,使用Activity必须在AndroidManifest.xml中进行注册,注册方式如下:
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
我们可以看到,注册使用activity标签,属性名指定我们Activity的名字,其中Intetn-filter里面的代码非常重要,<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />代表项目的主活动,我们点击桌面启动的活动首先启动的就是这个活动。
mipmap和drawable目录都是存放图标资源,同一张图标可以提供不同的分辨率存放在不同文件下,这样可以适配不同的手机。
res/string.xml文件存在字符串,内容如下:
<resources>
<string name="app_name">MaterialDesign</string>
<string name="title_activity_navigation_drawer">NavigationDrawerActivity</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="action_settings">Settings</string>
</resources>
在xml中通过@string/app_name获取字符串的应用。
在java代码中通过R.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>
项目的图标通过android:icon属性指定,应用名称通过android:label
详解build.gradle文件
不同于Elipse,Android Studio是采用gradle来构建项目的,gradle是非常先进的项目构建工具,它使用一种基于groovy的领域特定的语言(DSL)来声明项目设置。摒弃了传统基于XML(如Ant和Maven)的各种繁琐的配置。
我们前面讲了build.gradle文件,一个是最外层,一个是APP目录下的,这两个文件对构建android项目起到了至关重要的作用,下面我们来对这两个文件进行分析:
先来看最外层目录下的build.gradle文件,代码如下所示:
uildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这些代码都是自动生成的,虽然语法看上去很难理解,首先,两处repositories的闭包都声明了jcenter这行配置,其实它是一个代码管理仓库,很多android开源项目都会选择托管到jcenter,声明这行,我们就可以轻松引用任何jcenter上的开源项目。
接下来,dependencies闭包使用的classpath声明了一个Gradle插件,为什么声明这个插件,因为gradle并不是专门为构建Android项目而开发的,java c++等很多项目都可以使用gradle来构建,因此如果我们需要构建android项目,就需要声明这个插件,这样我们就将最外层目录下的build.gradlef分析完了,通常情况下不需要修改,除非你想添加全局配置。
下面我们再来看看APP目录下的build.gradle文件,代码如下所示:
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
applicationId "com.richard.materialdesign"
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
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:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.android.support:design:26.+'
compile 'de.hdodenhof:circleimageview:2.1.0'
compile 'com.android.support:recyclerview-v7:26.+'
compile 'com.android.support:cardview-v7:26.+'
compile 'com.github.bumptech.glide:glide:3.7.0'
testCompile 'junit:junit:4.12'
}
下面我们进行分析:首先第一行应用了一个插件,一般有两种值可选,com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块。他们之间最大的区别在于,一个可以直接运行,一个只能作为代码依附于别的应用程序模块来运行。
接下来android闭包,这个闭包我们可以配置项目构建的各种属性,启动compileSdkVersion用于指定编译版本,buidlToolsVersion用于指定项目构建工具的版本,
然后android闭包中有嵌套了一个defaultConfig闭包,这个闭包可以对项目更多细节的配置,其中applicationId用于指定项目的包名,前面我们已经指定过包名,如果想在后面修改,那么就可以在这里修改。minSdkVersion用于指定项目最低兼容的Android系统版本,这里兼容15表示android4.0系统,targetSdkVersion指定表示你在该目标版本上已经经过充分测试,系统将会为你的应用程序启用一些新特性,剩下的两个属性比较简单,versionCode指定项目版本号,versionName指定项目的版本名。
接下来我们看下buildType闭包。buildType闭包用于指定安装文件的相关配置,通常只有两个子闭包,一个debug,一个release、debug闭包指定生成测试版安装文件的配置,release闭包用于指定生成正式版安装文件的配置,debug闭包可以不写,因此我们看到只有一个release闭包,release闭包中有一个minifyEnabled用于指定是否对项目的代码进行混淆,tru表示混淆,false表示不混淆,proguardFiles用于指定混淆是使用的规则文件,这个指定了两个文件,第一个proguard-android.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则,第二个proguard-rules.pro是在当前目录的根目录下的,里面可以根据需求编写当前项目特定的混淆规则。
接下来dependencies闭包,这个闭包的功能非常强大,它可以指定当前项目的依赖关系,通常有3中依赖关系:本地依赖,库依赖,远程依赖。本地依赖一般通过jar或目录添加依赖,库依赖可以对项目中的库模块添加依赖,远程依赖可以对jcenter库上的开源项目依赖,第一行compile fileTree就是一个本地依赖声明,它表示当前libs目录下所有.jar结尾的文件添加到项目的构建领中,第二行compile则是远程依赖,'com.android.support:appcompat-v7:26.+'这是一个标准的远程依赖库格式,com.android.support是域名,用于和其他公司区分;appcompat-v7是组名称,用于和同一个公司不同的库区分,26是版本号,用于和同一个库不同版本作区分,加上这句声明后,gradle在构建项目时会检查本地是否已经有这个缓存,如果没有就联网下载,然后添加到构建路径中,至于库依赖格式compile project(":helper")这种形式声明即可,helper为库名称。