《第一行代码》笔记——第1章 开始启程—你的第一行Android代码
第1章 开始启程——你的第一行Android代码
《第一行代码》的第一章,讲解内容主要包括:Android简介(发展历史、系统架构)、Android Studio的简单用法、Android项目结构的分析、Log的使用等。下面仅对我个人的知识掌握情况做相关记录。
Android系统架构
Android大致分为四层架构:Linux内核层、系统运行库层、应用框架层和应用层。
- Linux内核层:Android系统是基于Linux内核的,这一层为Android设备的各个硬件提供了底层的驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。
- 系统运行库层:这一层通过一些C/C++库来为Android系统提供了主要的特性支持。如SQLite库提供了数据库的支持,OpenGL|ES库提供了3D绘图的支持,WebKit库提供了浏览器内核的支持。这一层还有Android运行时库,它主要包括了一些核心库,能够允许开发者使用Java语言来编写Android应用。另外,Android运行时库中还包含了Dalvik虚拟机(5.0系统之后改为ART运行环境),它使得每一个Android应用都能运行在独立的进程当中,并且拥有一个自己的Dalvik虚拟机实例。相较于Java虚拟机,Dalvik是专门为移动设备定制的,它针对于手机内存、CPU性能有限等情况做了优化处理。
- 应用框架层:这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,开发者也可以通过使用这些API来构建自己的应用程序的。
- 应用层:所有安装在手机的应用程序都是属于这一层的,比如系统自带的联系人,短信等程序,包括自己开发的程序。
Android版本
版本号 系统代号 API 市场占有率 2.2 Froyo 8 0.1% 2.3.3~2.3.7 Gingerbread 10 1.5% 4.0.3~4.0.4 Ice Cream Sandwich 15 1.3% 4.1.x
4.2.x
4.3
Jelly Bean16
17
185.6%
7.7%
2.3%4.4 KitKat 19 27.7% 5.0
5.1Lollipop 21
2213.1%
21.9%6.0 Marshmallow 23 18.7% 7.0 Nougat 24 0.1% 查看最新的数据可以访问http://developer.android.google.cn/about/dashboards/
从上表中可以看出,目前4.0以上的系统占据了超过98%的Android市场份额。
分析项目结构
project项目结构模式下:
外侧目录:
- app:项目中的代码、资源等内容几乎都是放在这个目录下。
- gradle: 这个目录下包含gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。
- .gitignore:这个文件是用来将指定的目录或文件排除在版本控制之外的。
- build.gradle:这是项目全局的gradle构建脚本(构建gradle用的?)。
- gradle.properties:这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
- gradlew和gradlew.bat:这两个文件是用来在命令行界面中执行gradle命令的。gradlew是在Linux和Mac系统中使用的,gradlew.bat是在Windows系统中使用的。
- local.properties:这个文件用于指定本机中的Android SDK路径。
- setting.gradle:这个文件用于指定项目中所有引入的模块。app目录下:
- build:这个目录和外层的build目录类似,主要也是包括了一些在编译时自动生成的文件。
- libs:第三方jar包存放的目录,放在这个目录下的jar包都会被自动添加到构建路径里去。
- androidTest:此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
- java:放置所有Java代码的目录
- res:各类资源存放的目录
- AndroidManifest.xml:整个Android项目的配置文件,程序中定义的所有四大组件需要在这个文件里注册,还可以在这个文件中给应用程序添加权限声明。
- .gitignore:这个文件用于将app模块内的指定的目录和文件排除在版本控制之外。
- build.gradle:这是app模块的gradle构建脚本(构建Gradle用的?),这个文件中会指定很多项目构建相关的配置。
- proguard-rules.pro:这个文件用于指定项目代码的混淆规则。
详解build.gradle文件
Android Studio是采用Gradle来构建项目的。Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目设置。
外层目录下的build.gradle文件:
buildscript{ repositories{ jcenter() } dependencies{ classpath 'com.android.tools.build:gradle:2.2.0' } } allprojects { repositories { jcenter() }
- jcenter是一个代码托管仓库,很多Android开源项目都会选择将代码托管到jcenter上,声明了这行配置之后,我们就可以在项目中轻松引用任何jcenter上的开源项目了。
- dependencies闭包中使用classpath声明了一个Gradle插件。Gradle并不是专门为构建Android项目,则需要声明com.android.tools.build:gradle:2.2.0这个插件。
app目录下的build.gradle文件:
apply plugin:'com.android.application' //应用了一个插件,有两种值可选:com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块。 android{ compileSdkVersion 24 //项目的编译版本,这里24表示使用Android 7.0系统的SDK编译 buildToolsVersion "24.0.2" //指定项目构建工具的版本 defaultConfig{ applicationId "com.example.helloworld" //指定项目的包名 minSdkVersion 15 //指定项目最低兼容的Android系统版本,这里最低兼容到Android 4.0系统 targetSdkVersion 24 //指定的值表示你在该目标版本上已经做过充分的测试,系统将会为你的应用程序启动一些最新的功能和特性。如果23或更高,那么系统会为你的程序启动运行时权限功能。 versionCode 1 //指定项目的版本号 versionName "1.0" //指定项目的版本名 } //buildTypes闭包中用于指定生成安装文件的相关配置,通常有两个自闭包debug/release buildTypes{ release{ //release闭包用于指定生成正式版安装文件的配置,debug为测试版 miniflyEnabled false //指定是否对项目的代码进行混淆 proguardFiles getDefaultProguardFilse('proguard-android.txt'),'proguard-rules.pro'//指定混淆时使用的规则文件,第一个在Android SDK目录下,第二个是当前项目的根目录下的 //注:Android Studio直接运行项目生成的都是测试版安装文件 } } } //dependencies闭包指定当前项目所有的依赖关系。 //依赖方式:本地依赖、库依赖和远程依赖 //本地依赖:可以对本地的Jar包或目录添加依赖关系 //库依赖:可以对项目中的库模块添加依赖关系 基本格式:compile project(':helper') //远程依赖:可以对jcenter库上的开源项目添加依赖关系 dependencies{ compile fileTree(dir: 'libs',include: ['*.jar']) //本地依赖,表示将libs目录下的所有.jar后缀的文件都添加到项目的构建路径当中 compile 'com.android.support:appcompat-v7:24.2.1' //远程依赖声明,其中com.android.support是域名部分,用于和其他公司的库作区分; //appcompat-v7是组名称,用于和同一公司中不同的库做区分;24.2.1是版本号,用于和同一个库的不同版本做区分 testCompile 'junit:junit:4.12' //用于声明测试用例库 }
使用日志工具Log
- 在onCreate()方法的外面输入logt,然后按下Tab键,这是就会以当前类名作为值自动生成一个TAG常量。
碎片整理:
- AppCompatActivity:这是一种向下兼容的Activity,可以将在各个系统版本中增加的特性和功能最低兼容到Android2.1系统
小结
通过第一章的学习,在原有的基础上,让我对Android系统架构、项目结构(build.gradle等)和Log的使用更加深入的了解,还要继续努力,有很多细节的知识需要掌握。下面的章节会随着学习持续更新。。。