由于前段时间使用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是不行的,还得有JDKAndroid 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文件

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.0'
}
}
allprojects {
repositories {
jcenter()
}
}

这些代码都是自动生成的,我们发现在两个闭包中都声明了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文件

apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.1"
defaultConfig {
applicationId "com.guiyongdong.listviewdemo"
minSdkVersion 15
targetSdkVersion 25
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:25.0.1'
compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4'
compile 'com.android.support:recyclerview-v7:25.0.1'
testCompile 'junit:junit:4.12'
}

咋一看,这个文件好复杂啊,别急,我们一行一行的看。

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闭包用于指定生成安装文件的相关配置,通常他包含两个子包:releasedebug。一个表示生成环境,一个表示测试环境,debug默认可以不写。我们看看release包下的具体内容

minifyEnabled: 用于指定是否对代码进行混淆
proguardFiles: 混淆时使用的文件

我们再来看看dependencies包,它表示当前项目所有的依赖关系,通常Android Studio项目一共有3种依赖方式:本地依赖库依赖远程依赖。本地依赖就是jar包依赖,库依赖是在项目中添加模块,远程依赖是对jcenter库上开源项目的依赖。

compile fileTree: 它就是一个本地依赖声明,表示将libs目录下的所有的.jar后缀的文件都添加到构建路径中去。

compile: 这个则是远程依赖,

还有一种库依赖,写法为compile project(':helper'),它表示添加一个名叫helper库的依赖,当然,前提是这个库已经添加到你的项目中。

关于build.gradle的配置还有很多,我想在以后项目复杂了,会遇到的。