android知识要点整理(16)----gradle之项目结构(代码片段)

znapast znapast     2022-11-29     478

关键词:

Android app 由Gradle负责构建。Gradle构建系统定义了许多概念。

1.Project和Tasks

这个Gradle中最重要的两个概念。每次构建(build)至少由一个project构成,一个project 由一到多个task构成。项目结构中的每个build.gradle文件代表一个project,在这编译脚本文件中可以定义一系列的task;task 本质上又是由一组被顺序执行的Action`对象构成,Action其实是一段代码块,类似于Java中的方法

2.构建生命周期

每次构建的执行本质上执行一系列的Task。某些Task可能依赖其他Task。哪些没有依赖的Task总会被最先执行,而且每个Task只会被执行一遍。每次构建的依赖关系是在构建的配置阶段确定的。每次构建分为3个阶段:

  • Initialization: 初始化阶段 ;这是创建Project阶段,构建工具根据每个build.gradle文件创建出一个Project实例。
  • Configuration:配置阶段;这个阶段,通过执行构建脚本来为每个project创建并配置Task。
  • Execution:执行阶段;这是Task真正被执行的阶段,Gradle会根据依赖关系决定哪些Task需要被执行,以及执行的先后顺序。

3.构建配置文件

为了能够在Android项目中使用Gradle构建项目,我们需要在顶层目录新建build.gradle配置文件,用来配置构建脚本相关属性。基本内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    

除此之外,顶层的配置文件中还可以用来配置android项目各个模块的通用属性。配置内容放置在allprojects代码块中。如下所示:

allprojects 
    repositories 
        jcenter()
    
    //其他配置

同时,每个模块有自己的单独的配置文件,内容结构大致如下:

//表示该模块为应用模块,类似的有library模块
apply plugin: 'com.android.application'

//针对android 属性的一些配置
android 
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig 
        applicationId "com.example.android.animationsdemo"
        minSdkVersion 14
        targetSdkVersion 23
    

    buildTypes 
        release 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        
    


//模块的依赖关系
dependencies 
    compile 'com.android.support:support-v4:24.0.0-alpha2'
    compile 'com.android.support:support-v13:24.0.0-alpha2'
    compile 'com.android.support:recyclerview-v7:24.0.0-alpha2'
    compile project(path: ':backend', configuration: 'android-endpoints')

4.Gradle项目结构

针对Android的单模块gradle目录结构如下:

MyApp
├── build.gradle
├── settings.gradle
└── app
    ├── build.gradle
    ├── build
    ├── libs
    └── src
        └── main
            ├── java
            │ └── com.package.myapp
            └── res
                ├── drawable
                ├── layout
                └── etc.

模块关键目录的解释如下:

目录内容
/src/main/javaapp模块的源代码
/src/main/res相关资源 (如drawables, layouts, strings等等)
/libs第三方代码库(.jar 或者 .aar)
/buildThe output of the build process

5.认知Gradle Wrapper

Android Studio中默认会使用 Gradle Wrapper 而不是直接使用Gradle。命令也是使用gradlew而不是gradle。这是因为gradle针对特定的开发环境的构建脚本,新的gradle可能不能兼容旧版的构建环境。为了解决这个问题,使用Gradle Wrapper 来间接使用 gradle。相当于在外边包裹了一个中间层。对开发者来说,直接使用Gradlew 即可,不需要关心 gradle的版本变化。Gradle Wrapper 会负责下载合适的的gradle版本来构建项目。
正如上面说的,使用Android studio创建Android项目时,系统会默认使用Gradle Wrapper。但是如果项目是从Eclipse移植而来,那么我们需要手动添加对Gradle Wrapper的支持。具体步骤如下:

  • 安装Gradle工具,并且把gradle命令添加到环境变量。
  • 在项目的顶层目录中的build.gradle文件中添加如下代码(新版gradle可以省略这一步,因为wrapper task 默认包含在项目中):
task wrapper(type: Wrapper) 
    gradleVersion = '2.4'
  • 然后执行如下命令:
gradle wrapper --gradle-version 2.4

这样之后,项目中会生成如下结构的文件目录:

myapp/
    ├── gradlew //命令脚本
    ├── gradlew.bat //命令脚本
    └── gradle/wrapper/ //jar文件
            ├── gradle-wrapper.jar
            └── gradle-wrapper.properties //属性文件

其中属性文件具体内容如下:

#Mon Dec 28 10:00:20 PST 2015
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\\://services.gradle.org/distributions/gradle-2.10-all.zip

6.移植Eclipse项目到Android Studio

Android 提供了自动导入Eclipse项目的方法。但是我们只讲如何手工将Eclipse项目变为Android Studio可以直接使用的项目。
一种方法是保留原有的目录结构。下面是具体步骤
1. 在项目根目录中创建build.gradle配置文件。最基本的内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    


apply plugin: 'com.android.application'

android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

2 为了保持原有目录结构,我们需要修改source set。在build.gradle 文件末尾的android 代码块中添加如下内容:

android 

    //...

    sourceSets 
        main 
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        
        androidTest.setRoot('tests')
    

3.同时,添加依赖关系,如下:

 dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])

一种是转换为Android Studio 默认的目录结构。具体步骤如下:
1.手动建立相应的目录。下面的表格是新旧目录的映射关系:

旧目录新目录
src/app/src/main/java
res/app/src/main/res
assets/app/src/main/assets
AndroidManifest.xmlapp/src/main/AndroidManifest.xml

2.在项目根目录中创建settings.gralde文件,这个文件只能写一行内容,用于告诉构建系统在构建时将app模块包含进去:

include ':app'  

3.在项目根目录中创建build.gradle,用于配置项目级的属性。内容如下:

buildscript 
    repositories 
        jcenter()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:1.2.3'
    

4.在app模块目录创建build.gradle,用于配置模块级的属性。内容如下:

apply plugin: 'com.android.application'
android 
    compileSdkVersion 22
    buildToolsVersion "22.0.1"

dependencies 
    compile fileTree(dir: 'libs', include: ['*.jar'])

这样,Eclipse项目就成功地转为Android Studio项目。仔细观察会发现,第一种方法只用到了一个build.gradle文件,它将第二种方法中的2个build.gradle文件合为一体。第一方法更为简单,但是第二种方法更加符合趋势,以后扩展起来也更加方便。

以上就是Gradle android 项目结构的相关知识要点。

android知识要点整理(13)----网络连接(代码片段)

...,监控网络状态以及控制网络的使用。连接到网络在Android平台,首先要声明使用网络的权限。<uses-permissionandroid:name="android.permission.INTERNET"/><uses-permis 查看详情

android知识要点整理(12)----animation(动画)

动画分类Android动画有3类:帧动画、视图动画、属性动画。帧动画和视图动画又统称为补间动画。Android3.0(APILEVEL11)开始支持属性动画。帧动画帧动画是针对Drawable资源的动画。其本质是一系列Drawable资源的连续变化,... 查看详情

android知识要点整理(19)----gradle之构建变体(代码片段)

构建类型(BuildType)和产品渠道(ProductFlavor)的结合,称之为构建变体(BuildVariants)。1.构建类型(BuildType)构建类型用于定义如何去构建一个APP.每一种类型可以定义是否包含DEBUG信息,applicationId等信息。我们可以... 查看详情

android知识要点整理(20)----gradle之多模块管理(代码片段)

AndroidStudio不仅支持创建library和app模块,还支持为AndroidWear,AndroidTV,GoogleAPPEngine等创建模块。1.多模块结构多模块结构可以是如下所示的结构:project├───setting.gradle├───build.gradle├───app│└───build.gradl... 查看详情

android知识要点整理(11)----scenesandtransitions(场景和变换)(代码片段)

...间动画、属性动画)等作用于单个控件的动画,Android还提供了一种类似的动画的功能,用于在两个不同的布局切换时提供过渡动画效果—-TransitionsFramework。TransitionsFramework简介该框架帮助在布局改变的时候增加动画效... 查看详情

android知识要点整理(21)----gradle之创建任务和插件(代码片段)

1.定义Tasks先看创建Tasks的代码示例://方式1taskhello//方式2taskhelloprintln'Hello,world!'//方式3taskhello<<println'Hello,world!'//方式4task(hello)<<println'Hello,world!'//方式5tas 查看详情

android知识要点整理----拍照和录像(代码片段)

...c;有两种方式可以实现,一种是调用拍照APP,比如Android系统自带的CameraAPP;另一种就是完全自己写,自己调用照相机的API,控制快门等,实现类似CameraAPP的应用。第一种相对简单,第二种就比较复杂。... 查看详情

android知识要点整理(18)----gradle之依赖管理(代码片段)

Gradle在依赖管理方面非常出色,要添加依赖有多种方式,每种方式都特别方便。接下来就讲一讲以依赖管理方面的要点。1.仓库(Repositories)仓库可以看作文件的集合,它可以用来提供依赖源。Gradle支持3种类型的仓... 查看详情

android知识要点整理(10)----bitmap缓存策略(代码片段)

...存,减少从磁盘或网络加载的次数,提升性能。Android系统为 查看详情

android知识要点整理----音频播放管理(代码片段)

APP中播放音频,最重要的一点就是要保证用户能够按预期的来控制音频的播放,还有就是保证多个APP不会同时播放音频。为了达到这两点要求,我们需要掌握如何控制音频的音量和播放,如何控制同一时刻只有有... 查看详情

android知识要点整理----bitmap图片处理和展示(代码片段)

在Android系统中,图片都是以Bitmap的形式呈现在UI界面上的。Bitmap通常是比较消耗内存的,而AnroidAPP都有内存大小限制,所以当我们显示比较大的图片时很容易出现内存溢出的情况。下面就重点讲一讲如何更好地处理Bit... 查看详情

android知识要点整理(19)----gradle之构建变体(代码片段)

...以在buildTypes代码块下定义构建类型,如下所示:androidbuildTypesreleaseminifyEnabledfalseproguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'我们可以很容易的创建自定义的构建类型,如下的构建类型定... 查看详情

android知识要点整理(18)----gradle之依赖管理(代码片段)

Gradle在依赖管理方面非常出色,要添加依赖有多种方式,每种方式都特别方便。接下来就讲一讲以依赖管理方面的要点。1.仓库(Repositories)仓库可以看作文件的集合,它可以用来提供依赖源。Gradle支持3种类型的仓... 查看详情

android知识要点整理(21)----gradle之创建任务和插件(代码片段)

1.定义Tasks先看创建Tasks的代码示例://方式1taskhello//方式2taskhelloprintln'Hello,world!'//方式3taskhello<<println'Hello,world!'//方式4task(hello)<<println'Hello,world!'//方式5task('hello')<<println'Hello,world!'//... 查看详情

android知识要点整理(17)----gradle之自定义构建(代码片段)

通过Gradle,我们可以灵活地定制构建中的变量,从而方便灵活地控制构建过程。1.理解三个文件Gradle项目有3个重要的文件需要深入理解:项目根目录的build.gradle,settings.gradle和模块目录的build.gradle。1.settings.gradle文件会... 查看详情

知识要点整理

extjs以及serverlessapi突破 extjs是基础javapython可以写serverlessapijava可以理解webbuilder解析器,李金良要推进xwl2html抽离,等李金良完成java版本xwl2html,郭廷涛完成pythonxwl2html李金良郭丰王占兴郭庭涛都要掌握extjs李金良郭丰王占兴郭庭... 查看详情

elasticsearch基础知识要点qa

...果的记录型博客。在此统一感谢各原作者,如果你对基础知识不甚了解,可以通过查看Elasticsearch权威指南中文版,此处注意你的elasticsearch版本,版本不一样,可能有偏差Q1:Elasticsearch是如何实现Master选举的Elasticsearch的选主是ZenDisc... 查看详情

随手整理:知识付费模式

随手整理:知识付费模式内容原创快速迭代持续更新打赏免费查看一部分打赏后可以获得全部内容问答解答付费查看答案付费内容包月服务点赞分享F4NNIU(2018-10-16) 查看详情