第一行代码 第一章

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/naruto_ping/article/details/73478074

一、Android 系统架构

大概了解Android系统架构主要分四层
1、Linux内核层
    这层主要提供Android设备的各种硬件驱动,如蓝牙、WiFi等。

2、系统运行库层
    这层主要提供了对Android系统的特性支持,如webkit库提供了浏览器内核的支持、SQLite库提供了对数据库的支持等。同时这层还提供了Android运行时库,包含了Dalvik虚拟机。

3、应用框架层
    这层主要提供了构建应用程序时用到的各种API。

4、应用层
    这层就是我们开发的应用程序。

扩展:Dalvik虚拟机和Java虚拟机,以及在Android5.0系统以后的版本使用的ART运行环境的区别。
百度下,有各种专业又详细的说明。大概了解一下,
Java程序经过编译,生成Java字节码,保存在.class文件中。
Java虚拟机是基于栈,通过解码class文件来运行程序。对平台依赖性很小。
而dalvik虚拟机是基于寄存器,运行的是dalvik字节码。dalvik字节码是通过Java字节码转换而成,并将它打包到dex可执行文件中。dalvik虚拟机通过解释dex文件来运行。在执行效率上,比Java虚拟机要快。
ART采用AOT编译模式(即预编译模式,应用在第一次安装时,字节码已经编译成机器码,执行时直接运行机器码),相比dalvik采用的AIT模式(即即时编译模式,应用每次运行时,都要通过将字节码转为机器码,再运行机器码),在运行效率上比dalvik要快,同时还能减少CPU的使用频率,提升系统性能和续航能力等。
简而言之,
1、Java虚拟机基于栈,对平台依赖性很小,但是执行效率不高。
2、dalvik虚拟机基于寄存器,执行效率高,但对平台有一定的依赖性。
3、ART运行环境应用启动速度和运行流畅度高,但是占用空间大,且第一次安装时间长。


二、Android版本发布
1、2008年,发布Android 1.0
2、2011年,发布Android 3.0(专门为平板电脑设计)
3、2011年,发布Android 4.0
4、2014年,发布Android 5.0
5、2015年,发布Android 6.0
6、2016年,发布Android 7.0

大概了解一下,各个版本的特性
4.0版本:
1、人脸识别解锁
2、全景相片
3、转场动画

4.4版本:
1、GPU加速
2、透明系统UI
3、全屏沉浸模式

5.0版本:
1、使用ART运行环境替换dalvik虚拟机
2、提出Material Design来优化应用的UI设计
3、支持Android NDK 64位

6.0版本:
1、运行时请求权限
2、支持文本选择
3、取消支持Apache HTTP客户端

7.0版本:
1、多窗口模式功能
2、画中画功能
3、通知栏快捷回复
4、支持VR

三、开发环境搭建
到Android官网下载最新的开发工具(android studio)。下载下来的安装包,一路点击next即可。
初次启动AS(Android Studio),会显示配置界面,选择standard,继续点击next直到finish。然后AS会自动下载更新。更新完毕,点击finish就会进入AS的欢迎界面。

四、创建Android项目
启动AS,选择start a new android studio project选项,在弹出的界面中,
Application name:表示应用程序的名称;
Company name:表示公司域名(个人开发可以随便写);
Package name:表示项目的包名。必须保证它是唯一的,因为Android系统是通过包名来区分不同的应用程序;
Project location:表示项目代码存放的位置。
填完相关信息后,点击next,弹出最低兼容版本设置界面;再点击next,选择创建活动界面模板;再点击next,显示主活动的名称和布局命名,勾选界面中的两项。然后单击finish。

五、Android项目目录分析
1、.gradle和.idea文件夹
这两个隐藏文件由AS自动生成,无须关心,也不要去修改。
2、app文件夹
项目中的代码、资源文件,后续的开发工作都在这个目录下进行。
3、build文件夹
无须关心,主要包含一些在编译时自动生成的文件。
4、gradle文件夹
这个目录包含了gradle wrapper的配置文件。使用gradle wrapper方式,AS会自动下载gradle最新版本。AS默认没有开启,如需打开,可在file->settings->build,execution,deployment->gradle,进行配置更改。
5、.gitignore文件
这个文件用来将指定的目录或者文件排除在版本控制之外。
6、build.gradle文件
这个文件是全局的gradle构建脚本,通常不需要修改。
7、gradle.properties文件
这个文件是全局的gradle配置文件,这里配置的属性会影响到项目中所有的gradle编译脚本。
8、gradlew和gradlew.bat文件
这两个文件是用来在命令行界面中执行gradle命令的。其中gradlew是在Linux系统中使用,gradlew.bat是在Windows系统中使用的。
9、后缀为iml的文件
项目自动生成,作为标识符,标识这个项目是IntelliJ IDEA项目(AS是基于IntelliJ IDEA开发的),无须修改。
10、local.properties文件
这个文件用来指定本机中的Android SDK路径,通常内容都是自动生成的,无须修改。
11、settings.gradle文件
这个文件用来指定项目中所有引入的模块。通常情况,无须修改。

从上面分析的情况来看,主要是对app文件夹的修改
app文件夹目录分析:
1、build文件夹
无须关心,主要包含一些在编译时自动生成的文件。
2、libs文件夹
如果项目中使用了第三方的jar包,就需要把这些jar包都放在libs目录下。放在该目录下的jar包都会被自动添加到构建路径里去。
3、androidTest文件夹
主要用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
4、java文件夹
存放java代码。
5、res文件夹
存放资源文件,如图片、字符串、布局等。
6、AndroidManifest.xml文件
整个Android项目的配置文件。
7、test文件夹
用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
8、.gitignore文件
这个文件用来将app模块内的指定的目录或者文件排除在版本控制之外。
9、app.iml文件
项目自动生成,作为标识符,标识这个项目是IntelliJ IDEA项目(AS是基于IntelliJ IDEA开发的),无须修改。
10、build.gradle文件
app模块内的gradle构建脚本。
11、proguard-rules.pro文件
用于指定项目代码的混淆规则。

res文件夹详解
所有以drawable开头的文件夹都是用来存放图片的;
所有以mipmap开头的文件夹都是用来存放应用图标的;
所有以valuesk开头的文件夹都是用来存放字符串、样式、颜色等配置的;
layout文件夹用来存放布局文件的。

建立多个以drawable开头的文件夹,主要是为了让程序能够更好地兼容各种设备,当程序运行时,会根据当前运行设备的分辨率自动选择加载哪个文件夹下的图片。

build.gradle文件解析
项目中一般会有两个build.gradle文件,一个在项目工程目录,另一个在app目录下。项目工程目录中的build.gradle一般情况下不需要修改;所以主要看app目录下的。

通过AS直接运行项目生成的apk文件都是测试版安装文件

app目录下的build.gradle文件内容:
// apply plugin: 'com.android.library' // 表示库模块
apply plugin: 'com.android.application' // 这句话表示应用程序模块
/*
    库模块和应用程序模块的区别:
    应用程序模块可以直接运行;而库模块只能作为代码库依赖于别的应用程序模块来运行
*/
android {
    compileSdkVersion 25 // 25表示使用Android7.1系统的SDK编译
    buildToolsVersion "25.0.1" // 项目构建工具的版本
    defaultConfig {
        applicationId "com.sky.activitytest" // 项目的包名
        minSdkVersion 15 // 项目最低兼容的Android系统版本
        targetSdkVersion 25 // 项目在此Android系统版本上做测试
        versionCode 1 // 项目的版本号
        versionName "1.0" // 项目的版本名
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    /*
        buildTypes 闭包用于指定生成安装文件的相关配置。
        通常只会有两个子闭包;一个是dubug闭包,另一个是release闭包。 
        debug闭包可以忽略不写,主要用于指定生成测试版安装文件的配置;
        release闭包用于生成正式版安装文件的配置。
        minifyEnabled 用于指定是否对项目的代码进行混淆。
        false表示不混淆;true表示混淆。
        proguardFiles 用于指定混淆时使用的规则文件。
        proguard-android.txt 是在Android SDK目录下的,是所有项目通用的混淆规则;
        proguard-rules.pro 是在当前项目的根目录下,编写当前项目使用的特殊混淆规则。
    */
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
/*
    dependencies闭包分析
    通常AS项目有3种依赖方式:本地依赖、库依赖、远程依赖。
    本地依赖:可以对本地的jar包或者目录添加依赖关系。compile fileTree就是本地依赖的声明,它表示将libs目录下的所有以.jar为后缀的文件都添加到项目的构建路径中。

    远程依赖:可以对jcenter库上的开源项目添加依赖关系。compile 就是远程依赖的声明。其格式由域名部分:组件名称:版本号,这三个部分组成。

    库依赖:可以对项目中的库模块添加依赖关系。其基本格式是compile project (':库名称')。如有一个库的名称为helper,声明库依赖方式则可写为:compile project(':helper')

    testCompile 是用于声明测试用例库的。
*/
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:25.0.1'
    testCompile 'junit:junit:4.12'
}

扩展小知识
raw目录和assets目录
http://blog.csdn.net/fingding/article/details/46791755这篇文章有详细说明。
共同点:它们里面的文件会被原封不动的拷贝到APK中,而不会像其它资源文件那样被编译成二进制的形式
区别:
raw是Resources (res)的子目录,Android会自动的为这目录中的所有资源文件生成一个ID,这个ID会被存储在R类当中,作为一个文件的引用。这意味着这个资源 文件可以很容易的被Android的类和方法访问到,甚至在Android XML文件中你也可以@raw/的形式引用到它。在Android中,使用ID是访问一个文件最快捷的方式。MP3和Ogg文件放在这个目录下是比较合适 的。

assets目录更像一个附录类型的目录,Android不会为这个目录中的文件生成ID并保存在R类当中,因此它与 Android中的一些类和方法兼容度更低。同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目 录下会使一些操作更加方便,比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在Android XML文件中引用到assets目录下的文件,只能通过AssetManager来访问这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。

六、Log与System.out.println()区别
都可以打印日志信息。但是使用Log打印有以下优点:
可显示时间、可添加过滤器、可区分日志级别

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页