Skip to content
Ider

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

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

Knowledge Base(心得笔库)

2023-04-27
27 April
On April 27, 2023
In Knowledge Base(心得笔库), Programming Life(程序人生)

三年居家工作感受

回看过去的一些记录,2020年3月5日,公司第一次发消息因为疫情建议员工在家工作不要去公司,不久3月16公司再次发消息关闭公司强制全体人员在家办公。随着过去两年疫情渐渐稳定,公司开始慢慢开放让大家回去。算算时间到现在已经有三年的时间了,大家已经习惯了居家办公,所以周围同事去公司上班的还是不多。

疫情让大家的工作生活方式都有了很大的改变, 对我个人而言也有很多体验和成长。

时间线

先来回顾一下基本的时间线:首先是从2022年3月开始一直居家办公,所有交流都是远程视频会议的形式,因此后来见面时都惊讶与脑海中预期的身材不符。

接着2021年8月公司开始邀请员工自愿回公司,10月开始部分食堂提供午餐,我在11月因为孩子转学到公司附近的学校开始每天到公司方便接送孩子,但绝大多数都单独在一个房间里开会。

到了2022年7月我感染了新冠,在家休息了两周之后开始居家办公,另外孩子的在8月转到了离家较近的学校所以一直没有要去公司,一直到9月才重新开始一周去2-3天。10月的时候发现了家附近有直接到办公楼门口的班车,于是又转换了交通工具来更好的利用通勤。

但直到目前4月也基本一半时间居家办公一半时间去公司,只是通勤的交通工具会应天气情况二变化。

改变与发现

这三年的不同工作方式对每个人都有改变,对我来说也是如此,有好的也有不好的就挑几个分别聊聊。

好的地方

咖啡

我一直都很爱喝咖啡,每天1-2杯。在办公室里我会用公司的意式浓缩咖啡机给自己做拿铁,偶尔还能做出拉花。一开始居家办公的几个月我只能用法压壶来泡咖啡喝,后来想着居家是个长期的事情,于是买了Breville的半自动意式浓缩咖啡,生活一下子变得更有精神了。

我开始网上订购当地不同烘培的咖啡豆来尝试不同的口味,也在咖啡拉花得到强化。但有一点最重要的是我发现了自己乳糖不耐受的事实,也解释了为什么我在公司喝完自己做的拿铁就特别爱上厕所。公司里都是全脂纯牛奶,在家里我就买低脂无乳糖的。

对话

我的声音比较低,所以跟人当面说话的时候别人经常听不到我说话的声音。在说英语的时候我又会不自觉的把声音压得更低,当又不太会说的单词时我又会放轻发音试图蒙混过去,这样就更让对方听不清我要表达的意思。

居家工作之后,所有工作上的会议交流都通过Zoom视频电话会议,这样很好的掩盖我的缺点:声音不太低,我就靠话筒近一些或者对方把音量调高一些;单词不确定我就在电脑上快速搜索来确认。

经过这几年在线上的锻炼,见面交流虽然还是有声音过低的问题,但流畅度有了很大的提高。

亲子

在家工作最大好处之一就是减少了上下班的时间,特别是避免了堵车造成的时间浪费。于是我有更多时间跟孩子交互接触,即使有些陪伴的质量并不算高,但体量决定增加了很多。另一方面,太太多承担了全家的早餐和午餐,我也相应的分担了一些照顾孩子工作,比如洗澡、刷牙。这也让我感受了更多他的成长。

坏的地方

健康

居家办公的时候基本上都是坐在电脑前工作,开车出门接送孩子,每天最频繁的走动就是在书房和不到20步远卫生间,最长的距离就是停车场到教室。当时没有用智能手表,但是估算一下可能一天总动走动不到2000步。同时因为疫情,也不能去公共场所进行锻炼,这导致我能明显感受到身体状态的下滑。特别明显的地方就是腰背经常强烈酸痛,甚至不能站立很久。

很明显的对比就是在我回到公司上班之后,我在办公室有意识的更多站立工作,同时每天中午吃饭要走比较长的距离到食堂,单单这些小的变化就让我再没有感到腰背的不适。

通过这个经历,也让我发现减少身体疼痛不一定是要针对痛的地方。比如腰痛,是因为长期久坐腿和臀的肌肉力量减弱同时增加了腹部重量,进而身体压力都转移到了腰部。所以腰部的按摩并没能缓解我的疼痛,更有效的反而是简单的走路恢复腿部力量和平板撑来增加腹部力量。

交流

上边说居家办公通过视频电话让我的对话变得更有效,但另一方面也让同事间的交流变得没那么频繁。所有的交流都需要非常刻意地创建一个会议,打开视频进行。不像在办公室可以发生在任何随意的场景:办公桌旁,小厨房,食堂等等。特别是午餐时间,其实是大家互相随意交流生活,了解每个人的最好时间。亦或在前往下一个会议室的路上硼矿,随便简单聊几句也能快速交换一些信息或者激发出几个想法。

此外,在某些特别的会议上,比如绩效对话,我个人觉得面对面的交流会更好。我可以更注意对方的表情和身体细节来改变我的对话方式和内容,或者用一些肢体语言来补充口头交流。

空间

居家办公另一个大问题就是家庭空间被挤压,家里需要一个地方甚至一个房间来长期提供办公场所。疫情期间,由于学校关门,很多孩子也要在家上网课就更进一步割裂了家庭空间。我们还比较幸运,孩子的托儿所因为规模比较小在疫情最严重的时候也可以一直运行,我还可能白天把孩子送出去,在家占有一个房间来开会办公。

除了空间尺寸,空间的舒适度也是一个问题。办公室一般都会长期开着中央空调让温度一直保持在一个常态,这样我就能感到身体上的舒适从而更好地工作。但是在家的时候,冬天有时候就冷得无法集中注意力,虽然有中央暖气但是又觉得只有一个人在家没必要开。到了夏天,因为没有空调,有些日子又热得直冒汗。

 

很多时候,习惯了一些行为方式,就成了惯性不太容易改变,但当一些外界因素造成我们不得不去适应新的变化的时候,发现其实有些改变也不见得都很坏。

 

2021-01-14
14 January
On January 14, 2021
In Design Patterns(设计模式), English Posts(英文写作), Knowledge Base(心得笔库), Mobile Development(移动开发), Software Engineering(软件工程)

ProtoBuf 2.0 method count optimization for android development

The Protocol Buffer library was not initially built for Android, it just turned out to have a Java version to be used in Android, but it’s not optimized for Android apps, for example: it doesn’t consider the method count limit in Android.

So, in this article, I’d like to share some work I found specifically on Protocol Buffer Version 2 that can reduce the method count. If your app is also heavily relying on Protocol Buffer, I hope these approaches are useful for you too.

General Approaches

1. Use Protocol Buffer Java Lite Runtime

Just as the name indicates, the dependency library is much smaller than the regular Protocol Buffer Java runtime, the generated code is also much slimmer. However, the APIs are compatible between those two versions, so the call sites would not be affected when changing the library.

2. Don’t use <Message>OrBuilder interface

For each Protocol Buffer message definition in .proto file, the Protocol Buffer compiler generates an interface named <Message>OrBuilder (<Message> is the name defined in .proto file). This interface would be implemented by the concrete <Message> class and the corresponding Builder.

It might be attractive to use it as a variable type thereby you can depend on abstractions to not concrete classes. But calling methods on Java interface would make Dex take count of those methods.

In reality, every place can directly use either <Message> or Builder, then the optimization tool (like R8, ProGuard) can safely remove the methods declared on the interface.

Special Tricks

Protocol Buffer Java Lite is very good, but if I open the magic box of generated Java classes, I notice it’s still not optimal for Android. There are a couple places I could modify to make it more effective for Android applications.

Instead of copying the Java files and making the change, which is error prone when engineers update the .proto file, I created a script to automate the job. Just add the execution of this script at the end of the Protocol Buffer gradle task, so it works just as a complement of Protocol Buffer code generation process.

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

protobuf {
  protoc {
    artifact = 'com.google.protobuf:protoc:3.7.0'
  }
  plugins {
    javalite {
      artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
    }
  }
  generateProtoTasks {
    all().each { task ->
      task.builtins {
        remove java
      }
      task.plugins {
        javalite { }
      }

      // `getOutputDir()` can only be read during configuration, 
      // so it’s out of action block
      def outputDir = task.getOutputDir(task.plugins[0])
      task.doLast {
          exec {
              commandLine file('protobuf-optimizer.py')
              args outputDir
          }
      }    
    }
  }
}

[/codesyntax]

In the script, I have made the following modification on generated java code.

1. Change the modifier of Builder constructor from private to package

Simply running the sample addressbook.proto from Protocol Buffer tutorial side, you would get a class like the following snippet:

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

public static final class Person {
    private Person() {}

    protected final Object dynamicMethod(
            com.google.protobuf.GeneratedMessageLite.MethodToInvoke method,
            Object arg0, Object arg1) {
        switch (method) {
            case NEW_BUILDER: {
                return new Builder();
            }
        }
    }

    public static final class Builder {
        private Builder() {}
    }

}

[/codesyntax]

When analyzing the APK file, we could would find some synthetic classes and methods:

This is because the outer class is accessing the private constructor of the inner class. The generated synthetic class would contribute an extra constructor to the Dex file. Therefore, by simply removing the private from Builder(), you can remove such classes and methods.
Read More →

2020-12-15
15 December
On December 15, 2020
In Knowledge Base(心得笔库), Programming Life(程序人生)

面过100场行为面试后

两年前,我在 Facebook 完成了100场面试的里程碑,分享一篇对于面试心得讲了讲面试对我带来的个人能力的提升。今年五月,我差不多在一年半的时间里又完成了100场面试让总数达到了200场。接着到了今年十月份,其中一类面试—行为面试(Behavioral Interivew) 我也完成了100场。感觉是个不错的时机来再来写篇文章分享一下,但这次我没有特别心得体会总结,就聊聊一些随意的想法。

 

美国科技公司对于软件工程师招聘比较常用三种面试形式:写代码(Coding),系统设计(System Design),行为面试(Behavioral)。对于大公司来说,他们常年都会很多招聘指标,也有大量的申请人,所以相对于中小公司,在大公司更容易获得面试方面的培养机会。(Facebook内部对不同类型的面试都有内部代号,但是因为不对新人记忆不友好,慢慢开始弃用了。)

当我作为面试者时,我对它们的难易程度排列为:系统设计>>行为面试>写代码。毕竟代码是可以通过刷题来提高的,行为面试也主要是讲自己的故事,而系统设计的广度和深度的把控就比较不确定了。

而当我变成面试官时,从另一个角度排列顺序就变成了:行为面试>系统设计>写代码。这排位主要根据我写面试反馈结论所花的时间来衡量:一般代码面试的结论我需要5-10分钟完成,系统设计则要15-30分钟,行为面试则尝尝花费我30-60分钟。主要原因是行为面试要做的内容记录就很多,次要原因是英文写作还是我的短板。因此我后来只做行为面试来锻炼我自己的英文写作,同时也让我享受挑战的乐趣。

 

之前的文章我讲了面试在广义层面带来的各种不同的好处,面试了所以不同类型面试后,我想再聊聊各类面试对于作为面试官的软件工程师在公司内的职业发展不同阶段所能带来的特定技能的锻炼和提升。进而让面试者从另一个角度来了解面试的意义和价值。
Read More →

2020-03-12
12 March
On March 12, 2020
In Data Structures(数据结构), Knowledge Base(心得笔库), Language Tips(语言初试), Mobile Development(移动开发)

基础数据类型的包装类的内存大小

谈到 Java 的基础数据类型(Primitive Data Types),可以找到很多关于其种类以及内存大小的文章。基础数据类型对应的包装类(Wrapper Classes)也会介绍自动装箱(Autoboxing)和拆箱(Unboxing),以及带来的效率上的影响。但可能是因为Java一般所使用的环境都有比较充足的内存,似乎从来没有人讨论过每种包装类所占的内存大小以及对内存溢出可能造成的影响。

到了 Android 应用程序开发领域,由于设备硬件本身以及系统对各个程序在资源使用上的约束,就会出现很多特别的使用习惯,比如推荐使用Typedef来替代枚举类型(enum)来减少内存使用和方法数。因此关于基础数据类型的包装类所占内存大小就值得写篇博客来研究一下。

包装类所占内存大小

网上我找了很多计算类内存大小的方法,但是既然我是 Android 工程师,我就用 Android Studio 提供的 Memory Profiler 来查看内存使用情况

下边就是我用来做内存检查的类,它包含了所有基础数据类型和对于的包类型

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

public class Primitives {
  boolean pBoolean;
  byte pByte;
  char pChar;
  double pDouble;
  float pFloat;
  int pInt;
  long pLong;
  short pShort;

  Boolean cBoolean;
  Byte cByte;
  Character cChar;
  Double cDouble;
  Float cFloat;
  Integer cInt;
  Long cLong;
  Short cShort;

  public Primitives() {}

  public Primitives(Void v) {
    cBoolean = false;
    cByte = 0;
    cChar = '\0';
    cDouble = 0.0;
    cFloat = 0.0f;
    cInt = 0;
    cLong = 0L;
    cShort = 0;
  }
}

[/codesyntax]

接着在 MainActivity 中创建两个 Primitives 类的字段:一个没有初始化对象类型,一个将所有对象类型初始化成默认值。然后运行程序,在 Android Studio 中打开 Profiler 查看内存时”Dump Java heap” 就可以看到这两个 Primitives 对象内存使用情况

从图中的结果可以看出如果对象的值是 null,那他们是不占用空间。在这一点上看,如果字段大部分时间都存的是空值或者以空值指代默认值,那相对比总是会被赋予默认值的基础数据类型在内存使用方面要好一些。

对于包装类,它们都比其对应基础数据类型要占用更多的内存空。仔细对比不难计算出他们的差别都是 8 bytes,正好是一个普通 Object 实例的大小。这也证明的包装类只是对基础数据类型的简单包装。

基础数据类型 包装类型
类型 大小 类型 大小
boolean 1 byte Boolean 9 bytes
byte 1 byte Byte 9 bytes
char 2 bytes Character 10 bytes
double 8 bytes Double 16 bytes
float 4 bytes Float 12 bytes
int 4 bytes Integer 12 bytes
long 8 bytes Long 16 bytes
short 2 bytes Short 10 bytes

所以,使用包装类不仅会有自动装箱和拆箱产生的效率上的影响,对内存的使用也有很大的影响。而 Android 的内存又是稀缺资源,所以 Android 库里多了特殊的数据类型来优化内存的使用,比如 SparseArray 替换以 int 为主键的 HashMap。
Read More →

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 →

2018-12-16
16 December
On December 16, 2018
In English Posts(英文写作), Knowledge Base(心得笔库), Programming Life(程序人生)

Insights from 100 Interviews

As our interview status recorded, I just have conducted 100 interviews at Facebook. I never did batch interviews (multiple interviews a day in consecutive days), so I’m feeling really excited about this accumulative achievement.
On this wonderful milestone, I’d like to share some of my experience and tips about being interviewer at Facebook, I hope you found this helpful.

Benefits as an Interviewer

There is no doubt that interviews are critical for company growth. However, I want to tell you more about the personal growth and benefits of being an Android interviewer.

  • Improving my verbal and written English
    Since English is my second language, interview is a great way for me to practice. I repeat similar conversation during interview, and this exposure increases my confidence in my speech; by providing post-interview feedback, I have increased the speed and quality of my writing.
  • Expanding my social network
    I felt so great when some colleagues suddenly stopped me and asked me “do you know you interviewed me?” then our conversation started very naturally (although, I’m really sorry, I didn’t actually remember the interview).
  • Business travel for recruiting events
    I got a chance to go back to my alma mater to give recruiting talk, which I previously never imagined. However, I also missed a couple trips to interview abroad due to my visa restriction.
  • Clarity on my work and teams
    Candidates often asked about my work and products at Facebook at the end of interviews. By thinking about and answering those questions, I clearly define my own duties, and the work of my team.
  • Polishing my technical skills and general Android knowledge
    The technical skills we use here are very Facebook specific, but I would hear a lot of different terminologies, libraries, architectures that are used by candidates. I can then follow up on these to keep up with the market.
  • Helping my friends apply for software engineer positions
    It’s fine to help friends to prepare for Facebook interviews, as long as we don’t leak the real questions we ask. So I can specifically tell my friends what interviews look like, and what skills they should focus on.
  • Better understand position and level requirements
    After seeing so many interview decisions, I get a better sense on the requirements for Android positions at each level. This also clarifies what gaps I need to fill to advance my own career.
  • Performance review and career growth
    To be honest, the number of interviews doesn’t play a key role on performance review at company. However all the benefits mentioned above helps me a lot on my growth.
2017-08-28
28 August
On August 28, 2017
In Knowledge Base(心得笔库), Language Tips(语言初试), Software Engineering(软件工程)

Android单元测试有关资源

做Android开发,实在有太多的开源库和框架供开发者选用,总是让人无所适从到底哪个才是真正合适的。但是在自动化单元测试这一块,库的选择反而少了许多。可能是这些库实在太优秀了,也可能自动化测试的受重视程度相对较低所以没有太多人投入研发之中。

但是,自动化测试特别是单元测试(Unit Test)对于提高代码质量有很大的帮助。本文就来介绍一些Android中常用的单元测试库。

Junit

Junit是最主流的Java自动化则是框架,目前发展到Junit4。通过各种Java注解(Annotation)来标识测试的基本信息。
每个测试经历几个流程:设置,执行,验证。上手简单,运行快速,结果直观。API设计也很简洁,很容易扩展。

Mockito

单元测试最重要是减少测试对象的依赖,专注在该测试对象上。Mockito框架能很好的帮助我们完成这一目标,它在运行时将部分类在二进制层面替换掉,如此测试就不用依赖在实际代码上。
另外,单元测试中的断言验证(assertion)一般都是基于对象的状态(state),而Mockito提供了基于行为(behavior)的验证方式。

Robolectric

在Android的代码则很大程度依赖于Android的系统库,比如Context,View等等。其他几个库都是基于Java开发出来的,在单元测试中无法调用到Android系统的代码。Roboletric的出现就很好的解决了这个问题,它为测试提供了Android的系统代码, 并且通过配置可以指定运行的API等级。

AssertJ

JUnit自带assert方法来验证测试结果,这些方法使用了Hamcrest的函数式API。AssertJ则更具面向对象设计,并且是流式接口(fluent interface),让代码书写更加流畅,在IDE中也有更好的补全功能。
另外AssertJ扩展性也非常强,对于各种常用的Java库都有相应的扩展来更好的适应单元测试,比如Guava。即使是Android也有开源扩展库。
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 →

Posts pagination

1 2 … 6 Next
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.