你完全了解你的Android studio project项目结构目录起着什么作用么?带着总结学习的目的,来一起去了解下Android Studio Project目录和文件的结构的作用:
在Android Studio中,Project目录是一个完整的APP项目,由Application的Module和一些依赖的Module组成。
作用:gradle项目产生文件夹(自动编译工具产生的文件)
释义:gradle 运行时自动生成的目录,一般情况不做修改,不需要纳入项目源代码管理中。
作用:IDEA项目文件夹(开发工具产生的文件)
释义:Intellij IDEA 运行时候生成的文件目录,一般情况不做修改,不需要纳入项目源代码管理中。
拓展:.idea文件夹是自动生成的用于存放Android Studio配置文件的目录,主要包括版权、检查配置、jar包信息、项目名、编译、编码、gradle、模块等。
拓展:Intellij IDEA是JetBrains公司推出的Java集成开发环境,Android Studio是基于IDEA Commutity Edition开发的,Community 版本不仅是免费的而且是开源的。
作用:工程中的模块——Module
释义:是一个可以单独运行和调试的application或公共库,一个Project中可以有多个Module。
拓展:项目中的代码、资源等内容几乎都是放置在这个目录下的,开发工作也都是在这个目录下进行的。
作用:构建时生成文件的地方
释义:工程编译目录,这个目录你也不需要过多关心,它主要包含了一些在编译时自动生成的文件。(我新建的工程里如果没有依赖工程时没有这个文件夹,如果有有依赖工程时会出现这个文件夹,未知什么原因)
作用:gradle构建目录,gradle环境支持文件夹
释义:这个目录下包含了gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载gradle。Android Studio默认没有启动gradle wrapper的方式,如果需要打开,可以点击Android Studio导航栏 --> File --> Settings --> Build,Execution,Deployment --> Gradle,进行配置更改。
拓展:
gradle文件夹里面wrapper目录下有两个文件,里面有一些项目对gradle的配置信息,看下gradle-wrapper.properties里的内容:
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
可以看到里面声明了gradle的目录与下载路径以及当前项目使用的gradle版本
作用:git源码管理文件,工程中的Git忽略配置文件。
释义:这个文件是用来将指定的目录或文件排除在版本控制之外的。
拓展:git对项目文件管理,可以在里面添加你不希望纳入git管理的文件。来看一下里面的内容:
*.iml
.gradle
/local.properties
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild
Android Studio已经自动帮我们添加了一些不需要的文件,我们可以按照同样的格式来加入自己的文件。
例如:添加 /app/build/ 工程 Module中自动构建生成的build文件忽略版本控制。
作用:gradle项目自动编译的配置文件
释义:这是项目全局的gradle构建脚本,通常这个文件中的内容是不需要修改的。但为方便在不同module中设置版本号等配置信息,可以通过配置全局变量来统一所有module的公共配置信息,后期再看这块的配置方式
拓展:先来看下里面的内容。
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.2'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这里是对Project的配置,是最顶层的配置,在module中同样有一个build.gradle文件,是对module的配置,如果module里没有进行配置,将使用这里的配置信息。一个是声明仓库的源,这里可以看到是指明的jcenter(), jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。另一个是声明了android gradle plugin的版本。
作用:gradle运行环境配置文件
释义:这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。比如配置gradle运行模式,运行时jvm虚拟机的大小。具体配置可以参考如下链接:
https://docs.gradle.org/current/userguide/build_environment.html
https://docs.gradle.org/current/userguide/multi_project_builds.html#sec:decoupled_projects
作用:
gradlew:自动完成 gradle 环境的linux mac 脚本,配合gradle 文件夹使用
gradlew.bat:自动完成 gradle 环境的windows 脚本,配合gradle 文件夹使用
释义:它们分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。更多内容可以看下下面的链接,:
http://blog.csdn.net/maserkinger/article/details/36011235
作用:本地属性配置文件(key设置、androidsdk位置等属性),Android SDK NDK 环境路径配置
释义:配置android NDK,SDK的地方,非android项目可能没有这个文件,这个路径根据不同想电脑不同,一般也不会纳入源代码管理之中。
例如:sdk.dir=E\:\android_studio\android_studio\AndroidSDK
作用:IDEA 项目文件
释义:编译项目时生成的文件,其名为‘项目名.iml’,iml文件是Android Studio识别项目的配置文件,跟Eclipse里面的.project文件作用类似。
iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容。
<module external.linked.project.id="recyleview" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$" external.system.id="GRADLE" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="java-gradle" name="Java-Gradle">
<configuration>
<option name="BUILD_FOLDER_PATH" value="$MODULE_DIR$/build" />
<option name="BUILDABLE" value="false" />
configuration>
facet>
component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.gradle" />
content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
component>
module>
作用:全局配置文件,gradle 项目的子项目包含文件
释义:这个文件用于指定项目中所有引入的模块。由于项目中就只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下模块的引入都是自动完成的,需要我们手动去修改这个文件的场景可能比较少。声明当前项目中含有什么module。如果有多个module会以‘,’分开,例如:include ‘:app’, ‘:app2’
项目中使用到的依赖库存放目录,主要有Android SDK版本和存放路径、JDK版本和存放路径、其他各种依赖库。
实质上除了app目录之外,大多数的文件和目录都是自动生成的,我们并不需要进行修改。app目录下的内容才是我们以后的工作重点,展开之后结构如下:
作用:module编译时所生成文件的目录
释义:这个目录和外层的build目录类似,主要也是包含了一些在编译时自动生成的文件,不过它里面的内容会更多更杂,我们不需要过多关系。我们编译最终生成的apk就在build/outputs/apk目录下,里面包含了app-debug.apk, app-debug-unaligned.apk,app-release-unaligned.apk三种apk, 另外app-release.apk是生成在module的根目录下。
作用:第三方依赖库所在目录
释义: 如果你的项目中使用到了第三方jar包,就需要把这些jar包都放在libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。我们可以把需要的第三方库jar文件放到这里,*.so也同样放在这里。可以在Project Structure中管理它的依赖关系,也可以在build.gradle中直接修改。
作用:android Studio生成的测试模块,可删除
释义:此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
java目录是放置我们所有java代码的地方,该目录等同于Eclipse里面的src目录
资源文件存放目录,这个目录下的内容就有点多了。简单点说,就是你在项目中使用到的所有图片,布局,字符串等资源都要存放在这个目录下。当然这个目录下还有很多子目录,图片放在drawable目录下,布局放在layout目录下,字符串放在values目录下,所以你不用担心会把整个res目录弄得乱糟糟的。
这是你整个Android项目的配置文件,你在程序中定义的所以四大组件都需要在这个文件里注册,另外还可以在这个文件中给应用程序添加权限声明。
作用:单元测试模块,可删除
释义:此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
作用:module中的git管理文件
释义: module模块的git管理文件,可对module单独管理。这个文件用于将app模块内的指定的目录或文件排除在版本控制之外,作用和外层的.gitignore文件类似。
作用:module中的IDEA 项目文件
释义:IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。同Project中的*.iml一样。管理module的配置。
作用:module自动编译的配置文件
释义:这个文件是Module的gradle配置文件,也可以算是整个项目最主要的gradle配置文件。这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关的配置。
/*
apply plugin:应用了一个插件,一般有两种值可选:
1、com.android.application 表示这是一个应用程序模块
2、com.android.library 表示这是一颗库模块
两个最大的区别是:一个可以之间运行,一个只能作为代码库依附于别的应用程序模块来运行。
*/
apply plugin: 'com.android.application'
android {//在这个android闭包中我们可以配置项目构建的各种属性。
compileSdkVersion 27//用于指定项目的编译版本
buildToolsVersion "27.0.3" //用于指定项目构建工具的版本
defaultConfig {//在这个defaultConfig闭包中可以对项目的更多细节进行配置。
//用于指定项目的包名,在后面修改时在这里修改
applicationId "com.materialdesign.heiyl.recyleview"
//用于指定项目最低兼容的android系统版本
minSdkVersion 14
//指定的值表示你在该目标版本上已经做过了充分的测试,系统将会为你的应用程序启用一些最新的功能和特性
targetSdkVersion 27
//用于指定项目的版本号
versionCode 1
//用于指定项目的版本名
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
}
//在这buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个debug,一个是release
//1.debug闭包用于指定生成测试版安装文件的配置(这个闭包可以忽略不写)
//2.release闭包用于指定生成正式版安装文件的配置
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/menu'] } }
}
/**
这个dependencies闭包可以指定当前项目所有的依赖关系。
通常android studio 项目共有3种依赖方式1.本地依赖 2.库依赖 3.远程依赖
1.本地依赖可以对本地的jar包或目录添加依赖关系
2.库依赖可以对项目中的库模块添加依赖关系
3.远程依赖则可以对jcenter库上的开源项目添加依赖关系
*/
dependencies {
//这是一个本地依赖声明,它表示将libs目录下所有.jar后缀的文件都添加到项目的构建路径当中
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:support-v4:27.1.1'
implementation 'com.android.support:support-vector-drawable:27.1.1'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.android.support:recyclerview-v7:27.1.1'
}
proguard-rules.pro文件用于指定项目代码的混淆规则,当代码开发完成后打成安装包文件,如果不希望代码被别人破解,通常会将代码混淆,从而让破解者难以阅读。