一天一Android之Android系统初窥
由于前段时间使用ReactNative开发过一个项目,在开发的过程中,会使用到大量的非ReactNative提供的组件和功能。这时候就必须写原生桥接,iOS还好说,毕竟是靠这个吃饭的,可是android就捉襟见肘了。为了向大前端的目标更进一步,我计划开始学习android,为期6个月,我的目标是6个月内起码自己公司的android项目可以上手,当然,如果想成为真正的android开发者,光靠这6个月是不行。还需要大量的实际项目才能锻炼。
值得庆幸的是我在大学主攻的就是java(哈哈,现在也基本上忘的差不多了)。为了打好基础,我买了两本书,一本是《java编程思想》,一本是京东上销量很好的《第二行代码Android》,希望这两本书能够帮到我。另外我也会专门开一个专栏,讲解我学习java的过程。可能在接下来的博客中,我总结的都是基础知识,大神莫嘲笑。
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虚拟机实例。
应用框架层
这一层主要提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是使用这些API完成的,我们也是通过这些API来完成我们的应用。
应用层
普通用户主要就是和这一层打交道,我们自己开发的应用都是属于这一层的,当然,系统自带的应用也是这一层的。
系统架构图:
Android版本
可能现在应用最低的适配都是从4.0版本开始,目前最高版本是7.1.1,而且谷歌对Android版本的命名都是以甜点命名的。什么牛轧糖、棒棒糖。
IDE
在我没接触Android之前,我的同学都是使用MyEclipse开发的,至于是如何开发的,我不知道,因为当我开始学Android的时候,已经普及了另一个开发工具:Android Studio。当然,只有IDE是不行的,还得有JDK、Android SDK。
如果使用Android Studio,你也可以使用studio自带的工具进行下载各个版本的SDK。如图:
当然,SDK的目录你可以随便选。
项目目录
至于该如何创建项目,我就不说了。创建完项目以后切换到Project模式下,就是项目的真实目录了。
下面来看看这些目录或者文件都是干什么的:
.gradle和.idea
这两个目录下放置的都是Android Studio自动生成的一些文件,我们无须关心,也不要去编辑。
app
这个目录才是我们以后经常使用和编辑的,一会再说它。
build
这个目录也不需要关心,它主要包含了一些在编译时自动生成的文件。
gradle
这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启动gradle wrapper的方式,如果需要打开,可以点击 File->Other Settings->Build,Execution,Deployment->Build Tools->Gradle 进行配置。
.gitignore
设置git忽略哪些文件
build.gradle
这个文件时全局的gradle构建脚本,通常这个文件中的内容是不需要修改的,我只知道gradle是构建工具,至于gradle更多的信息,我还得再研究一下。
gradle.properties
这个文件时全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
gradlew和gradlew.bat
这两个文件时用来在命令行界面中执行gradle命令的,其中gradlew是在Linux或Mac系统中使用,gradlew.bat是在Windows系统中使用的。
ListViewDemo.iml
这个文件的名字和我们的项目名字是一样的,不固定。一般不用动。
local.properties
这个文件用于指定Android SDK路径,一般我们不动,除非你的SDK本地路径改变了。
settings.gradle
这个文件用于指定项目中所引入的模块,因为当前项目就一个模块:app,在以后可能我们还会引入其他模块,一般IDE帮我们自动导入。
app
看了整个工程的目录,感觉有用的不是很多,好多都是和gradle或者配置有关。其实,真正需要我们关心的只有app这个目录。
build
这个目录和外层的build目录类似,主要也是包含了一些在编译时生成的文件,不过它里面的内容更复杂,也不需要管。
libs
如果项目中使用到了第三方的jar包,就需要把这些jar包都放在libs录下,放在这个目录下的jar包都会被自动添加到构建路径中去。
androidTest
这个一看就是用来编写测试用例的,一些小公司可能也不写测试代码的。
java
毫无疑问,java目录是放置我们所有java代码的地方,以后所有的代码都在里面。
res
这个目录下的内容比较多,简单所,就是放各种资源的,图片,布局,字符串等资源。图片放到drawable文件下,布局放置layout下,字符串放在values下。
AndroidMainfest.xml
这个文件很重要,是整个Android的配置文件,包括程序中使用到的所有四大组件都需要在这个文件注册,另外还有权限声明等。
test
它是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
.gitignore
忽略文件
app.iml
不需要关心
build.gradle
这个文件也很重要,是app模块的gradle构建脚本,里面会有好多的配置,以后研究到了再说。
proguard-rules.pro
代码混淆规则,主要混淆代码,放在人家破解你的项目。
好了, android项目的大概工程目录就是这样,其实我们会发现,重要的没几个,而且重要的好多都和gradle有关,看来真得好好研究下gradle是什么了。
build.gradle文件
在整个项目中,一共有连个build.gradle文件。我们先来看看最外层的build.gradle文件
|
这些代码都是自动生成的,我们发现在两个闭包中都声明了jcenter()
,它是一个代码托管仓库,很多android开源项目都会托管到jcenter上。只要声明它,就可以引用jcenter上的托管的项目。
在dependencies
闭包中,还声明了classpath
,这个主要是声明gradle插件的,因为gradle不仅仅为android工作,还为java等项目工作,所有我们要声明使用哪个包中的gradle工具。例如我们声明了com.android.tools.build:gradle:2.3.0
,2.3.0是此插件的版本号。
再来看看app下的build.gradle
文件
|
咋一看,这个文件好复杂啊,别急,我们一行一行的看。
com.android.application
表示这是一个应用程序模块,com.android.library
表示这是一个库模块,他俩最大的区别就是,一个可以直接运行,一个只能作为代码库依附于别的应用程序模块来运行。
接下来是一个大的android闭包,我们看看它都代表什么。
compileSdkVersion
: 用于指定项目的编译版本,我们这里指定25,表示使用Android 7.1.1来编译,如果你不知道具体使用哪个版本来编译,你可以直接看此文章的第一张图,或者你也可以在Android Studio->Preferences 直接搜索Android SDK 来查看版本情况。
buildToolsVersion
: 用来指定项目构建工具的版本,如果有新版本时,Android Studio会进行提升。
applicationId
: 当前项目的包名
minSdkVersion
: 最低支持的Android系统版本
targetSdkVersion
: 这个表示你在该目标版本上已经做过充分的测试,系统将会为你的应用程序启用一些最新的功能和特性,比如你设置成23或者更高,系统会为你的应用程序启用运行时权限,如果你设置成22,那么Android 6.0的功能你就用不了。
versionCode
: 当前版本号
versionName
: 当前项目的版本名
testInstrumentationRunner
: 测试的一些东西
我们再来看看buildTypes
闭包,buildTypes闭包用于指定生成安装文件的相关配置,通常他包含两个子包:release
和debug
。一个表示生成环境,一个表示测试环境,debug默认可以不写。我们看看release
包下的具体内容
minifyEnabled
: 用于指定是否对代码进行混淆proguardFiles
: 混淆时使用的文件
我们再来看看dependencies
包,它表示当前项目所有的依赖关系,通常Android Studio项目一共有3种依赖方式:本地依赖、库依赖、远程依赖。本地依赖就是jar包依赖,库依赖是在项目中添加模块,远程依赖是对jcenter库上开源项目的依赖。
compile fileTree
: 它就是一个本地依赖声明,表示将libs目录下的所有的.jar后缀的文件都添加到构建路径中去。
compile
: 这个则是远程依赖,
还有一种库依赖,写法为compile project(':helper')
,它表示添加一个名叫helper库的依赖,当然,前提是这个库已经添加到你的项目中。
关于build.gradle的配置还有很多,我想在以后项目复杂了,会遇到的。