1、android系统架构
android的系统结构一共可以分为四个,分别为:Linux内核层、系统运行库层、应用框架层和应用层
1.1 Linux内核层
Android系统是基于Linux内核的,这一层为Android设备的底层提供各种的驱动。
1.2 系统运行库层
这一层通过C/C++库为Android系统提供主要的性能支持。例如Webkit库提供了浏览器内核的支持。
同样这一层还包含了Android运行时库,它主要是提供了一些核心库,能够允许开发者用Java语言来开发Android应用。另外,Android运行时库,还包含了Dalvik虚拟机(5.0系统之后改为ART允许环境),它使得每个Android应用都能运行在独立的进程当中,并拥有一个独立的Dalvik虚拟机实例。
1.3 应用框架层
这一层提供了构建应用程序时可能用到的各种API,Android自带的一些核心应用就是利用这些API完成的。
1.4 应用层
所有安装在Android手机上的程序都是属于这一层的,例如手机自带的联系人以及包括我们自己开发的程序。
一图胜千言,如下图所示:
2、android studio的项目结构解析
2.1 android studio整体项目结构解析
2.1.1 .gradle和.idea
Android studio 自动生成的文件。
2.1.2 app
项目中的资源和代码都放在该目录下面。
2.1.3 gradle
此目录包含了gradle wrapper的配置文件。使用gradle wrapper,可以在没有安装gradle的电脑中编译程序。如果电脑中已经存在编译此项目的gradle,会直接进行编译,如果没有,Android Studio会自动下载,但是这个时候速度会特别的慢。可以直接结束掉整个Android Studio进程,进行手动下载。具体的下载方式参考:http://www.jianshu.com/p/e1c0b46e317c
关于Gradle Wrapper的解释参考: https://as.quanke.name/gradle-wrapper.html
2.1.4 .gitignore
将制定的目录和文件排除在版本控制的范围之外
2.1.5 build.gradle
项目全局的gradle构建版本
2.1.6 gradle.properties
项目全局的gradle配置文件
2.1.7 gradlew
用命令行的方式执行gradle命令。这个是运行在Mac和Linux系统中的
2.1.8 gradlew.bat
用命令行的方式执行gradle命令。这个是运行在Windows系统中的
2.1.9 local.properties
指定本机中的Android sdk地址
2.1.10 settings.gradle
指定项目中所有引入的模块
2.2 android studio app目录结构解析
2.2.1 build
编译时自动生成的文件,可以不用管
2.2.2 libs
包含了所有的第三方jar包
2.2.3 androidTest
自动化测试程序应该放的地方
2.2.4 main
包含所有的代码和资源文件
2.2.5 AndroidManifest.xml
android的四大组件注册以及权限申明
2.2.6 test
编写Unit Test测试用例
2.2.7 .gitignore
将app目录中指定的文件排除在版本控制的范围之外
2.2.8 app.iml
IntelliJ IDEA项目自动生成的文件.
(IntelliJ IDEA是一种商业化销售的Java集成开发环境(Integrated Development Environment,IDE)工具软件,由JetBrains软件公司(前称为IntelliJ)发展,提供Apache 2.0开放式授权的社区版本以及专有软件的商业版本,开发者可选择其所需来下载使用。2014年12月,Google宣布其旗下专用于发展Android操作系统的首版Android Studio,即基于IntelliJ IDEA的社区版本发展而成[6],用以取代原来提供Android开发者使用的Eclipse ADT。开发者除了可直接下载Android Studio外,原IntelliJ用户亦可下载其相关插件来进行开发程序。)
参考地址:https://zh.wikipedia.org/wiki/IntelliJ_IDEA
2.2.9 build.gradle
app模块的gradle构建脚本
2.2.10 proguard-rules.pro
指定程序中代码混淆的规则
3、build.gradle文件的解析
3.1 全局build.gradle文件的解析
3.1.1 repositories与jcenter
这两个都是版本控制的的工具
3.1.2 dependencies中的gradle
定义的项目依赖gradle来编译,并定义了gradle的具体的版本
3.2 app目录下的build.gradle文件解析
3.2.1 apply plugin
这一行一般会有两个值,一个是com.android.application,另一个是com.android.library。前者标志这这个项目是个可以单独运行的项目,后者标志这个项目是其他程序的代码库
3.2.2 compileSdkVersion
指定这个项目的编译版本
3.2.3 applicationId
指定项目的包名
3.2.4 minSdkVersion
指定项目最低兼容的android系统版本
3.2.5 targetSdkVersion
这个值是一个android系统版本,表示在该系统版本上面已经做了充分的测试,可以正常运行。
3.2.6 versionCode和versionName
这个表示项目的版本号和版本命。这个在项目升级的时候会用到。
3.2.7 buildTypes
buildTypes闭包中用于指定代码混淆的相关配置,主要包含两个子闭包,分别为debug和release。debug用于生成测试版的时候,所需要用到的代码混淆。release则是定义生成正式版的时候所需要的代码混淆。
3.2.8 minifyEnabled
值为true和false,true代表混淆,false代表不混淆。
3.2.9 proguardFiles
指定代码混淆的规则。其中proguard-android.txt是在Android SDK目录下,其中包含了项目通用的代码混淆。proguard-rules.pro这个文件在app目录下,包含了当前特有的代码混淆规则。
3.2.10 dependencies
dependencies闭包,主要是指定项目的依赖关系。
项目中依赖关系可以分为三种:本地依赖,库依赖和远程依赖。
本地依赖:可以对本地的jar包和目录添加依赖关系。例如:implementation fileTree(dir: 'libs', include: ['*.jar']).这个就表示将libs目录下的所有的jar文件添加到项目的构建路径中去
库依赖:添加项目中的库模块。例如:compile project(':PluginCore'),其中PluginCore表示的就是一个库模块
远程依赖:可以对jcenter上的开源项目添加依赖关系。例如:implementation 'com.android.support:appcompat-v7:28.0.0-rc02'
4、关于drawable和mipmap文件夹的区别
mipmap文件夹中的图片,可以有优化后的缩放算法,并且对于不同分辨率的手机,只会保存其对应的分辨率的文件,其他的文件会被删除掉。特别是桌面图标和需要做动画的图标。使用mipmap会效率更高。然后google也是推荐使用mipmap来保存桌面图标。所以建议图标还是放置到mipmap文件夹中。而一些图片文件,则可以放到drawable中!
参考地址:https://www.jianshu.com/p/ecf007710fae