Skip to content
Ider

沉淀我所学习,累积我所见闻,分享我所体验

Primary Navigation Menu
Menu
  • Home
  • About Ider
    • Who Ider?
    • Why Ider?
    • How Ider?
    • Where Ider?
    • What Ider?

Gradle

2019-08-29
29 August
On August 29, 2019
In Data Structures(数据结构), Knowledge Base(心得笔库), Mobile Development(移动开发), Software Engineering(软件工程)

Gradle android-library 的各种坑

软件开发随着项目越来越大,我们会开始拆封出多个子项目(sub-project)或者库(library)来更好地独立维护。Android开发也不例外,我们也会需要创建各种库。如果使用Android Studio和Gradle,他们为我们提供了便捷的方式来创建libray。但是他们也带来了不少的维护问题,本文就来讲讲android-library里的坑来帮助大家避开。

android-library v.s. java-library

对于普通Android手机项目,我们有创建两种不同的Library可以选用: android-library 和 java-library

它们的gradle文件内容分别如下

[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]

apply plugin: 'com.android.library'

android {
    // ...
}

dependencies {
    // ...
}

[/codesyntax]

[codesyntax lang=”groovy” lines=”normal” highlight_lines=”1″]

apply plugin: 'java-library'

sourceCompatibility = "7"
targetCompatibility = "7"

dependencies {
    // ...
}

[/codesyntax]

两种库在定义上的根本差别其实就是不同gradle plugin的使用。另一个小的差别就是android-library需要有一个 AndroidManifest.xml 文件,但它可以简单到只有一行内容(其中package的值通常是文件夹的路径)

[codesyntax lang=”xml” lines=”normal”]

<manifest package="com.ider.android.library" />

[/codesyntax]

使用上他们有一些差异,这些差异也是我们决定使用哪种Library的标准:

  • android-library 可以使用 Android API(比如Activity, Service等等),java-library 则不能使用
  • android-library 可以编译android资源文件(resources files),java-library 则无视这样内容
  • android-library 编译出 arr 文件,java-library编译出 jar 文件(本质上他们都是 zip 文件)
  • android-library 的配置可以包含各种编译类型(build variants)来控制,java-library没有那个复杂
  • android-library 可以依赖于另一个android-library 或者 java-library, java-library只能依赖于java-library而不能依赖于android-library

总体而言 android-library 基本是 java-library 的一个超集, 但 android-library 比 java-libray 使用起来要更加复杂一些。从上边的对比来看,对于Android的项目,因为我们不确定什么时候会需要调用 Android 的API,或者定义一下 Android 的资源内容。再者最后一条的约束也决定了创建的 java-library 要保证在整个依赖树(dependency tree)上要在接近叶子节点的位置。所以不如优先选择创建android-library,以免掉入之后改 build.gradle 的坑中。
Read More →

2017-06-24
24 June
On June 24, 2017
In Knowledge Base(心得笔库)

Gradle Summit 2017

这两天去参加了 Gradle Summit 2017。从事Android开发的都知道Gradle是Android官方推广的编译系统(Build System)。虽然在公司里我们是用BUCK,我完全没有必要参加,但今年的Gradle Summit第一次有一组关于Android方面的演讲,对于了解更多Android知识,认识Android界的大神是个再好不过的机会。

Gradle其实很早就作为编译系统被很多企业使用在后端系统编译上,而在Android上的使用其实也是Google基于Gradle的plugin接口做了“Android Plugin for Gradle”,这样就让Gradle也能编译Android Library(aar),否则就只能编译Java Library(jar)。只是Gradle Inc.会和Google合作,支持Android编译能高效的进行,保证Android Plugin正确运行,所以这次也来了很多在Google从事Android Plugin for Gradle和Android Studio的Gradle集成的工程师。而且因为这次会议参加的人相对Google I/O这种大会要小很多,也更容易能跟他们进行沟通交流。

对于演讲的内容,在YouTube上可以找到所有的视频。很多内容其实并没有那么有趣,毕竟即使对于科技公司来说,大多工程师从事的是产品上的开发工作,或者支持产品的系统架构。在编译上的维护其实需要参与的很少很少,也只有在项目达到的一定的规模遇到了特殊的瓶颈才需要去针对性的解决。而每个公司的应用方式,具体问题都有差异,所以没有办法给出统一的解决方案,只能分享一些自身经验和建议。就比如我要是有编译问题,我就直接在公司内部群里问了,虽然有时候我也想知道背后的原理,但是毕竟自己有其他任务也只能作罢。

这里我想特别聊聊Gradle Inc.这家公司奇特的工作方式。因为这是Gradle Inc.举办的会议,他们的工程师自然要过来帮助宣传和答疑,因此有很多机会跟他们交谈。

Gradle Inc.的总部算是在三番,但是他们的办公室不是给工程师提供的,那里坐的大多是市场和销售人员。Gradle虽然是开发项目,但是他们也有企业级的应用卖给其他公司。他们的工程师全部都是在远程工作(Work Remotely),每个工程师的自己的家就是他们的办公室。这些工程师遍布欧美各个国家,这次我碰到的有从匈牙利,法国,瑞士飞过来的,当然也有美国本土的。具他们说有一个工程师一直在边旅行边工作,之前是在日本,最近刚刚到了台湾。他们没有来自亚洲的工程师,因为时差实在太大,不易交流。他们的交流主要是email, Slack和Hangout,但是大多数情况下他们从事的项目都是比较独立的模块,只需要自己去研发。入职后,他们也不需要去总部报道,使用的电脑会通过邮寄送到他们家里,他们也可以选择去苹果店买一台电脑然后找公司报销。只有每年的Gradle Summit他们会聚集到一起,在会议结束后再参加公司内部的大会。

可以想象Gradle的工程师的能力都非常强也很有自制力,他们在编译上的做出的优化,对于各种公司开发效率的提升是极大的。即使每次编译节省一秒,乘以编译的次数再乘以参与的人数,最终每天可能就可以节约数十数百个小时。

反过来也可以说这公司并不太适合刚毕业的学生,因为没有人在公司带新人。而且远程工作多少会带来合作交流上的障碍,进而延缓了开发进度。可能这也是为什么BUCK的编译缓存(Build Cache)和远程缓存(Remote Cache)都做出来这么久了,Gradle才刚刚出编译缓存,而远程编译建立缓存库的功能还遥遥无期。

不过怎么说,Gradle Inc.这种自由的工作方式,都是让人觉得很酷的事。

2017-05-03
03 May
On May 3, 2017
In Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发)

Android编译工具Gradle和Buck使用对比

前面介绍了Gradle和BUCK两个编译工具的基本概念,本篇文章再来说说日常使用情况。本文不涉及配置方面的使用,毕竟大多时候配置工作是不重复的任务,具体操作可参见官方文档。这里主要讲讲日常工作会用到的使用两个工具编译,安装等操作的不同体验。

指令(Command)

指令操作是程序自动话的先决条件,两者都是基于指令来执行编译任务。其主指令分别为./gradlew和buck,然后调用子指令来执行相应的操作。
Read More →

2017-02-27
27 February
On February 27, 2017
In Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发)

Android编译工具Gradle和Buck浅对比

在Twitter工作的那两年,我学习了Gradle编译Android,了解了很多Gradle的配置;在Facebook的一年里我又学习了Buck编译工具,跟Buck的开发人员有过交流。现在市场上主流的Android编译工具还是Google官方推行的Gradle,Github上很多Android开源项目也会带上Gradle文件,只有很少的项目会选用Buck。

本文就来分享一些我对两者的使用体验。不过我对编译工具的使用还停留在当做配置文件的阶段,还没有到达当做开发工具做深入自定义的程度,也没有足够的经验来总结说Gradle和Buck两个编译工具到底哪个比另一个更好,所以只能描述一些比较浅显的表层对比。

语言(Language)

Gradle使用的语言是Groovy。为了能更好的了解Gradle,我曾特尝试学习了Groovy,它算是Java的超集,可以跟Java无缝结合,只不过Groovy加入了诸多丰富的元素来弥补Java的不足。其中一点就是Groovy的闭包形式似乎又结合了JavaScript里的概念,却又不是非常成熟,当年学习的时候没有特别能领悟其中的奥秘就中途放弃了。另一方面,Gradle实际上是Groovy提供的“领域特定语言(Domain-specific language, DSL)”,然后用Groovy的语法解析去执行。然后再读Gradle的文档了解提供的特定API,内容无比繁多。好在Google总结了Android开发需要的内容,平时也只要复制粘贴必要的内容即可。

Buck使用的语言是Python。可以在BUCK文件里书写任何Python指令来执行,比如动态配置源码范围等等。但最长使用的还是对Buck规则做一层包装来进行自定义规则。不过通过跟Buck的开发人员的交流,Buck实际上是用Java开发出来的,在编译时开启了Python环境来编译Buck。

 

对比Groovy和Python,前者几乎没有听到过其他的应用,深入学习不会带来其他好处,后者应用广泛,但是在Android开发上也不会有更多帮助。再者,要使用Gradle和Buck这两个编译工具,也并不需要对相应的两门语言有深入的理解,只要掌握基本使用即可。

模块(Module)

这里的模块是指Intellij的项目模块,是为了更好的组织、测试、重用而创建的独立单元。每个模块都有它的属性:比如主模块是应用程序,此外我们会创建资源模块,Java库模块,Android库模块等等。当开发多个应用程序时,就可以引入部分模块来重用。
Read More →

Facebook
Twitter
LinkedIn
RSS
ZhiHu

Recent Posts

  • 三年居家工作感受
  • Pixel Watch智能手表和Pixel 5, 6 Pro 及 7 Pro手机
  • 我拥有过的无线耳机
  • 毕业工作一个月,我差点被开除
  • 我拥有过的移动硬盘
  • ProtoBuf 2.0 method count optimization for android development
  • 面过100场行为面试后

Categories

  • Algorithm Analysis(算法分析)
  • Article Collection(聚宝收藏)
  • Data Structures(数据结构)
  • Design Patterns(设计模式)
  • English Posts(英文写作)
  • Front Interface(界面构想)
  • IT Products(数码产品)
  • Knowledge Base(心得笔库)
  • Language Tips(语言初试)
  • Mathematical Theory(数学理论)
  • Mobile Development(移动开发)
  • Programming Life(程序人生)
  • Reading Notes(阅而后知)
  • Software Engineering(软件工程)
  • Special Tricks(奇技妙招)
  • Tangential Speech(漫话杂谈)

Tags

Aero Android API Bash Binary Search Bitwise Operation Book C/C++ Career Chrome Conference CSS Debug Device DOM Extension Framework Game Gradle Hearthstone HTML Initialization Intellij Interview iOS Java JavaScript jQuery Keyword Language Issues Mac Microsoft Mobile Modifier Objective-C PHP Principle Reference Regular Expression Static String Tools Tutorial UI XML

Blogroll

  • Ahmed's Blog
  • Gert Lombard's Blog
  • Gordon Luk
  • Jack & Allison
  • 开发部落

Archives

Designed using Chromatic. Powered by WordPress.