任何一个新建的项目都会默认使用Android模式的项目结构,但这并不是项目真实的目录结构,而是被Android Studio转换过的这个模式结构比较简洁明了,适合进行快速开发,将其切换为Project模式就是项目的真实结构了。
一.首先就是.gradle和.idea这两个目录下放置的是Android Studio 自动生成的一些文件,.gradle是
gradle 运行时自动生成的
gradle项目产生文件夹(自动编译工具产生的文件)
基本不需要纳入项目源代码管理中而.idea是
IDEA 运行时候生成的文件IDEA项目文件夹(开发工具产生的文件)也基本不需要纳入项目源代码管理中。 这个IDEA是java的集成开发环境,Android Studio就是根据IDEA Commutity Edition开发的。
二.然后是app文件它是
module模块,项目中的代码、资源等内容几乎都放在这个目录下。
每一个module可看成在Eclipse中的一个Project,里面的文件结构与父类差不多。里面也能包含build.gradle、gradle.properties、setting.gradle 等相关gradle文件。
接下来是app 目录下的文件进行分析:
1.build:这个目录和外层的build目录类似,主要是包含了一些在编译时自动生成的
中间文件就在这里
我们编译最终生成的apk就在build/outputs/apk目录下,里面包含了app-debug.apk, app-debug-unaligned.apk,app-release-unaligned.apk三种apk, 另外app-release.apk是生成在module的根目录下。
2.libs:如果在项目中使用了第三方的jar包,就
把需要的第三方库jar文件放到这里,*.so也同样放在这里。可以在Project Structure中管理它的依赖关系,也可以在build.gradle中直接修改。
,放在这个目录下的jar包都会被自动添加到构建路径下
3.androidTest:是用来编写Android Test测试用的,可以对项目进行一些自动化测试。
4.java:是用来放置我们所有java代码的地方
5.res:这个目录下的东西有些多,在项目使用到的所有图片、布局、字符串等资源都要存放在这个目录下,当然这个目录下还有还有很多字目录:
(1)drawable:用来放置图片
(2)layout:用来设置布局
(3)valuse:是用开存放字符串、样式、颜色等配置的。
(4)mipmap:有这个开头的文件都是用来存放应用图标的,众多的文件是为了让程序更好的适应不同的设备
6.AndroidManifest.xml是整个Android项目的配置文件,在程序中定义的所有的四大组件都需要在这个文件里尽行注册没有注册的活动是不能使用的,还可以在这个文件中更应用添加权限声明。
7.test是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式
8. .gitignore这个文件是用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似
9.app.iml是IntelliJ IDEA项目自动生成的文件,
同Project中的*.iml一样。管理module的配
10.build.gradle 这是app模块的gradle构建脚本,这个文件中会指定很多的项目构建相关的配置
apply plugin:
'com.android.application'
android { compileSdkVersion
23
buildToolsVersion
"23.0.2"
defaultConfig { applicationId
"eric.test"
minSdkVersion
17
targetSdkVersion
23
versionCode
1
versionName
"1.0"
} buildTypes { release { minifyEnabled
false
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard-rules.pro'
} }}dependencies { compile fileTree(
dir
:
'libs'
, include: [
'*.jar'
]) testCompile
'junit:junit:4.12'
compile
'com.android.support:appcompat-v7:23.1.1'
compile
'com.android.support:design:23.1.1'
}
其中
// 这句是gradle版本的写法,声明是这是一个Android程序,是一个应用的插件一般有两值可选:com.android.application表示这是一个应用程序模块,com.android.library表示这是一个库模块,这两个最大的区别是一个可以直接运行另一个只能作为代码库依附其他的应用程序模块来运行。
apply plugin:
'com.android.application'
在下面是一个android的闭包是关于Android项目中的配置:
// 编译android的sdk版本
compileSdkVersion
23
// build tools的版本
buildToolsVersion
"23.0.2"
defaultConfig {
// 应用的包名
applicationId
"eric.test"
// 允许的最少版本
minSdkVersion
17
// 目标版本
targetSdkVersion
23
// apk的版本
versionCode
1
// apk的显示版本
versionName
"1.0"
}
buildTypes {
// 表明是在release版本中使用的配置
release {
// 是否运行混淆
minifyEnabled
false
// 混淆的配置文件路径,默认给了我们两个配置文件。
// proguard-android.txt在<sdk目录>/tools/proguard下面,里面已经包含了基本的混淆声明,有兴趣的可以去看下。
// proguard-rules.pro是在module根目录下面,我们可以根据项目去添加。
proguardFiles getDefaultProguardFile(
'proguard-android.txt'
),
'proguard-rules.pro'
} }
依赖的配置:
// 表明是依赖库配置,可以指定当前项目的配置,通常项目有三种依赖关系:本地依赖、库依赖、远程依赖。本地依赖可以对本地jar包或目录进行添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖可以对本地的jcenter库上的开源项目添加依赖关系,
dependencies {
// 表明依赖libs目录下的所有jar包,是一个本地依赖声明
compile fileTree(
dir
:
'libs'
, include: [
'*.jar'
])
// 表明在编译项目的测试代码时依赖
testCompile
'junit:junit:4.12'
//是远程依赖声明,前面的域名部分用于和其他的公司的库进行区别
compile
'com.android.support:appcompat-v7:23.1.1'
compile
'com.android.support:design:23.1.1'
}
11.proguard—rules.pro这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望被别人破解通常进行代码的混淆从而防止外人阅读
三.build目录主要是
构建时生成文件的地方不需要纳入项目源代码管理中。
四.
gradle目录(gradle环境支持文件夹)这个目录下包含了gradle wrapper的配置文件,使用gradel wrapper的方式不需要提前将gradle下载好,而是自动根据本地的缓存情况决定是否联网下载gradle
wrapper目录下有两个文件,里面有一些项目对gradle的配置信息,来看下其中一个gradle-wrapper.properties里的内容,可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本。
#Wed Oct 21 11:34:03 PDT 2015
distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distszipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip
五.
.gitignore文件是用来将指定的目录或文件排除在版本控制之外的,即
git对项目文件进行管理,使用者可以在里面添加你不希望纳入git管理的文件。里面的内容是:
*
.iml
.gradle
/local
.properties
/
.idea
/workspace
.xml
/
.idea
/libraries
.DS
_Store/build/captures
六.
build.gradle是项目全局的gradle构建脚本,是由
gradle项目自动编译的配置文件
,这个文件是
项目的编译环境配置,可以说是Gradle最主要的配置文件。以下是是对Project的配置,是最顶层的配置,在module中同样有一个build.gradle文件,是对module的配置,如果module里没有进行配置,将使用这里的配置信息。一个是声明仓库的源,这里可以看到是指明的jcenter(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优,声明了这个配置之后就可以在项目中轻松的引用任何jcenter上的开源项目了。另一个是声明了android gradle plugin的版本,这是一个插件,因为Gradle并不是单独为Android而开发的,所以想使用它来构建项目需要声明这个插件。
buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0-alpha2'//前面的是 // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files }}allprojects { repositories { jcenter() }}task clean(type: Delete) { delete rootProject.buildDir}
七.
gradle.properties是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本,
比如配置gradle运行模式,运行时jvm虚拟机的大小。在创建的项目中,暂时是没有内容的。
八.
gradlew和gradlew.bat这两个文件是用来在命令界面中执行Gradle命令的,
分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。
其中gradlew是在Linux或Mac系统中使用的而gradlew.bat是在windows系统上使用的。
九.
Test.iml是所有Intellij IDEA项目都会自动生成的一个文件,
编译项目时生成的文件,其名为‘项目名.iml’,
用于标示这是一个Android项目
十.
local.properties这个文件用于指定本机的Android SDK路径,通常是自动生成不需要修改,除非本机的Android SDK位置发生了变化,那么就将这个文件中的路径改成新的位置即可。这个文件也就是
配置android NDK,SDK的地方,也就是说在非android项目可能没有这个文件。
十一.
setting.gradle这个文件用于指定项目中所有引入的模块,通常情况下模块的引入都是自动完成,需要手动修改的情况比较少。
声明当前项目中含有什么module。如果有多个module会以‘,’分开,如:include ‘:app’, ‘:app2’。
在上面反复的提到了gradle,那么现在就介绍一下和gradle有关的知识。
首先Android Studio是采用Gradle来构建项目的,是一个非常先进的项目工具使用了
Groovy
的领域特定语言(DSL)来声明项目设置
新建项目成功后会下载Gradle,貌似这个过程不翻墙也是可以下载,但是访问特别慢,建议翻墙下载。那么下载的Gradle到什么地方呢?
- Mac上会默认下载到 **/Users/<用户名>/.gradle/wrapper/dists** 目录
- Win平台会默认下载到 C:\Documents and Settings<用户名>.gradle\wrapper\dists 目录
你会看到这个目录下有个 gradle-x.xx-all 的文件夹, 如果下载实在太慢,但是又不想翻墙的话,可以自己手动到Gradle官网
下载对应的版本,然后将下载的.zip文件(也可以解压)复制到上述的gradle-x.xx-all 文件夹下,不过还是建议让它直接下载的好。
Gradle的核心是一个丰富的可扩展的基于Groovy的领域特定语言(DSL)。Gradle通过提供说明性语言元素将说明性构建推到下一层。这些元素也提供build-by-convention支持Java、Groovy、OSGi、Web和Scala项目。另外这个说明性语言是可扩展的。添加自己的新语言元素或提高现有的,从而提供简洁、易于维护和理解构建。
总的来说Gradle是一种构建工具而Android Studio使用它来构建你的Android项目。主要任务是
依赖管理和任务执行
刚才说到Gradle的核心是Groovy,它是用于JVM的一种敏捷动态语言既可以面向对象也可以作为脚本语言。这种语言比较有特点,它和Java一样,也运行于Java虚拟机中。可以理解为Groovy扩展了Java语言。比如,Groovy对自己的定义就是:Groovy是在 java平台上的、 具有像Python, Ruby 和 Smalltalk 语言特性的灵活动态语言, Groovy保证了这些特性像 Java语法一样被 Java开发者使用。除了语言和Java相通外,Groovy有时候又像一种脚本语言。前文也提到过,当我执行Groovy脚本时,Groovy会先将其编译成Java类字节码,然后通过Jvm来执行这个Java类。实际上,由于Groovy Code在真正执行的时候已经变成了Java字节码,所以JVM根本不知道自己运行的是Groovy代码。
Gradle项目构框架使用groovy语言实现。
Gradle不单单是一个配置脚本,它的背后是几门语言,如果硬让我说,我认为是三门语言。
- Groovy Language
- Gradle DSL
- Android DSL
在Android Studio中的关键则是它更好的支持DSL,DSL是领域特定语言,
再直接点,其实就是这个语言不通用,只能用于特定的某个领域。
它是为了解决系统(包括硬件系统和软件系统)构建初期,使用者和构建者的语言模型不一致导致需求收集的困难。
在需求收集的过程中,如果要成功构建模型,则需要一种领域专家和构建者(也就是通常的领域分析师/业务分析师)都能理解的“共同语言”。但是这种共同语言的创建过程没有保证,不能够保证在收集过程中得到的信息完整的描述了领域活动中所有的业务规则和活动。如果能够让领域专家通过简单的编程方式描述领域中的所有活动和规则,那么就能在一定程度上保证描述
的完整性。DSL 就是为了解决这个问题而提出的。