Android 开发流行的一些传闻(Android Dev Summit 2019)

本文是Android Dev Summit 2019 系列视频的笔记第一篇。原视频见此。这个视频主要是把一些Android开发中有一部分所谓「优化」思路或者是先入为主的偏见逐一验证击破。

传闻:使用kotlin编写的app更加大,使用起来更慢?

用事实说话

Google Drive团队开始实践将项目中多达16000 多行的 java 代码转化成 kotlin 代码,最后的结果呢?请看图:

此次改动涉及16000多行代码,171 个代码文件,多达41 build target。但是对启动时间没有任何影响。如图所示,改动前后,启动时间均在2200多ms,其他性能数据也没有差别。但是他们代码行数将近减了25%。

这次总体改动后的收益为:

  1. 代码行数减少25%
  2. 通过工具测试后性能方面几乎没有差距
  3. 编译时间增长2%
  4. 编译后的代码大小增长2%

但是代码行数大量减少意味着代码维护工作以及代码出bug的几率也会大大减少。

所以综上所述,对于「使用kotlin编写的app更加大,使用起来更慢?」这个传闻是不实的。

传闻:通过Getters / Setters 方法访问model类属性会比直接访问属性更加耗时

如上图所示,大家可能以为通过get方法访问foo字段比起直接访问foo字段更加耗时,事实是这样的么?

然而作者通过专用的 Jetpack benchmark 库对两种形式进行测试,得到如下结果:

  1. 使用public 属性直接访问和通过getter方法访问完全没有区别;
  2. Android ART 虚拟机会将getter方法inline,导致最终和直接访问foo 属性效果一致

也就是说,在kotlin的世界里面:

tc.foo == tc.getFoo()

这里如果为了所谓的更快访问对应属性而将属性可见性改为 public 的行为不但没有带来性能上的优化,反而破坏了Java 的封装特性。

传闻:使用 Lambdas 表达式比使用内部类更好耗时

上面这两段代码在真实环境中会有区别吗?

同样,我们让数据说话。作者还是通过Jetpack benchmark 库对两种形式进行测试,得到如下结果:

  1. Lambdas 表达式的性能表现和内部类一致,几乎没有区别;
  2. 主要原因是Android 编译器在内部会先把Lambdas表达式翻译成匿名内部类,因此两者效果一致

基于上面的结论,作者推荐我们尽量使用lambdas表达式。这样能够保证代码更加简洁精确。

传闻:Android 虚拟机申请对象操作十分耗资源,我们应该尽量通过对象池来申请对象

坊间一直传闻Android开发中GC和对象申请都是十分耗时的操作,但是事实真的如此么?

首先Android平台的内存管理是一直都随着版本迭代在演进中。

如上图所示,Android 每个大版本都会在内存管理方面做一些优化,最新的几个版本里面的内存管理相对于最开始Android 2.0,3.0之类的远古版本应该是强大很多。Android 9.0 升级到 Android 10.0 以后所带来的GC优化效果如下图:

两个app在Android 9 和 Android 10 上面的GC提升都十分明显。

鉴于之前对Android 平台GC和对象创建都十分耗时的刻板印象,大家开始去寻找各种所谓优化的方式,其中最常见的就是使用对象池(Pool)来管理对象的创建和回收。

使用使用对象池(Pool)来管理对象的创建和回收就能减少GC的次数,提升app的用户体验么?

Pool<A> pool[] = new Pool<>[50];
void foo() {
    A a = pool.acquire();
    //.....
    pool.release(a);
}

对了,一般实现这样的对象池还需要保证线程同步。

为了对比直接创建对象和使用对象池在CPU上面的开销,作者通过Jetpack benchmark 库对两种形式进行测试(ch),得到如下结果:

从结果可以看出两者区别不大。

那么是不是我们就可以得出「直接创建对象」和「使用对象池进行对象管理」在当前的Android 平台上面已经没什么区别了?

其实还是得看情况,如果我们使用对象池,我们需要知道使用对象池的一些弊端:

  • 内存占用高
  • 内存中所持有的对象数比我们实际需要的要多
  • 实现一个高效的对象池管理类有一定门槛

但是碰到类似于大对象或者创建成本高的对象,使用对象池技术还是一个很不错的思路。

未完待续。。。

如何利用mitmproxy来批量修改Android中HTTP流量

背景

有时候我们常常在调试Android程序时,常常需要对API返回的response进行修改,以达到测试特殊情况的目的。比如有时候我们需要某个字符串显示超过某个限制来看看此时Android上面显示是否正常,有时候我们需要特定高度的图片来显示页面是否异常。 继续阅读“如何利用mitmproxy来批量修改Android中HTTP流量”

如何在Android开发中让你的代码更有效率

最近看了Google IO 2012年的一个视频,名字叫做Doing More With Less: Being a Good Android Citizen,主要是讲如何用少少的几句代码来改善Android App的性能。在这个视频里面,演讲者以一个图片app为例讲解如何应用Android中现有的东西来改善app性能问题。这个图片app的代码在这里。ppt在这里。现在我将视频里面的内容记录如下: 继续阅读“如何在Android开发中让你的代码更有效率”

Gson在 Android开发中可能存在的陷阱

引言

本文来自于Foursquare的团队技术博客。Foursquare团队最近发现自家的Android app在使用过程中并没有传说当中的“如黄油般顺滑”,而且通过查看logcat发现app会频繁地发起 GC_FOR_ALLOC 调用,Activity和Fragment之间的跳转也没有想象当中那样快。于是好学的工程师们开始去挖掘这个背后的内容。 继续阅读“Gson在 Android开发中可能存在的陷阱”

mitmproxy实践教程之调试 Android 上 HTTP流量

之前写了一篇博客介绍了mitmproxy,不过有些同学对这个工具到底该怎么使用还是有点不清楚,于是自己花了一天时间把自己对这个工具的理解和使用过程进行了一番整理,形成了这篇文章。接下来我就以一些简单的场景来说明mitmproxy的用法。 继续阅读“mitmproxy实践教程之调试 Android 上 HTTP流量”

如何调试 Android 上 HTTP(S) 流量

前面的话

在Android开发中我们常常会和API 打交道,可能你不想,但是这是避不开的。大部分情况下,调试发送网络请求和接收响应的过程都是十分痛苦的。

有多少次我们经过调试发现API的调用失败仅仅是因为我们的编码错了或者丢失了一个HTTP头部参数?在调试的过程中,我们发现出现错误的原因千奇百怪。总之我们要看到最终的请求是什么样子的不是一件容易的事情,响应也是如此

如果碰到困难,请使用代理

解决这样的问题有各种各样的方法和门道,但是我今天要分享的是在我看来最快,最容易也是最可行的方法。

由于调试HTTP请求和响应是相当繁琐的(调试HTTPS更加繁琐),因此在这种前提下你能使用的最好工具就是代理。当然,你肯定知道什么是代理,所以我就不啰嗦它的定义了。

现有的代理工具中它们的用法,特性以及操作系统的兼容性都各不相同,如何选择一款合适的代理呢?要我说,简单点,就用mitmproxy

mitmproxy

我已经无法用语言来形容mitmproxy的方便和强大了。用mitmproxy 官网上的介绍一句话,就是“an interactive, SSL-capable man-in-the-middle proxy for HTTP with a console interface”。没错,你可以通过控制台来操作它;没错,它还支持HTTPS;没错,它允许“对流量进行拦截,检测,修改和回放”;没错,它还是跨平台的,因为它是用Python写的。对了,我说了它是完全免费的这件事了吗?

使用它也是相当容易的。一旦你安装了它,便可通过在控制台输入以下命令启动它:

$ mitmproxy [-b IP_ADDR] [-p PORT]

代理已经在运行,你可以开始拦截网络流量了。接下来你就需要配置Android手机,将所有的流量都重定向到之前命令里设置的代理服务器地址上去(IP_ADDR + PORT)。

代理设置App: “Proxy Settings”

现在我们需要在Android手机上进行代理配置。具体步骤如下:

  1. 进入Android的Wi-Fi设置
  2. 长按当前连接的网络
  3. 选择“修改网络”选项
  4. 勾选“显示高级选项”
  5. 启用代理服务器并将代理设置为“手动”
  6. 输入之前设置好的的IP地址和端口。

如果要禁用代理同理。现在Android端的设置就大功告成了。

是不是觉得上面的步骤有点头疼?不急!幸亏还有Proxy Settings 这个App。用了Proxy Settings,上面繁琐的步骤就变得异常简单了。有了这个轻量级的App,你只需轻轻一点,便可轻松地开启或禁用网络连接里的代理设置。

proxy_settings app 截图

继续阅读“如何调试 Android 上 HTTP(S) 流量”

Google IO 2014 Android ART Runtime 讲解(英文字幕)

 
http://v.youku.com/v_show/id_XODQ5MjE0NDU2.html
(推荐全屏观看。由于目前还在转码中,所以现在还只支持标清。理论上是可以超清的。)

为什么只有英文字幕?

  1. 我懒
  2. 我之前很早之前尝试过在翻译Google IO视频的字幕,后面发现很多英文就我来说根本翻不出我理解的意思,于是干脆作罢
  3. 逼着自己用英文去理解,同时学习英文的技术思维,顺便锻炼英文,反正看美剧也差不多呢,看这个逼格更高。

视频内容简介

ART 是Android runtime 的一次比较大的改进,ART是在Android 4.4 开始成为可选的runtime(还有Dalvik)。ART带来的改进主要体现在垃圾回收算法,线程,锁模型,编译器和runtime的性能等方面。这个视频的主要内容就是对这些改进进行讲解。

演讲人介绍

Anwar Ghuloum

Facebook工程师是如何改进他们Android客户端的

safe_image
本文来源于 Facebook工程师博客
作为世界上最大的社交网络,Facebook的Android客户端面临着各种各样的使用环境(地理环境、Android设备以及移动网络等环境的差异)。也正是这个原因,为了检测自家Android客户端在发展中国家的性能表现,Android的产品经理、工程师在2013年的时候去了一趟非洲。当时我看到这个新闻的时候觉得有点怪异,后来看到他们这篇博客才有点理解他们这样做的原因了。 继续阅读“Facebook工程师是如何改进他们Android客户端的”

Bitnami