hoyong

导航

Android Studio 工程目录结构分析(转)

Android Studio 工程目录结构分析 (上)

Android Studio 工程目录

我们这里以一个简单的 HelloWorld 工程来分析:

 
1、.gradle 和. idea
        这两个目录下放置的都是 Android Studio 自动生成的一些文件,我们无须关心,也不要去手动编辑。
2、app
        项目中的代码、资源等内容几乎都是放置在这个目录下的,我们后面的开发工作也基本都是在这个目录下进行的,待会儿还会对这个目录单独展开进行讲解。
3、build
        这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。
4、gradle
        这个目录下包含了 gradle wrapper 的配置文件,使用 gradle wrapper 的方式不需要提前将 gradle 下载好,而是会自动根据本地的缓存情况决定是否需要联网下载 gradle。Android Studio 默认没有启动 gradle wrapper 的方式,如果需要打开,可以点击 Android Studio 导航栏 --> File --> Settings --> Build,Execution,Deployment --> Gradle,进行配置更改。
5、.gitignore
        这个文件是用来将指定的目录或文件排除在版本控制之外的。
6、build.gradle
        这是项目全局的 gradle 构建脚本,通常这个文件中的内容是不需要修改的。下面会详细分析 gradle 构建脚本中的具体内容。
7、gradle.properties
        这个文件是全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。
8、gradlew 和 gradlew.bat
        这两个文件是用来在命令行界面中执行 gradle 命令的,其中 gradlew 是在 Linux 或 Mac 系统中使用的,gradlew.bat 是在 Windows 系统中使用的。
9、HelloWorld.iml
        iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件 (Android Studio 是基于 IntelliJ IDEA 开发的),用于标识这是一个 IntelliJ IDEA 项目,我们不需要修改这个文件中的任何内容。
10、local.properties
        这个文件用于指定本机中的 Android SDK 路径,通常内容都是自动生成的,我们并不需要修改。除非你本机中的 Android SDK 位置发生了变化,那么就将这个文件中的路径改成新的位置即可。
11、settings.gradle
        这个文件用于指定项目中所有引入的模块。由于 HelloWorld 项目中就只有一个 app 模块,因此该文件中也就只引入了 app 这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。

app 目录结构

 
        现在整个项目的外层目录结构已经介绍完了。你会发现,除了 app 目录之外,大多数的文件和目录都是自动生成的,我们并不需要进行修改。想必你已经猜到了,app 目录下的内容才是我们以后的工作重点,展开之后结构如下:

        那么下面我们就来对 app 目录下的内容进行更为详细的分析。
1、build
        这个目录和外层的 build 目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更多更杂,我们不需要过多关系。
2、libs
        如果你的项目中使用到了第三方 jar 包,就需要把这些 jar 包都放在 libs 目录下,放在这个目录下的 jar 包都会被自动添加到构建路径里去。
3、AndroidTest
        此处是用来编写 Android Test 测试用例的,可以对项目进行一些自动化测试。
4、java
        毫无疑问,java 目录是放置我们所有 java 代码的地方,展开该目录,你将看到我们刚才创建的 HelloWorldActivity 文件就在里面。
5、res
        这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在 drawable 目录下,布局放在 layout 目录下,字符串放在 values 目录下,所以你不用担心会把整个 res 目录弄得乱糟糟的。
6、AndroidManifest.xml
        这是你整个 Android 项目的配置文件,你在程序中定义的所以四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
7、test
        此处是用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。
8、.gitignore
        这个文件用于将 app 模块内的指定的目录或文件排除在版本控制之外,作用和外层的. gitignore 文件类似。
9、app.iml
        IntelliJ IDEA 项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
10、build.gradle
        这是 app 模块的 gradle 构建脚本,这个文件中会指定很多项目构建相关的配置。
11、proguard-rules.pro
        这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。

项目中的资源

 
        如果你展开 res 目录看一下,其实里面的东西还是挺多的,很容易让人看得眼花缭乱,如下图:

        看到这么多的文件夹也不用害怕,其实归纳一下,res 目录就变得非常简单了。
所以以 drawable 开头的文件夹都是用来放图片的,
所有以 mipmap 开头的文件夹都是用来放应用图标的,
所有以 values 开头的文件夹都是用来放字符串、样式、颜色等配置的,
layout 文件夹是用来放布局文件的。
 
 

Android Studio 工程目录结构分析 (下)

前言

        不同于 Eclipse,AndroidStudio 是采用 Gradle 来构建项目的。Gradle 是一个非常先进的项目构建工具,它使用了一种基于 Groovy 的领域特定语言 (DSL) 来声明项目设置。摒弃了传统基于 XML(如 Ant 和 Maven)的各种繁琐配置。
        在 Android Studio 工程目录结构分析 (上)(http://blog.csdn.net/xhbxhbsq/article/details/54615663) 文章中我们看到,HelloWorld 项目中有两个 build.gradle 文件,一个是在最外层目录下的,一个是在 app 目录下的。这两个文件对构建 AndroidStudio 项目都起到了至关重要的作用,下面我们就来对这两个文件中的内容进行详细的分析。

最外层目录下的 build.gradle

 
        先来看一下最外层目录下的 build.gradle 文件,代码如下所示:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Gradle中可以使用“//”或“/**/”来添加注释,与Java类似。
// 根目录下的build.gradle用于添加子工程或模块共用的配置项。
 
// "buildscript"的类型为script block,而且是最上层的script block,用于配置Gradle的Project实例。其API文档为https://docs.gradle.org/current/dsl/org.gradle.api.Project.html#org.gradle.api.Project:buildscript(groovy.lang.Closure)
// 其余的根script block有"allprojects", "dependencies", "configurations"等,更多的可见https://docs.gradle.org/current/dsl/的“Build script structure”一节。
// Script Block是一种method的调用,传入的参数为configuration closure。执行后会对Project的属性进行配置。
// 此处的"buildscript"用于配置Project的build script的classpath。
buildscript {
// 如果需要的话,从https://jcenter.bintray.com/下载code reposities。
repositories {
jcenter()
}
// 定义classpath,gradle会从“repositories”中下载对应版本的Gradle。如果使用gradle wrapper的话,感觉这个配置会被忽略。Wrapper会自己去下载所使用的gradle版本。
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2'
 
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
 
// 该配置会被应用到所有的子工程。
allprojects {
repositories {
jcenter()
}
}
 
// 运行gradle clean时,执行此处定义的task。
// 该任务继承自Delete,删除根目录中的build目录。
// 相当于执行Delete.delete(rootProject.buildDir)。
// gradle使用groovy语言,调用method时可以不用加()。
task clean(type: Delete) {
delete rootProject.buildDir
}
        这些代码都是自动生成的,虽然语法结构看上去可能有点难以理解,但是如果我们忽略语法结构,只看最关键的部分,其实还是很好懂的。
        首先,两处 repositories 的闭包中都声明了 jcenter() 进行配置,那么这个 jcenter 是什么意思呢?其实它是一个代码托管仓库,很多 Android 开源项目都会选择将代码托管到 jcenter 上,声明了这行配置之后,我们就可以在项目中轻松引用任何 jcenter 上的开源项目了。
        接下来,dependencies 闭包中使用 classpath 声明了一个 Gradle 插件。为什么要声明这个插件呢?因为 Gradle 并不是专门为构建 Android 项目而开发的,java,c++ 等很多项目都可以使用 Gradle 来构建。因此如果我们要想使用它来构建 Android 项目,则需要声明 com.android.tools.build:gradle:2.2.2 这个插件。其中,最后面的部分是插件的版本号。
        这样我们就将最外层目录下的 build.gradle 文件分析完了,通常情况下你并不需要修改这个文件中的内容,除非你想添加一些全局的项目构建配置。

app 目录下的的 build.gradle

 
        下面我们再来看一下 app 目录下的 build.gradle 文件,代码如下所示:
apply plugin: 'com.android.application'
 
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.example.helloworld"
minSdkVersion 15
targetSdkVersion 23
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(include: ['*.jar'], dir: 'libs')
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:23.4.0'
testCompile 'junit:junit:4.12'
}
        这个文件中的内容就要相对复杂一些,下面我们一行行地进行分析。首先第一行应用了一个插件,一般有两种值可选:com.android.application 表示这是一个应用程序模块,com.android.library 表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。
        接下来是一个大的 android 闭包,在这个闭包中我们可以配置项目构建的各种属性。其中,compileSdkVersion 用于指定项目的编译版本,这里指定成 23 表示使用 Android 6.0 系统的 SDK 编译。buildToolsVersion 用于指定项目构建工具的版本,目前使用的版本是 23.0.3。
        然后我们看到,这里在 android 闭包中又嵌套了一个 defaultConfig 闭包,defaultConfig 闭包中可以对项目的更多细节进行配置。其中,applicationId 用于指定项目的包名,前面我们在创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的。minSdkVersion 用于指定项目最低兼容的 Android 系统版本,这里指定成 15 表示最低兼容到 Android 4.0 系统。targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性。比如说 Android 6.0 系统中引入了运行时权限这个功能。而如果你将 targetSdkVersion 指定成 22,那么就说明你的程序最高只在 Android 5.1 系统上做过充分的测试,Android 6.0 系统中引入的新功能自然就不会启用了。剩下的几个属性都比较简单,versionCode 用于指定项目的版本号,versionName 用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要。
        分析完了 defaultConfig 闭包,接下来我们看一下 buildTypes 闭包。buildTypes 闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是 debug,一个是 release。debug 闭包用于指定生成测试版安装文件的配置,release 闭包用于指定生成正式版安装文件的配置。另外,debug 闭包是可以忽略不写的,因此我们看到上面的代码中就只有一个 release 闭包。下面来看一下 release 闭包中的具体内容吧,minifyEnabled 用于指定是否对项目的代码进行混淆,true 表示混淆,false 表示不混淆。proguardFiles 用于指定混淆时使用的规则文件,这里指定了两个文件,第一个 proguard-android.,txt 是在 Android SDK 目录下的,里面是所有项目通用的混淆规则,第二个 proguard-rules.pro 是在当前项目的根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过 AndroidStudio 直接运行项目生成的都是测试版安装文件。
        这个整个 android 闭包中的内容就都分析完了,接下来还剩下一个 dependencies 闭包。这个闭包的功能非常强大,它可以指定当前项目所有的依赖关系。通常 AndroidStudio 项目一共有 3 种依赖方式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的 jar 包或目录添加依赖关系,库依赖可以对项目中的库模块添加依赖关系,远程依赖则可以对 jcenter 库上的开源项目添加依赖关系。观察一下 dependencies 闭包中的配置,第一行的 compile fileTree 就是一个本地依赖声明,它表示将 libs 目录下所有. jar 后缀的文件都添加到项目的构建路径当中。而第三行 compile 则是远程依赖声明,com.android.support:appcompat-v7:23.4.0 就是一个标准的远程依赖库格式,其中 com.android.support 是域名部分,用于和其他公司的库做区分;appcompat-v7 是组名称,用于和同一个公司中不同的库做区分;23.4.0 是版本号,用于和同一个库不同的版本做区分。加上这句声明后,Gradle 在构建项目时会首先检查一个本地是否已经有这个库的缓存,如果没有的话则会去自动联网下载,然后再添加到项目的构建路径当中。至于库依赖声明这里没有用到,它的基本格式是 compile project 后面加上要依赖的库名称,比如说有一个库模块的名字叫 helper,那么添加这个库的依赖关系只需要加入 compile project(':helper') 这句声明即可。
 

全文完

原文地址

posted on 2019-09-01 22:16  hoyong  阅读(984)  评论(0)    收藏  举报