Android 系统架构(第一行代码笔记)

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为库名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值