继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

查漏补缺之详解项目目录中的结构文件

慕标5832272
关注TA
已关注
手记 1245
粉丝 229
获赞 1002

“Project”模式项目结构

webp

“Project”模式项目结构


  1. .gradle和.idea
    这个目录放置的是AS自动生成的文件,一般不管它。

  2. app
    存放项目中的代码和资源,我们进行的开发工作都在这个目录中进行。

  3. build
    这个目录一般不需要操作,包含一些编译自动生成的文件。

  4. gradle
    Gradle是一个基于Apache Ant和Apcahe Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置。这个目录包含gradle wrapper的配置文件,使用gradle wrapper的方式不需要提前将Gradle下载好,而是会自动根据本地的缓存情况决定是否需要联网下载Gradle。AS默认不使用gradle wrapper的方式。如果需要打开,在AS主界面选择“FileSetting”选项中进行配置,如下图所示。

webp

image.png

  1. .gitignore
    此文件用来将指定的文件或目录排除在版本控制之外(Git部分)。

  2. build.gradle
    这个项目是全局的Gradle构建脚本,通常这个文件中的内容是不需要修改的。

  3. gradle.properties
    这个文件是全局的Gradle的配置文件,这里的配置将影响到项目中所有的Gradle编译脚本。

  4. gradlew和gradlew.bat
    这两个文件用来在命令行界面中执行gradle命令,其中gradlew实在Linux或Mac系统中使用的,gradlew.bat是在Windows系统中使用的。

  5. app.iml
    iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(AS是基于IntelliJ IDEA开发的),用于标识一个IntelliJ IDEA项目,不需要修改。

  6. local.properties
    这个文件用于指定本机中的Android SDK路径,通常内容都是自动生成的,除非本机的Android SDK位置发生了变化。

  7. setting.gradle
    此文件用于指定项目中所有引入的模块。由于项目中只有app模块,因此该文件只引入app一个模块,通常都是自动完成的。

app目录下的结构

webp

app目录下的结构

  1. build
    这个目录和外层的build目录类似,主要包含一些编译自动生成的文件,一般不需要关心。

  2. libs
    如果项目中使用了第三方jar包,就需要把这些jar包放在libs目录下,被自动添加到构建路径里去。

  3. android Test
    此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。

  4. java
    存放java源代码。

  5. res
    存放项目的资源,和Eclipse的res目录内容相同。

  6. AndroidManifest.xml
    Android应用程序的配置文件,声明了Android里边的组件和相关配置信息、添加的权限。和Eclipse的AndroidManifest.xml基本相同。

  7. test
    用来编写Unit Test测试用例,是对项目进行自动化测试的另一种方式。

  8. .gitignore
    这个文件用来将app模块内指定的文件或目录排除在版本控制之外,作用和外层的。gitignore类似。

  9. app.iml
    IntelliJ IDEA项目自动生成的文件,不需要修改。

  10. build.gradle
    这是app模块的gradle构建脚本,这个文件中会指定很多项目构建相关配置。

  11. proguard-rules.pro
    此文件用于指定代码的混淆规则,当代码开发完成后打包成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆。

详解build.gradle文件

webp

项目中有两个build.gradle

下面是最外层的build.gradle文件:

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

这些代码是自动生成的,虽然语法结构看上去可能有点难以理解,但如果忽略语法结构,只看关键的部分,其实还是好懂的。

首先,两次的 repositories 的闭包中都声明了jcenter()这行配置。这是什么意思呢?其实它是一个代码托管仓库,很多Android开源项目都会选择将代码托管到JCenter上。声明了这行配置之后,我们就可以在项目中轻松引用任何JCenter上的开源项目。
JCenter是一个由bintray.com维护的Maven仓库,可通过Maven、Gradle、Ivy和SBT等工具使用。

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

task clean声明了一个任务,任务名叫clean(也可以改为其他的任务名,如Delete,也可能是Copy),任务类型是Delete(也可以是Copy),就是每次修改setting.gradle文件后单击同步,就会删除rootProject.buildDir下的文件(实际上看到的效果是清除了External Libraries里的包,然后又添加了一次)。

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

下面是app目录里的build.gradle文件:

apply plugin: 'com.android.application'android {
    compileSdkVersion 24
    buildToolsVersion "24.0.3"
    defaultConfig {
        applicationId "com.jennyni.news"
        minSdkVersion 15
        targetSdkVersion 24
        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( 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闭包,在这个闭包中我们可以配置项目构建的各种属性。
其中,complieSdkVersion用于指定项目的编译版本,这里指定成24,表示使用Android7.0系统的SDK编译。
buildToolsVersion用于指定项目构建工具的版本,目前最新的版本就是24.0.3,如果有更新的版本时,AS会进行提示。

然后,在android的闭包中又嵌套了一个defaultConfig闭包,在defaultConfig闭包中可以对项目的更多细节进行配置。
其中,applicationId用于指定项目的包名,我们在创建时其实已经指定过包名了,如果想在后面对其进行修改,就需要在这里修改。
minSdkVersion用于指定项目最低兼容的Android系统版本,这里指定成“15”,表示最低兼容到Android4.0系统。
targetSdkVersion指定的值表示你在该目标版本上已经做过了充分的测试,系统会将为你的应用程序启用一些最新的功能和特性。比如,在Android7.0系统中引入了运行时权限这个功能,如果你将targetSdkVersion指定指定成“24”,或者更高,那么系统就会为你的应用程序启用运行时权限功能;如果你将targetSdkVersion指定成“22”,那么就说明你的应用程序只在Android5.1系统上做过充分的测试,Android6.0系统中引入的新功能自然就不要启用了。
其余两个属性都比较简单,versionCode用于指定的版本号,versionName用于指定项目的版本名,这两个属性在生成安装文件的时候非常重要。
testInstrumentationRunner这一行表示要使用AndroidJUnitRunner进行单元测试。

接下来看一下 buildTypes闭包。 buildTypes闭包中用于指定生成安装文件的相关配置,通常只会有两个子闭包,一个是debug,一个是release。debug闭包用于指闭包是可以忽略不写的,因此我们看到代码中就只有一个release闭包。
下面看一下release闭包中的具体内容吧,minifyEnabled用于指定混淆时使用的规则文件,这里指定了两个文件,proguard-android.txt是在Android SDK目录下的,里面是所有项目通用的混淆规则;proguard-rules.pro是在当前项目中根目录下的,里面可以编写当前项目特有的混淆规则。需要注意的是,通过AS直接运行项目生成的都是测试版安装文件。

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



作者:Jennyni1122
链接:https://www.jianshu.com/p/3332f36c3add


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP