Android---Android Studio项目目录结构分析.

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 构建脚本,通常这个文件中的内容是不需要修改的。

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 目录下的内容才是我 们以后的工作重点,展开之后结构如图 1.29 所示。

 

 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 构建脚本,这个文件中会指定很多项目构建相关的配置,我们稍后将 会详细分析 gradle 构建脚本中的具体内容。

11. proguard-rules.pro 这个文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代 码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读

 

详解项目中的资源

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

 

 

 

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

之所以有这么多 mipmap 开头的文件夹,其实主要是为了让程序能够更好地兼容各种设备。 drawable 文件夹也是相同的道理,虽然 Android Studio 没有帮我们自动生成,但是我们应该自己创 建 drawable-hdpi、drawable-xhdpi、drawable-xxhdpi 等文件夹。在制作程序的时候最好能够给同 一张图片提供几个不同分辨率的版本,分别放在这些文件夹下,然后当程序运行的时候,会自动 根据当前运行设备分辨率的高低选择加载哪个文件夹下的图片。当然这只是理想情况,更多的时 候美工只会提供给我们一份图片,这时你就把所有图片都放在 drawable-xxhdpi 文件夹下就好了。

知道了 res 目录下每个文件夹的含义,我们再来看一下如何去使用这些资源吧。打开 res/ values/strings.xml 文件,内容如下所示:

 

HelloWorld 可以看到,这里定义了一个应用程序名的字符串,我们有以下两种方式来引用它。

 在代码中通过 R.string.app_name 可以获得该字符串的引用。

 在 XML 中通过@string/app_name 可以获得该字符串的引用。 

基本的语法就是上面这两种方式,其中 string 部分是可以替换的,如果是引用的图片资源 就可以替换成 drawable,如果是引用的应用图标就可以替换成 mipmap,如果是引用的布局文件 就可以替换成 layout,以此类推。

下面举一个简单的例子来帮助你理解,打开 AndroidManifest.xml 文件,找到如下代码:

 

<application 
 android:allowBackup="true" 
 android:icon="@mipmap/ic_launcher" 
 android:label="@string/app_name" 
 android:supportsRtl="true" 
 android:theme="@style/AppTheme"> 
 ... 
</application> 

 

... 其中,HelloWorld 项目的应用图标就是通过 android:icon 属性来指定的,应用的名称则是 通过android:label属性指定的。可以看到,这里对资源引用的方式正是我们刚刚学过的在XML 中引用资源的语法。 经过本小节的学习,如果你想修改应用的图标或者名称,相信已经知道该怎么办了吧。

详解 build.gradle 文件

不同于 Eclipse,Android Studio 是采用 Gradle 来构建项目的。Gradle 是一个非常先进的项目 构建工具,它使用了一种基于 Groovy 的领域特定语言(DSL)来声明项目设置,摒弃了传统基 于 XML(如 Ant 和 Maven)的各种烦琐配置。

在 1.3.4 小节中我们已经看到,HelloWorld 项目中有两个 build.gradle 文件,一个是在最外层 目录下的,一个是在 app 目录下的。这两个文件对构建 Android Studio 项目都起到了至关重要的 作用,下面我们就来对这两个文件中的内容进行详细的分析

先来看一下最外层目录下的 build.gradle 文件,代码如下所示:

buildscript { 
 repositories { 
 jcenter() 
 } 
 dependencies { 
 classpath 'com.android.tools.build:gradle:2.2.0' 
 } 
} 
allprojects { 
 repositories { 
 jcenter() 
 } 
} 
这些代码都是自动生成的,虽然语法结构看上去可能有点难以理解,但是如果我们忽略语法结构,只看最关键的部分,其实还是很好懂的。

首先,两处 repositories 的闭包中都声明了 jcenter()这行配置,那么这个 jcenter 是什 么意思呢?其实它是一个代码托管仓库,很多 Android 开源项目都会选择将代码托管到 jcenter 上,声明了这行配置之后,我们就可以在项目中轻松引用任何 jcenter 上的开源项目了。

接下来,dependencies 闭包中使用 classpath 声明了一个 Gradle 插件。为什么要声明这 个插件呢?因为 Gradle 并不是专门为构建 Android 项目而开发的,Java、C++等很多种项目都可 以使用 Gradle 来构建。因此如果我们要想使用它来构建 Android 项目,则需要声明 com.android. tools.build:gradle:2.2.0 这个插件。其中,最后面的部分是插件的版本号,我在写作本书 时最新的插件版本是 2.2.0。

这样我们就将最外层目录下的 build.gradle 文件分析完了,通常情况下你并不需要修改这个 文件中的内容,除非你想添加一些全局的项目构建配置。

下面我们再来看一下 app 目录下的 build.gradle 文件,代码如下所示:
apply plugin: 'com.android.application' 
android { 
 compileSdkVersion 24 
 buildToolsVersion "24.0.2" 
 defaultConfig { 
 applicationId "com.example.helloworld" 
 minSdkVersion 15 
 targetSdkVersion 24 
 versionCode 1 
 versionName "1.0" 
 } 
 buildTypes { 
 release { 
 minifyEnabled false 
 proguardFiles getDefaultProguardFile('proguard-android.txt'), 
 'proguard-rules.pro' 
 } 
 } 
} 
dependencies { 
 compile fileTree(dir: 'libs', include: ['*.jar']) 
 compile 'com.android.support:appcompat-v7:24.2.1' 
 testCompile 'junit:junit:4.12' 
}

这个文件中的内容就要相对复杂一些了,下面我们一行行地进行分析。首先第一行应用了一 个插件,一般有两种值可选:com.android.application 表示这是一个应用程序模块, com.android.library 表示这是一个库模块。应用程序模块和库模块的最大区别在于,一个是 可以直接运行的,一个只能作为代码库依附于别的应用程序模块来运行。

接下来是一个大的 android 闭包,在这个闭包中我们可以配置项目构建的各种属性。其中, compileSdkVersion 用于指定项目的编译版本,这里指定成 24 表示使用 Android 7.0 系统的 SDK 编译。buildToolsVersion 用于指定项目构建工具的版本,目前最新的版本就是 24.0.2,如果有更新的版本时,Android Studio 会进行提示。

然后我们看到,这里在 android 闭包中又嵌套了一个 defaultConfig 闭包,defaultConfig 闭包 中可以对项目的更多细节进行配置。其中,applicationId 用于指定项目的包名,前面我们在 创建项目的时候其实已经指定过包名了,如果你想在后面对其进行修改,那么就是在这里修改的。 minSdkVersion 用于指定项目最低兼容的 Android 系统版本,这里指定成 15 表示最低兼容到 Android 4.0 系统。targetSdkVersion 指定的值表示你在该目标版本上已经做过了充分的测试, 系统将会为你的应用程序启用一些最新的功能和特性。比如说 Android 6.0 系统中引入了运行时 权限这个功能,如果你将 targetSdkVersion 指定成 23 或者更高,那么系统就会为你的程序启 用运行时权限功能,而如果你将 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 是在当前项目的根目录下的,里面可以编写当前项目 特有的混淆规则。需要注意的是,通过 Android Studio 直接运行项目生成的都是测试版安装文件,

这样整个 android 闭包中的内容就都分析完了,接下来还剩一个 dependencies 闭包。这个闭 包的功能非常强大,它可以指定当前项目所有的依赖关系。通常 Android Studio 项目一共有 3 种依 赖方式:本地依赖、库依赖和远程依赖。本地依赖可以对本地的 Jar 包或目录添加依赖关系,库依 赖可以对项目中的库模块添加依赖关系,远程依赖则可以对 jcenter 库上的开源项目添加依赖关系。 观察一下 dependencies 闭包中的配置,第一行的 compile fileTree 就是一个本地依赖声明,它 表示将 libs 目录下所有.jar 后缀的文件都添加到项目的构建路径当中。而第二行的 compile 则是 远程依赖声明,com.android.support:appcompat-v7:24.2.1就是一个标准的远程依赖库格式, 其中 com.android.support 是域名部分,用于和其他公司的库做区分;appcompat-v7 是组名称, 用于和同一个公司中不同的库做区分;24.2.1 是版本号,用于和同一个库不同的版本做区分。加 上这句声明后,Gradle 在构建项目时会首先检查一下本地是否已经有这个库的缓存,如果没有的话 则会去自动联网下载,然后再添加到项目的构建路径当中。至于库依赖声明这里没有用到,它的 基本格式是 compile project 后面加上要依赖的库名称,比如说有一个库模块的名字叫 helper, 那么添加这个库的依赖关系只需要加入 compile project(':helper')这句声明即可。另外剩下的一句 testCompile 是用于声明测试用例库的,这个我们暂时用不到,先忽略它就可以了。

posted on 2021-11-02 05:10  Bytezero!  阅读(472)  评论(0编辑  收藏  举报