【Android 项目构建】深入理解Gradle

ADG同步性能优化:如何正确配置standby redolog避免WAIT_FOR_LOG状态 本文深入剖析了Oracle ADG(Active Data Guard)同步中常见的WAIT_FOR_LOG状态,指出其根源在于Standby Redo Log(SRL)配置不当。文章提供了从诊断到优化的完整实践指南,重点阐述了SRL大小匹配、组数充足等黄金配置法则,帮助架构师从根本上避免同步延迟,实现稳定高效的实时数据同步。 阅读详情

一、Gradle基础

1、Gradle是什么?

        Gradle是以groovy为编程语言,面向java应用的自动化构建工具。

 

2、Gradle文件的三种类型:

(1)类型:settings.gradle、根目录下build.gradle、module目录下build.gradle。

(2)执行顺序:settings.gradle在初始化阶段执行,根目录下build.gradle和module目录下build.gradle在配置阶段进行配置,其中,根目录下build.gradle具有全局性。

 

3、build.gradle构建文件中五大基本元素:

build.gradle文件中基本的元素有:defaultConfig(默认配置)、buildTypes(构建类型)、dependencies(依赖)、productFlavors(渠道包配置)、signingConfigs(签名配置)。

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.0"

    defaultConfig {
        applicationId "com.ctrip.demo"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            buildConfigField "String", "API_URL", "\"http://example.com/api\""
            buildConfigField "boolean", "LOG_OUTPUT", "false"
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        staging {
            applicationIdSuffix ".colinambitious"
            versionNameSuffix "-staging"
        }
        debug {
            buildConfigField "String", "API_URL", "\"http://test.example.com/api\""
            buildConfigField "boolean", "LOG_OUTPUT", "true"
        }
    }

    productFlavors {
        red {
            applicationId 'com.colinambitious.red'
            versionCode 3
        }
        blue {
            applicationId 'com.colinambitious.blue'
            versionCode 4
        }
        free {
            applicationId 'com.colinambitious.free'
            versionCode 5
        }
        paid {
            applicationId 'com.colinambitious.paid'
            versionCode 6
        }
    }

    signingConfigs {
        staging.initWith(signingConfigs.debug)

        release {
            storeFile file("release.keystore")
            storePassword "secretpassword"
            keyPassword "secretpassword"
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:26.0.0-alpha1'
    compile project(path: ':PublicProduct')
//    compile project(path: ':mylibrar')
    compile project(path: ':Tour')

}

 

二、依赖管理

    “依赖管理”主要包含两个方面:“仓库依赖”和“项目依赖”。“仓库依赖”指的是对仓库的定义,在定义好仓库之后,就可以在dependencies里通过类似如下代码的形式添加依赖了。

compile 'com.android.support:appcompat-v7:26.0.0-alpha1'

    “项目依赖”有两种方式:module依赖 和 aar包依赖。

 

 1、依赖仓库

        (1)预定义依赖仓库

        (2)远程仓库

        (3)本地仓库

repositories {
        jcenter()
        maven {
            url "http://maven.dev.sh.ctripcorp.com:8081/nexus/content/groups/public"
        }
        flatDir {
            dirs '../CTRepo'
        }
    }

jcenter()就是第一种仓库依赖,即预定义依赖仓库。一般我们在开发过程中想要把自己项目的jar包开源出来,就可以放到jcenter()上。

如上代码的第二种方式就是远程仓库的定义,可以看到代码里设置了自定义的maven仓库。

flatDir就是用来定义本地仓库的方式。

2、项目依赖

        (1)module依赖

            首先在settings.gradle中include进需要依赖的module,然后通过如下代码在需要依赖的module添加如下依赖 

dependencies {
    compile project(path: ':Business')
}

        (2).aar文件依赖

            首先通过flatDir定义本地仓库,然后在需要依赖的module下加入如下依赖(其中,name为aar的名字,ext为扩展名)

dependencies {
    compile(name:'myaar-release', ext:'aar')
}

 

三、Gradle任务

1、Groovy核心语法:

(1)build.gradle与project对象的关系:

每一个build.gradle都对应一个project对象。比如,我们apply "com.android.application"其实调用的是project.apply “com.android.application”。

 

(2)属性

为project对象定义属性的方法是

ext {
    app_name = "AndroidDemo_root"
}

 

(3)变量

    def localProperties = rootProject.file('local.properties')

 

(4)方法:

        (a)方法定义

int getApplicationID() {10752}

 

        (b)方法调用

def test = getApplicationID()

 

2、创建任务

(1)追加任务

task hello << {
    println "hello, world;root_project_name is ' + ${app_name}";
}

 

(2)创建任务

tasks.create(name: 'hello') << {
     println 'Hello, world!'
}

 

(3)依赖任务

hello.dependsOn test

 

3、执行任务

(1)task.execute()即可执行

(2)命令行执行 gradlew task

 

4、beforeEvaluate和afterEvaluate

分别在配置前和配置后执行

 

四、Gradle任务在实际项目中应用

1、在实际场景下经常有这样的需求:gradle中某个配置只有在debug模式下才能生效,那么这该如何实现呢?

最初想到的方案是,通过ext定义一个属性,在buildTypes在release里设置为true,在debug里设置为false,然后根据这个属性的值来判断是否引入。然而,gradle中代码是从上向下执行的,所以,这个变量就永远被置为false。

最终想到如下方案:

List<TaskExecutionRequest> taskRequests = gradle.startParameter.getTaskRequests();
if (taskRequests.size() > 0) {
    String args = taskRequests.get(0).toString();
    if (args.toLowerCase().contains("assembledebug")) {
        println  "test output test outpu test outpu "
        println  "test output test outpu test outpu "
        println  "test output test outpu test outpu "
    }
}

 

2、每定义一个Activity就要在manifest里注册一个Activity,这样是不是很烦?可以在gradle文件中实现。具体实现,等待我后续的blog吧~

 

 

五、最后

如果疑问,欢迎email联系我 zhshan@ctrip.com

 

让 ABAP BAPI_COSTACTPLN_POSTPRIMCOST 不再沉默:一套可落地的参数一致性校验与排错打法 SAP BAPI_COSTACTPLN_POSTPRIMCOST 沉默失败分析与解决方案 问题现象 使用 BAPI_COSTACTPLN_POSTPRIMCOST 上传计划数据时,接口执行不报错但数据未写入 COSP 等计划表,呈现"沉默失败"现象。 根本原因 索引关联断裂:INDEXSTRUCTURE 中 OBJECT_INDEX 和 VALUE_INDEX 未正确关联 COOBJECT 和 PERVALUE/TOTVALUE 表的数据 对象定义冲突:COOBJECT 中同一行填写了多 阅读详情

相关推荐

python cartopy绘制扇形区域图/cartopy绘制北极部分区域

实际上,这个问题原因还是由于投影转换的问题,在set_extend时,绘制的上下边界仍然是方形、未被正确投影的边界,与我们的set_boundary存在冲突,最根本的原因还是在于cartopy对于投影计算的一些缺陷。另外我们需要指出的是:**该方法不适用于极地投影,即NorthPolarStereo,由于NorthPolarStereo本身投影特性只需一个参数,本身并不适合。我们绘制极地投影时,同样也是使用set_boundary绘制圆形边界,那么当我们想要绘制扇形时,可以通过。请根据喜好自行选择,

weixin_43750300的博客 3212

使用Gradle编写蒲公英自动上传安装包和更新说明脚本

Github: github.com/windinwork/… 平时测试中发包的时候,笔者在打完包就直接拖到蒲公英上让它上传就完事了。不过前两天的会议上,测试小姐姐提出要在蒲公英上写明这次的测试包修改了什么内容。 笔者一想到上传完包还要一个个打字说明在这个包我修改了什么,立即强烈拒绝!但是测试小姐姐再三要求,碍于这确实是个好提议和会上坐着的老大,只好勉为其难地答应发包时写上改动内容T_T。...

Two212250511的专栏 887

QCC308X/518X/309X加LDAC解码

QCC308X/518X/309X加LDAC解码。

Alex_886的博客 6609

Android studio gradle中分渠道加载res、libraries及Class

前段时间遇到这样的需求,在App里使用了地图功能,对应海外版使用Android内置google的地图服务。而对于国内版(大家都知道的),我们使用了高德地图。而在导入高德地图的时候需要加入对应的sdk及.so文件,这样最后打包的大小会增加2M左右。但海外版并不需要这部分资源,故需要根据不同的渠道加载不同的jar、res、及不同的类,有助于保持代码的干净,控制包的大小。不多说了,直接上步骤!1)首先要获

xinpings的博客 1317

西工大noj100题python2024第一季1-10

【代码】西工大noj100题python2024第一季1-10。

weixin_70523540的博客 1800

STM32实战指南:TFTLCD液晶屏驱动与ILI9341应用解析

本文详细解析了STM32驱动TFTLCD液晶屏的实战技巧,重点介绍了ILI9341控制器的硬件连接、寄存器操作及性能优化方法。通过8080并行接口时序分析、GRAM操作优化和DMA传输应用,帮助开发者高效实现液晶屏驱动,适用于工业控制、智能家居等场景。

weixin_26873711的博客 232

gradle 神器编译不同的渠道包

最近项目中每次遇到适配不同渠道的问题就头大,今天就在此总结整理一下遇到的问题吧。 首先假定一种需求:一款APP有两种版本,分别是免费版和付费版,需要在三个国家(中国,美国,英国)上线,那么一共就是6个版本,其中英国免费版需要添加一个google广告依赖。 分渠道当然是使用 productFlavors了。 productFlavors { cnpayed {

looookery的专栏 3642

在Docker中集成GPU监控体系

先上效果图 等文档整理出来再更

tamako0v0的博客 2471

17. Gradle编译其他应用代码流程(五) - 设置Task过程

接上一篇15. Gradle编译其他应用代码流程(四) - Configure过程继续分析一. task选择到了这个阶段,gradle开始计算task入口是哪个? 选择的逻辑是这样:如果用户收入了task,比如这样的指令'gradle pmd',那么就执行pmd这个task如果用户没有输入task,比如直接输入'gradle',那么看有没有默认的task如果没有默认的ta...

weixin_33854644的博客 265

深入解析安卓性能分析工具systrace/atrace的使用技巧与实战场景

本文深入解析了安卓性能分析工具systrace/atrace的核心使用技巧与实战场景。文章澄清了环境搭建的常见误区,详细拆解了命令参数,并通过列表卡顿、启动优化等具体案例,手把手指导开发者利用这些工具精准定位性能瓶颈,提升应用流畅度。

yyy34的博客 240

ABAP CDS 视图的 SAP 缓冲全解析:从 DDIC-based 到 View Entity Buffer 的最佳实践与可运行示例

本文深入探讨了SAP ABAP CDS视图中的缓冲机制,重点介绍了在DDIC-based CDS视图中使用@AbapCatalog.buffering.*注解以及在CDS View Entity中使用独立缓冲对象两种配置方式。文章首先阐述了SAP缓冲的价值,特别适用于读多写少的业务场景(如主数据访问),能够显著降低数据库负载和响应延迟。核心内容分为三部分:1)DDIC-based CDS视图中的三个关键注解(缓冲状态、缓冲类型和通用缓冲键字段数)及其使用限制;2)新一代CDS View Entity中通过独

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 187

3.gradle生命周期

"在配置阶段完成后执行,"project beforeEvaluate"没有打印是因为beforeEvaluate发生在配置之前,初始化阶段之后,由于我们的命令并不会执行初始化所以没有打印。当一个新的任务被创建并添加到当前项目时,这个钩子就会被执行,并且执行在project afterEvaluate之前,可见也是在配置阶段。通过这些钩子,我们可以动态修改配置、改变任务行为或者添加新的功能,以适应项目的特性和需求。发生在执行阶段,它们允许你在任务执行之前或之后添加自定义的操作步骤。

qq_36017595的博客 1088

量化交易:如何在QMT中运行Python策略并在VSCode中高效调试?

哈喽,大家好,我是木头左!

木头大左的博客 3759

gradle生命周期

深入理解Android之Gradle

tuhuolong的专栏 1556

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Gradle 重点讲解

一、Gradle理论 Gradle,这是一个基于 JVM 的富有突破性构建工具。Gradle 正迅速成为许多开源项目和前沿企业构建系统的选择,同时也在挑战遗留的自动化构建项目。Gradle使用语言是Groovy。 适用于自动化地进行软件构建、测试、发布、部署、软件打包的项目。 对于Gradle在Android Studio里面的作用可以简单理解为:是一种项目构建工具。用过Eclipse的都知...

IBM_Forever 4074

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android Studio项目Gradle构建实践

文章主要描述Android Studio中使用Gradle构建的9个模块,主要有: 1、defaultConfig 2、buildType 3、flavor 4、sourceSet 6、Dependencies

Final Object 的博客 4623

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android中gradle的作用,Gradle 之 Android 中的应用

在上一篇文章中 Gradle 之语言基础 Groovy 主要介绍了 Groovy 的基础语法(如果没有 Groovy 的基础,建议先看看上篇文章,如果可以动手敲一下里面的示例代码就更好不过了),也是为本篇文章打基础的。本篇文章主要介绍 Gradle 在 Android 中的应用(Android DSL 和 Gradle DSL),也是通过一些示例来介绍和理解,主要分为以下一些内容,示例代码都在 G...

weixin_33575588的博客 372

Android开发(一)——认识第一个项目

Android开发之认识项目结构

hhhhh_555的博客 770

android运行别人的项目_没有IDE,该如何创建Android项目并运行

前言回到起初,我们在编写Java Hello World的时候,可以不借助任何IDE完成编译并且运行,但是到了学习Android的时候,却很少看到有文章不使用Android Studio创建Hello World项目的,如今依然记得通过Eclipse创建Android项目的时候,这个坑爹玩意儿差点没劝退,所以有了本篇文章,在下面的操作中,我们不会借助任何IDE,纯手创建各种文件并且运行到...

weixin_34379989的博客 299

Android studio gradle文件说明与配置

.gradle 文件简单介绍一个 Android Studio 项目中,会存在多个 .gradle 文件。其中, project 目录下存在一个 build.gradle 文件和一个 settings.gradle 文件;每一个 module 会存在一个 build.gradle 文件。project中的build.gradlebuildscript { repositories { jce

Android移动开发 5234

AndroidStudio目录结构 APP构建流程 Jenkins持续集成构建 Gradle介绍 Proguard混淆

Android Studio目录结构 通常我们是将工程设置成project模式,这个模式下我们的工程有很多目录: .gradle:包含一些Gradle编译脚本,gradle是Google推荐的编译工具 .idea:包含AndroidStudio开发工具需要的文件,里面有一些版权声明,库文件,配置文件等 .app:如果我们不修改moudle,那默认就算app,这是我们的项目文件,包含我们编写的...

Mango先生的博客 1837

Gradle for Android Developers (一): 理解 Gradle 文件

本文内容主要来源:Gradle for Android (中文版) Gradle 虽然每天都在自己的眼皮底下,也大致知道他们的作用,但是比较笼统,这件事情怎么允许发生呢,所以自己具体学习 Gradle ,主要依托 Gradle for Android (中文版) 这本书,大致记录大致,以供回头翻看。 在 Android 项目中的 Gradle的三个文件,他们分别是setting.gra...

Strange_Monkey的博客 345

Gradle学习目录总结

如果是你想干的事情,在别人看起来可能是很难的一件事,不过你自己很喜欢,你不会觉得很苦。我开始创业那会是28岁。对我来讲,我创业的目的不是为了自己当老板,我希望有一个平台有一个环境,我可以控制一些资源,让我去创造一个新的产品和服务; —— 周鸿祎 Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的领域特

北漂周的专栏(微信:stchou_zst) 4088

idea 导入gradle一直转圈圈_Gradle这么差还来面腾讯?

码个蛋(codeegg)第 638 次推文作者:厘米姑娘原文:https://www.jianshu.com/p/1274c1f1b6a4前言在使用Android Studio过程中没少被Gradle坑过,虽然网上有很多简单粗暴的解决方案,但极少会说清楚缘由,所以一直想看一本叫《Android Gradle权威指南》。不过由于书中实践内容很多,更像一本工具书,而且Gradle现已发行了好...

weixin_39736150的博客 465

Android Studio里的Gradle的初探索

Gradle构建系统的学习系列文章推荐

红柳的博客 268

Gradle超级详细解析

android gradle配置详解 AppExtension类及其属性 可能大部分人看到AppExtension类会感觉到非常的陌生,其实我们在app中的build.gradle中填写配置信息的时候,经常看到它,它是什么呢? 如果你按ctrl+鼠标左键对着android{},点击进去就知道了,其实android...

奋斗 1875
上一篇: 【Android 开源框架】ButterKnife集成Android Studio
下一篇: 【Android 实战】mac下反编译apk
Colin_Mindset
博客等级 码龄12年 159粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值