Jenkins 中如何让 Android SDK 根据需要自动更新

每次项目中切换了新的 support,总是要登录构建服务器更新一下 SDK,很麻烦。其实 Jenkins 本身是支持自动更新的,稍微留一下会发现,构建时不存在的 SDK 的报错信息为:

You have not accepted the license agreements of the following SDK components: …

原来是 license 问题,需要手动去 agree 才能进行下一步,所以就中断了。但其实是可以跳过的,Stackoverflow 上有人引用了 Jake Wharton 给出了方法:

1
2
3
mkdir "$ANDROID_SDK/licenses" || true
echo -e "\n8933bad161af4178b1185d1a37fbf41ea5269c55" > "$ANDROID_SDK/licenses/android-sdk-license"
echo -e "\n84831b9409646a918e30573bab4c9c91346d8abd" > "$ANDROID_SDK/licenses/android-sdk-preview-license"

上面的哈希字符串据说是 license 文本的 sha1,所以如果 license 换掉的话也会失效。暂时这样用吧。

参考:http://stackoverflow.com/questions/38096225/automatically-accept-all-sdk-licences

从 Retrofit 源码学习 Java 的动态代理的使用

Retrofit 是当前 Android 最流行的 HTTP 网络库之一了,其使用方式比较特殊,是通过定义一个接口类,通过给接口中方法和方法参数添加注解的方式来定义网络请求接口。这种风格下定义一个网络接口变得很简单。不过 Retrofit 是如何使用一个接口的 Class 创建出来实现了该接口的对象呢?最近因为工作原因想封装项目中的网络请求部分,在解决获取泛型嵌套问题的时候,一直没有找到比较理想的方案,所以拜读了 Retrofit 的源码看看这个明星网络库是如何实现这一黑科技的。

Android 项目的 Jenkins 参数化构建

需求描述

项目分为三种类型构建:

  1. 测试环境构建 debug
  2. 测试环境构建后上传内测平台 (fir.im)
  3. 发布版构建 release

三种构建类型在完成后都保存构建输出的 apk,只有在类型 2 完成后执行上传到内测平台操作

Let's Encrypt

终于在免费方案的前提下搞定了博客的 HTTPS。之前试过 CloudFlare 的 CDN + HTTPS 的方案,最终因为速度实在太感人以及和 DNS 上和邮箱有冲突就放弃了;后来 Coding.net 也开放了自定义域名的 HTTPS 服务,试了以后感觉不错,但后来发现在 Android 设备上基本证书不可用,反馈了很久却迟迟没有解决。前两天又租了个乞丐版的搬瓦工 VPS,尝试了一下 Let’s Encrypt 感觉很方便,就试着自己搞了一下,恰好有发现 GitLab 的 pages 服务可以自己配置证书,所以借着 VPS 生成了一个证书然后配置在 GitLab 上。虽然速度貌似不如 Coding 的快,而且 ping 也被 GitLab 给屏蔽了,但总体还可以接受,暂时就先用这个方案了。

顺便解释下如果国内的朋友感觉访问本站太慢,那是因为用了 disqus 评论插件的问题,因为国内同类产品用了后实在不满意,最终还是选用了 disqus,需要评论请自备梯子。

UPDATE 2016 10 25:后来想起来很久之前买过一次 SSL 证书一直没用,打开看还有一个多月就过期了,但是试着激活了一下发现是从激活日开始算起的,还能再用一年,所以现在换成这个了。

升级 macOS Sierra 后 Chrome 打开 HTTPS 的网页出错的问题

升级 macOS 后,Chrome 访问 HTTPS 的网页总是一闪而过一个错误,然后才会加载成功。在网上看到别人说可能和支付宝的服务有关,移除之后就正常了。移除命令:

sudo launchctl remove com.alipay.DispatcherService

更彻底一些的:

sudo rm -rf /Library/Application\ Support/Alipay /Library/LaunchDaemons/com.alipay.DispatcherService.plist ~/Library/LaunchAgents/com.alipay.adaptor.plist -rf ~/Library/LaunchAgents/com.alipay.refresher.plist ~/Library/Internet\ Plug-Ins/aliedit.plugin ~/Library/Internet\ Plug-Ins/npalicdo.plugin

Android App 开发环境和线上环境共存的 gradle 配置小技巧

前段时间考虑过一个问题:Android 开发者在供职公司开发一个 app,但是又需要在下班后使用这个 app 怎么办?一般公司的服务端都会区分线上和线下环境,在开发时使用开发的环境以免脏数据污染线上的环境,但开发环境收不到真实消息的推送,而下班后每次都卸载重装的话感觉又有些蛋疼。今天想到可以用设置 flavor 的方式解决这一痛点,分享一下这个方案的配置过程。

搭建 jenkins 构建 Android 项目

之前用过 Flow.ci、Travis 等公共的 CI 工具感觉很方便,但毕竟源码在别人那里多少有点别扭。Jenkins 是一个免费的高度可定制的 CI 开源项目,现在的公司使用它来构建 Android 项目,所以也来试一试,记录下搭建的过程以及遇到的问题,供自己和需要的人参考。

ArrayList 是线程不安全的

发现自己在代码中经常会犯一个常识性错误:在多线程环境下使用同一个 ArrayList。ArrayList 是线程不安全的,不安全性主要表现在元素的操作互相没有互斥性,例如在线程1中添加了元素 a,而在线程2 中查询该 list 的长度时,却可能发现 list 长度为 1,而元素只有一个 null。