在android studio中,代码工程的组织结构是:project + module,跟以往的eclipse是有区别的。那么,project和module下分别包含了哪些文件呢?其中,又有哪些是需要加入代码管理仓库进行管理的呢?哪些是在android studio导入工程的时候,编译过程中生成的中间文件呢?下面就分别对project目录和module目录进行详细的分析。
注:YES -- 该目录需要纳入代码仓库管理;NO -- 该目录不需要纳入代码仓库管理
1、module目录结构
build目录--NO:这个是编译module生成的文件夹,里面存放着该module生成的apk\aar文件(具体看该module的build.gradle是apply plugin: 'com.android.application' -- 生成apk,或者是apply plugin: 'com.android.library' -- 生成aar)
build.gradle文件--YES:这个是编译module模块的脚本,里面配置着该module编译的api版本,依赖的仓库,编译时是否混淆代码等等。该文件是module的编译核心
.gitignore文件--YES:这个是该module通过git init初始化了一个仓库进行代码管理的时候,可以将不想被仓库管理的文件或目录等写入该文件中,这样git status, git add 等操作就会将其忽略掉。
你可能会有个疑问?为什么android studio自动帮我们生成了这个文件?
可以这么理解,git代码管理工具是目前世界上所用最多,范围最广的分布式代码管理仓库。所以android studio自动帮我们生成该文件也是可以理解的,这意味着google推荐我们使用git去管理我们的项目代码。事实上,谷歌自己对aosp(安卓源码项目)开源项目也是用的git工具进行管理的libs目录--YES:这个文件夹是用来存放jar | aar | so等第三方库的。集成了第三方库后,需要在对应的module中的build.gradle中的dependencies{}添加依赖,这样module编译的时候才会去将该“第三方库”链接进来编译运行。毋庸置疑,这个libs文件夹相当于将“第三方库”当做项目源码进行调用。所以“一定要”纳入代码仓库管理,不然编译会报错--找不到调用的第三方库的方法异常
proguard-rules.pro文件--YES:这个是代码混淆文件。是为了生成的apk\aar不容易被反编译。是否在编译过程中使用“代码混淆”,需要在build.gradle文件中配置:
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
其中,proguard-android.txt是系统默认的混淆文件(定义了一些默认的混淆规则),proguard-rules.pro是我们自己提供的混淆规则。系统在混淆时会将proguard-android.txt, proguard-rules.pro的规则结合起来一起用。所以proguard-rules.pro文件需要纳入代码仓库管理,而proguard-android.txt是由系统提供,一般不需要改动,所以存放的位置是:项目sdk路径/tools/proguard/目录下src目录--YES:这个文件夹是用来存放下面项目代码的。所有的源码,图片,资源等文件都存放在这里。这里面包含main目录。main目录下包含java目录 和 res目录 和 AndroidManifest.xml清单文件。java目录用于存放java源码;res目录用于存放图片,字符串等相关文件;AndroidManifest.xml用于声明该module需要用到的相关组件,权限等信息
-
test(module名字).iml文件--NO:这个文件是用来管理module的相关配置信息的,也是用来标识该文件夹是一个android项目,而不是普通的文件夹。但是该文件是根据build.gradle生成的,所以不用纳入代码仓库中管理。文件中存储着build.gradle编译完成后的相关配置信息,后面正式编译module的生成对应apk | aar的时候,要用到这个test.iml,并根据里面的信息去寻找连接对应的文件,如AndroidManifest.xml文件,res文件夹的路径:
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" /> -- 清单文件存放路径
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" /> -- res资源文件存放路径
如果误删了这个文件,android studio没法辨别出该文件夹是android项目,那么"run"运行按钮会变成一个红色的X;但是由于build.gradle文件还存在,所以可以通过assembleRelease执行gradle的release任务生成对应的apk,然后通过adb install test.apk安装到设备上。如图test.iml。
那么怎么恢复这个文件呢?这篇博客讲的很好
1.将gradle文件中删除一行空格,目的是出现sync now
2.点击右上角Gradle,选中你的moudle
3.点击上面的刷新按钮
4.点击sync now
你就发现iml文件重新生成了(如图sync_now)
2、project目录结构
project.iml--NO:这个是用来管理project的相关配置信息的,也是标识这个文件夹是一个android项目的。如果误删该文件,Android Studio将不会将该文件当做安卓项目,只会当做普通的文件夹进行处理。但是由于里面的build.gradle都存在,所以module工程还是能正常编译。误删之后如果退出之后重新进入,Android Studio会重新生成该文件
test(module)目录--YES:这个是实际的module模块。里面包含了所有关于该模块的源码,配置等信息。也就是上面分析的module目录结构的目录,该文件夹是整个工程最核心的部分,你写的源码等都在该文件夹中。所以要纳入代码仓库中
build目录--NO:该目录是编译过程中生成的文件。类似module模块中的build目录。所以不需要加入代码仓库中管理
build.gradle文件--YES:该文件是project编译的脚本,而且还可以理解成module模块中的build.gradle的“父文件”。当module中的build.gradle文件缺少的相关配置,如果project的build.gradle存在,那么就会复用该文件的相关配置。里面配置了一个google维护的jcenter()仓库,该仓库是用来提供相关软件源给android studio下载的。如gradle的相关版本等等
.gitignore文件--YES:该文件和module模块中的.gitignore是一样的。如果该project通过git init初始化了一个仓库,进行仓库管理的时候,可以将不想被仓库管理的文件目录等写入该文件中
gradle目录--YES:该目录是用来存放关于编译该project需要用到的gradle版本,下载地址等。里面存放这wrapper文件夹,在wrapper文件夹下包含着gradle-wrapper.jar和gradle-wrapper.properties文件。在gradle-wrapper.properties文件中,存放这编译该project需要用到的版本和下载地址。gradle-wrapper.properties文件内容如下:参考该博客
#Wed Jul 22 20:30:43 CST 2020
distributionBase=GRADLE_USER_HOME -- zip包解压后存放的文件夹:在linux下是$HOME/.gradle,例如~/.gradle文件夹
distributionPath=wrapper/dists -- zip包解压后存放的文件夹下的子路径,linux下即~/.gradle/wrapper/dists
zipStoreBase=GRADLE_USER_HOME -- zip压缩包的存储文件夹:在linux下是$HOME/.gradle,例如~/.gradle文件夹
zipStorePath=wrapper/dists -- zip压缩包的存储路径,linux下即~/.gradle/wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-4.1-all.zip -- 编译用到的gradle的下载地址.gradle目录--NO:这个文件是编译project的时候生成的,里面存放的是编译过程中的中间文件,供编译出问题的时候debug使用。误删之后通过clean project -- rebuild project 之后系统会自动生成,或者通过重新import项目之后,系统会自动重新编译gradle之后生成
.gradle.properties文件--NO:配置gradle运行环境的文件,比如配置gradle运行模式,运行时jvm虚拟机的大小。在创建的项目中,暂时是没有内容的。如果手动配置了,那么虚拟机运行时就会按照该文件的配置信息运行
gradlew和gradlew.bat文件--YES:gradlew是Linux下的脚本,gradlew.bat是Windows下的脚本。作用是,根据gradle/wrapper/gradle-wrapper.properties文件中的url去下载对应的gradle版本,然后存储在对应的文件中。具体参考gradle目录知识点(6)。
可能你有个疑问:为什么要下载gradle版本呢?用本地的不行吗?
其实是可以用本地的gradle版本的,是可以去配置的。但是谷歌这样设计的目的是:保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。相当于加了一层保险.idea目录--NO:这个目录是Intellij IDEA 运行时候生成的文件目录,不需要纳入代码仓库中管理。误删除之后,只需要关闭Android Studio,重新导入项目就会自动生成
local.properties--NO:这个文件是显示当前project用到的sdk和ndk的路径的,不是用来配置sdk和ndk路径的。就像该文件内容中所描述的,
# This file is automatically generated by Android Studio. -- 该文件是Android Studio自动生成的
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -- 不要修改这个文件,就算修改了也会被擦除
所以误删之后直接clean -- rebuild会出错,需要关闭Android Studio后重新import该项目,Android Studio就会自动生成该文件。settings.gradle--YES:这个文件是用来配置当前的project中包含了哪些module。如果哪个module在里面没有配置,那么就算该module有build.gralde文件,在gradle面板中也不会显示该工程
结尾:感谢上面引用到的相关博客的技术大佬,谢谢。如果不想被引用,请联系删除