Android studio gradle系列一

一.Android SDK 目录结构

Android studio gradle系列一_第1张图片
SDK目录结构

1.build-tools目录.

Android studio gradle系列一_第2张图片
build-tools

编译工具目录,包含了转化为davlik虚拟机的编译工具,比如adb、和aapt、aidl、dx等文件。

2.emulator目录.

Android模拟器模拟器目录。

3.extras目录

该文件下存放了Google提供的USB驱动,Intel提供的硬件加速附件工具包。

4.platforms目录。

Android studio gradle系列一_第3张图片
image.png

是每个平台SDK真正的文件,存放不同版本的Android系统。对应android studio build.gradle中的compileSdkVersion

5.platform-tools目录.

Android studio gradle系列一_第4张图片
platform-tools

各个版本的通用工具。比如 adb、sqlite3、fastboot等.

6.sources目录.

Android studio gradle系列一_第5张图片
sources

包含了各个版本的SDK源码。

7.system-images

Android studio gradle系列一_第6张图片
system-images

存放的是创建Android虚拟机时的镜像文件(已经编译好的镜像文件,模拟器可以直接加载)。

8.tools

tools:这个文件夹下存放了大量Android开发、调试的工具。包括测试、调试、第三方工具。模拟器、数据管理工具等。

二.Android Studio工程结构。

Android studio gradle系列一_第7张图片
项目主结构

1..gradle目录。

Android studio gradle系列一_第8张图片
gradle

gradle 运行时自动生成的目录(自动编译工具产生的文件),版本由wrapper指定。一般情况不做修改,不需要纳入项目源代码管理中。

2..idea目录。

Android studio gradle系列一_第9张图片
idea

Intellij IDEA 运行时候生成的文件目录,一般情况不做修改,不需要纳入项目源代码管理中。

3.app(module)目录。

Android studio gradle系列一_第10张图片
image.png
  • app/build:app模块编译输出的文件

  • app/libs: 放置引用的类库文件

  • app/src: 放置应用的主要文件目录

  • app/src/androidTest:单元测试目录

  • app/src/main:主要的项目目录和代码

  • app/src/main/assets:放置原生文件,里面的文件会保留原有格式,文件的读取需要通过流

  • app/src/main/java:项目的源代码

  • app/src/main/res:项目的资源

  • app/src/main/res/anim:存放动画的XML文件

  • app/src/main/res/drawable:存放各种位图文件(.png,.jpg,.9png,.gif等)和drawable类型的XML文件

  • app/src/main/res/drawable-v24:存放自定义Drawables类(Android API 24开始,可在XML中使用)

  • app/src/main/res/layout:存放布局文件

  • app/src/main/res/menu:存放菜单文件

  • app/src/main/res/mipmap-hdpi:存放高分辨率图片资源

  • app/src/main/res/mipmap-mdpi:存放中等分辨率图片资源

  • app/src/main/res/mipmap-xdpi:存放超高分辨率图片资源

  • app/src/main/res/mipmap-xxdpi:存放超超分辨率图片资源

  • app/src/main/res/mipmap-xxxdpi:存放超超超高分辨率图片资源

  • app/src/main/res/raw:存放各种原生资源(音频,视频,一些XML文件等)

  • app/src/main/res/values: 存放各种配置资源(颜色,尺寸,样式,字符串等)

  • app/src/main/res/values/attrs.xml:自定义控件时用的较多,自定义控件的属性

  • app/src/main/res/values/arrays.xml:定义数组资源

  • app/src/main/res/values/colors.xml:定义颜色资源

  • app/src/main/res/values/dimens.xml:定义尺寸资源

  • app/src/main/res/values/string.xml:定义字符串资源

  • app/src/main/res/values/styles.xml:定义样式资源

  • app/src/main/res/values-v11:在API 11+的设备上调用

  • app/src/main/res/values-v14:在API 14+的设备上调用

  • app/src/main/res/values-v21:在API 21+的设备上调用

  • app/src/main/res/AndroidManifest.xml:项目的清单文件(名称、版本、SDK、权限等配置信息)

  • app/src/.gitignore:忽略的文件或者目录

  • app/app.iml:app模块的配置文件

  • app/build.gradle:app模块的gradle编译文件

  • app/proguard-rules.pro:app模块的代码混淆配置文件

4.gradle目录及配置项.

Android studio gradle系列一_第11张图片
image.png
  • gradle/wrapper/gradle-wrapper.jar
  • gradle/wrapper/gradle-wrapper.properties 主要指定了该项目需要什么版本的Gradle,从哪里下载该版本的Gradle,下载下来放到哪里
  • .gitignore: 忽略的文件或者目录
  • build.gradle:项目的gradle编译文件
  • gradle.properties: gradle相关的全局属性设置
  • gradlew: 编译脚本,可以在命令行执行打包
  • gradlew.bat:windows下的gradle wrapper可执行文件
  • local.properties:配置SDK/NDK所在的路径
  • MyApplication.iml:保存该模块的相关信息
  • settings.gradle:设置相关的gradle脚本

部分节选自:
Android Studio项目结构详解

三.Gradle,Gradle Wrapper和Android Plugin for Gradle。

1. Gradle

Gradle是个构建系统,能够简化你的编译、打包、测试过程。
详见我之前写过的博客:java 构建工具Ant、Maven和Gradle
gradle下载地址

2. Gradle Wrapper

Gradle Wrapper称为Gradle包装器,是对Gradle的一层包装。使用Gradle Wrapper可以在没有安装Gradle的情况下使用。
为什么需要Gradle Wrapper呢?比如在一个开发团队中,如果每进来一个成员,都需要在计算机中安装Gradle,这个时候运行Gradle的环境和版本就会对构建结果带来不确定性。针对这个问题,Gradle提供了一个解决方案,那就是Gradle Wrapper,它是一个脚本,可以在计算机没有安装Gradle的情况下运行Gradle构建,并且能够指定Gradle的版本,开发人员可以快速启动并运行Gradle项目,而不必手动安装,这样就标准化了项目,从而提高了开发效率。
Gradle Wrapper生成的文件如下:

|____gradle
| |____wrapper
| | |____gradle-wrapper.jar  //具体业务逻辑
| | |____gradle-wrapper.properties  //配置文件
|____gradlew  //Linux 下可执行脚本
|____gradlew.bat  //Windows 下可执行脚本

打开gradle/wrapper/gradle-wrapper.properties 文件就可以修改配置了。根据此配置Gradle Wrapper会自动为我们下载合适的Gradle版本。默认情况下,下载位置是在$USER_HOME/.gradle/wrapper/dists。

#规定了解压后的gradle包放在哪里(一般是在~/.gradle/wrapper/dists目录)
distributionBase=GRADLE_USER_HOME 
distributionPath=wrapper/dists
#规定了gradle的zip包放在哪里
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#规定了使用哪个版本的gradle编译项目,这个地址可以配置成服务器地址或者本地地址
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

3. Android Plugin for Gradle

Android Studio构建系统基于Gradle,Android Plugin for Gradle添加了一些特定于构建Android应用程序的功能。虽然Android插件通常与Android Studio保持同步更新,但插件(以及Gradle系统的其余部分)可独立于Android Studio运行并单独更新。
在android studio中,项目的根目录下的build.gradle中会配置如下代码:

buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

这个dependencies中的gradle:3.2.0代表的就是使用gradle 插件版本 3.2.0.在编译过程中,如果gradle插件版本与gradle版本不匹配,编译就会失败.
目前在使用的gradle与gradle插件版本的对应。


Android studio gradle系列一_第12张图片

Android studio中的gradle.

1.顶级Gradle文件。

顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。 默认情况下,此顶级构建文件使用 buildscript 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项

/**
 * 构建块是您配置存储库和的位置
 * Gradle本身的依赖关系 - 意思是,你不应该包含依赖关系
 * 在这里你的模块。 例如,此块包含Android插件
 * Gradle作为依赖项,因为它提供了Gradle的附加指令
 * 需要构建Android应用程序模块。
 */
buildscript {
    /**
     * 存储库块配置Gradle使用的存储库
     * 搜索或下载依赖项。 Gradle预先配置对远程的支持
     * 存储库,如JCenter,Maven Central和Ivy。 您也可以使用本地
     * 存储库或定义您自己的远程存储库。 下面的代码定义
     * JCenter作为存储库Gradle应该用来查找它的依赖项。
     *
     * 使用Android Studio 3.0及更高版本创建的新项目也包括
     * 谷歌的Maven存储库。
     */
    repositories {
        google()
        jcenter()
    }
    /**
     * dependencies块配置Gradle需要使用的依赖项
     * 建立你的项目。 以下行添加了Gradle的Android插件
     * 版本3.2.0作为类路径依赖项。
     */
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
/**
 * allprojects块是您配置存储库和的地方
 * 项目中所有模块使用的依赖项,例如第三方插件
 * 或lib。 但是,您应该在其中配置特定于模块的依赖项
 * 每个模块级的build.gradle文件。 对于新项目,Android Studio
 * 默认情况下包括JCenter和Google的Maven存储库,但事实并非如此
 * 配置任何依赖项(除非您选择需要某些依赖项的模板)。
 */

allprojects {
    repositories {
        google()
        jcenter()
    }
}
  • buildScript块的repositories主要是为了表示只有编译工具才会用这个仓库,获取脚本依赖插件。
  • allprojects块的repositories用于多项目构建,为所有项目提供共同所需依赖包。而子项目可以配置自己的repositories以获取自己独需的依赖包。

2.模块级Gradle文件。

apply plugin: 'com.android.application'

android {
    //compilesdkversion指定Android API级别的Gradle应用于
    //编译你的应用程序。这意味着您的应用程序可以使用
    //此级别及更低级别的API。
    compileSdkVersion 28
    //buildToolsVersion指定Gradle用于构建应用程序的SDK构建工具,命令行工具和编译器的版本。 您需要使用SDK Manager下载构建工具。
    //此属性是可选的,因为默认情况下插件使用推荐版本的构建工具。
    buildToolsVersion "28.0.3"
    //defaultConfig块封装了所有构建变体的默认设置和条目,
    // 并且可以从构建系统动态覆盖main / AndroidManifest.xml中的某些属性。
    // 您可以配置产品flavor以覆盖应用程序的不同版本的这些值。
    defaultConfig {
        //applicationId唯一标识要发布的包。
        //但是,您的源代码仍应引用包名称
        //由main / AndroidManifest.xml文件中的package属性定义。
        applicationId "com.yousheng.myapplication"
        //定义运行应用程序所需的最低API级别。
        minSdkVersion 15
        //指定用于测试应用程序的API级别。
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    //您可以在buildTypes块中配置多个构建类型。
    // 默认情况下,构建系统定义了两种构建类型:debug和release。该
    //调试构建类型未在默认构建配置中显式显示,
    // 但它包含调试工具,并使用调试密钥进行签名。 发布
    // 构建类型应用Proguard设置,默认情况下不签名。
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
//依赖项在模块级构建配置文件中阻止
//指定仅构建模块本身所需的依赖项。
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    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'
}
}

  • apply plugin 表示应用了一个插件,该插件一般有两种值可选:
    一种为'com.android.application',表示该模块为应用程序模块,可以直接运行;另一种为'com.android.library',表示该模块为库模块,只能作为代码库依附于别的应用程序模块来运行。

  • android{},在这个闭包中我们可以配置项目构建的各种属性。

  • buildToolsVersion 构建工具的版本,其中包括了打包工具aapt、dx等等。可以用高版本的build-tool去构建一个低版本的sdk工程。

  • compileSdkVersion 用于指定项目的编译版本,这里指定成28表示使用Android 8.0系统的SDK编译。只影响编译时的行为,不影响运行时的行为。代码中可用的api也要与该声明版本对应,高于声明版本的api则无法找到、使用。Support库的大版本号要与compileSdkVersion的大版本号相同

  • minSdkVersion 指明应用程序运行所需的最小API level。如果Android设备的系统API level低于android:minSdkVersion设定的值,那么android系统会阻止用户安装这个应用。如果指明了这个属性,并且在项目中使用了高于这个API level的API, 那么会在编译时报错。

  • targetSdkVersion 表示你在该目标版本上已经做过了充分的兼容性处理和测试性处理,系统将会为你的应用程序启用一些最新的功能和特性。应用运行时使用的sdk版本
    例如:
    android6.0(api 23)系统的动态权限检查功能
    1、targetSdkVersion<23时:
    该应用安装在android6.0的手机上后,
    不会执行android6.0系统以上特有的动态权限检查逻辑,
    而是仍继续执行以前的权限检查逻辑。
    2、当targetSdkVersion变为23后:
    android6.0系统的动态权限检查特性将生效。
    结论
    一般minSdkVersion 不随意更改targetSdkVersion,更改targetSdkVersion必须做好兼容。

  • buildTypes 封装此项目的所有构建类型配置。

Android studio gradle系列二

你可能感兴趣的:(Android studio gradle系列一)