越写悦快乐之重拾Android开发之构建工具

喝水的大象 - 图片来自简书App

今天的越写悦快乐系列文章为大家带来Android开发必备的构建工具Gradle的基本使用和简要说明。犹记得2015年刚上手Android开发的时候还使用的是Maven来构建Android应用程序,使用的开发环境还是Eclipse,转眼间四年过去了,Android的原生开发和现有的跨平台开发融为一体,为构建快速响应的应用提供了不一样的性能,让用户真正感受到多快好省(有没有想要京东的广告🤣),当然这也是现代软件工程和互联网产品追求的终极目标。

Gradle介绍

Gradle可以帮助开发者更快地构建、自动化和交付软件产品,让你的开发更容易。

支持的集成开发环境

支持从Maven迁移到Gradle

Maven和Gradle的对比

从一个Android项目入手来看Gradle的基本使用

Gradle脚本 - 图片来自简书App

从上图中我们可以获取什么信息呢?

  • build.gradle - (项目名称) - 项目的基础配置
  • build.gradle - (模块名称) - App模块配置
  • gradle-wrapper.properties - Gradle版本配置
  • proguard-rules.pro - 模块的混淆规则配置
  • setting.gradle - 项目的模块声明
  • local.properties - 当前电脑的Android SDK及NDK路径配置,一般情况下项目启动会自动识别配置好的路径

接下来我们看看项目的Gradle配置信息是怎么样的:

依赖版本 - 图片来自简书App
远程仓库 - 图片来自简书App

buildscript标签中我们可以看到在项目的Gradle配置中声明了子模块使用的第三方依赖版本,然后就可以在子模块直接引用此处的声明,可以做到统一声明、统一管理和统一更新的目的,也让你的项目配置更加集中化,而后续的allprojects标签中则声明了远程仓库的地址,最近一个task标签则表明了清理项目要执行的命令,也就是删除项目目录下build目录。

声明使用阿里云仓库的契机来自于今天下午jcenter仓库频繁出现502的错误,不得已才添加阿里云的镜像仓库,为阿里云的镜像仓库点赞,也为中国有这样的互联网公司感到无比自豪和骄傲。

最后我们在子模块中使用项目模块中的第三方依赖库,写法如下:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':treeadapter')
    implementation "com.android.support:support-v4:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:appcompat-v7:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:cardview-v7:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:gridlayout-v7:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:recyclerview-v7:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:design:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:support-v13:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support.constraint:constraint-layout:$rootProject.ext.constraintLayoutVerson"
    implementation "com.android.support:support-fragment:$rootProject.ext.supportLibraryVersion"
    implementation "com.android.support:animated-vector-drawable:$rootProject.ext.supportLibraryVersion"

    // MVVMHabit
    implementation "com.github.goldze:MVVMHabit:$rootProject.ext.mvvmHabitVersion"

    // Pager Bottom Tab Strip
    implementation "me.majiajie:pager-bottom-tab-strip:$rootProject.ext.pagerBottomTabStripVersion"

    // Binding Collection Adapter
    implementation "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter:$rootProject.ext.bindingCollectionAdapterVersion"
    implementation "me.tatarka.bindingcollectionadapter2:bindingcollectionadapter-recyclerview:$rootProject.ext.bindingCollectionAdapterVersion"

    // Debug DB
    implementation "com.amitshekhar.android:debug-db:$rootProject.ext.debugDbVersion"

    // Debug Bridge Tool
    implementation "com.facebook.stetho:stetho:$rootProject.ext.stethoVersion"
    implementation "com.facebook.stetho:stetho-okhttp3:$rootProject.ext.stethoVersion"
    implementation "com.facebook.stetho:stetho-js-rhino:$rootProject.ext.stethoVersion"

    // Leak Canary
    implementation "com.squareup.leakcanary:leakcanary-android:$rootProject.ext.leakCanaryVersion"
    implementation "com.squareup.leakcanary:leakcanary-support-fragment:$rootProject.ext.leakCanaryVersion"

    // Multi Dex
    implementation "com.android.support:multidex:$rootProject.ext.multiDexVersion"

    // Smart Table
    implementation "com.github.huangyanbin:SmartTable:$rootProject.ext.smartTableVersion"

    // Recycler Tree View
    implementation "com.github.TellH:RecyclerTreeView:$rootProject.ext.recyclerTreeViewVersion"

    // Android PDF Viewer
    implementation "com.github.barteksc:android-pdf-viewer:$rootProject.ext.androidPdfViewerVerson"

    // Smart Refresh Header
    implementation "com.scwang.smartrefresh:SmartRefreshHeader:$rootProject.ext.smartRefreshLayoutVersion"

    // Smart Refresh Layout
    implementation "com.scwang.smartrefresh:SmartRefreshLayout:$rootProject.ext.smartRefreshLayoutVersion"

    // Smart Refresh Footer
    implementation "com.scwang.smartrefresh:SmartRefreshLayout:$rootProject.ext.smartRefreshLayoutVersion"

    // Status Bar Compat
    implementation "com.githang:status-bar-compat:$rootProject.ext.statusBarCompatVersion"

    // Room Database
    implementation "android.arch.persistence.room:rxjava2:$rootProject.ext.roomDatabaseVersion"
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    annotationProcessor "android.arch.persistence.room:compiler:$rootProject.ext.roomDatabaseVersion"

    // Unit Tests
    testImplementation "junit:junit:$rootProject.ext.junitVersion"
    testImplementation "org.mockito:mockito-core:$rootProject.ext.mockitoVersion"

    // UI Testing
    androidTestImplementation "com.android.support.test.espresso:espresso-core:$rootProject.ext.espressoVersion"
    androidTestImplementation "com.android.support.test.espresso:espresso-intents:$rootProject.ext.espressoVersion"
    androidTestImplementation "org.mockito:mockito-core:$rootProject.ext.mockitoVersion"
}

// Conflict Resolution for Android Support
configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        def requested = details.requested
        if (requested.group == 'com.android.support') {
            if (!requested.name.startsWith("multidex")) {
                details.useVersion '28.0.0'
            }
        }
    }
}

个人感想

很荣幸通过以上知识点的梳理,让我们对Gradle的使用有了一个更加直观的认识,也让Android开发之路更加顺畅,起码我们在开发、构建和运行应用的过程中,对于Logcat中出现的错误有一个更加逻辑性的思考,而不是想不明白为什么会出现这样的错误,当然在使用Gradle构建Android应用的过程中会出现一些莫名其妙的错误,比如拉取第三方依赖库问题,DataBinding的绑定问题,R文件的生成问题,Support库的多版本冲突问题,网络请求的捕获问题,数据监听的异常问题,复杂页面的布局错乱问题,这些林林总总的问题或多或少地影响着我们的工作状态,偶尔会打击我们的信心,我们相信只有夯实基本功,才能在开发的过程中快速准确地定位问题,进而解决问题,我们的目标是提升工作效率,工作不是人生的全部,但是我们希望有更多的时间去陪伴家人和孩子,让我们一起成为更优秀的自己。若是我的文章对你有所启发,那将是我莫大的荣幸。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,688评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,559评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,749评论 0 226
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,581评论 0 191
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,741评论 3 271
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,684评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,122评论 2 292
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,847评论 0 182
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,441评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,939评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,333评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,783评论 2 236
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,275评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,830评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,444评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,553评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,618评论 2 249

推荐阅读更多精彩内容

  • 说明 本文主要介绍和Gradle关系密切、相对不容易理解的配置,偏重概念介绍。部分内容是Android特有的(例如...
    jzj1993阅读 15,318评论 1 62
  • 在 Android Studio 构建的项目中,基于 Gradle 进行项目的构建,同时使用 Android DS...
    Ant_way阅读 7,226评论 0 16
  • 1.介绍 如果你正在查阅build.gradle文件的所有可选项,请点击这里进行查阅:DSL参考 1.1新构建系统...
    Chuckiefan阅读 11,963评论 8 72
  • 出去玩了四天,有种脱胎换骨的感觉。30年了,重新感受自己,不一样的自己,发现改变真的是可以发生的。 平时,我是一个...
    丁冬哒哒阅读 1,194评论 3 4
  • 星星早已凿成洁净深隧洞房 每个洞房花开甜蜜故事,香气扩散 月光轻轻梳理,满头银发 残存几根倔强乌黑 偏与回忆争执,...
    忠志_3d7b阅读 121评论 0 1