Tasker任务二则

Tasker是个神器,支持一键(甚至全自动)完成复杂的、涉及多个手机程序的任务。前提是,程序要支持tasker。用过tasker之后,再看那些不支持tasker的app,简直就是半成品!

Macronos for Sonos有种相逢恨晚的感觉,买下之后,顺手创建两个tasker任务,生活顿时美好了许多!

先说一下早上锻炼的流程:

  1. Time Recording程序里check in,
  2. Sonos Play 5播放音乐,
  3. 热身
  4. 使用Sonos Controller for Android调高音量,不然跑步的时候完全听不到,
  5. 跑步机上跑步,
  6. 音量调回到正常,
  7. 力量练习,
  8. 停止播放音乐,
  9. Time Recording程序里check out。

使用Tasker + Macronos for Sonos之后的流程:

  1. 点击手机主屏上的Workout图标,这会启动一个tasker任务,它会自动完成之前的步骤1到步骤6(定时调节音量),
  2. 热身、跑步、力量练习,
  3. 再次点击Workout图表,完成步骤8和步骤9。

 

晚上睡觉的流程就更复杂了,tasker任务的实现也更加复杂,首先看看任务流程。

首先酝酿睡眠气氛(点击Bedtime图标):

  1. 启动tasker任务自动打开Sonos Play 3播放舒缓音乐,
  2. Philips Hue灯泡调成暗红色(下图任务4,使用AutoHue)。

再次点击Bedtime图标,关灯睡觉,监控睡眠。

播放音乐子任务流程如下:

  1. 使用Macronos for Sonos从5个播放列表里面随机选择一个,
  2. 随机循环播放其中的音乐。

 

正式睡觉子任务流程如下:

  1. 调低Sonos Play 3音量,
  2. 设置15分钟倒计时停止播放音乐,
  3. 启动Sleep as Android监控睡眠,
  4. 等待两分钟,
  5. 关闭所有Philips Hue灯泡。

拥有tasker,美好生活,触手可及!

 

 

Android dynamic linker

/system/bin/linker是Android的dynamic linker。尽管它是个很小的程序,但它的实现里依然有不少值得学习的地方。

由于dynamic linker要在libc.so被载入之前工作,因此没有malloc可用。它使用了两个算法,为不同目的分配(并管理)内容。

一类内存是为了载入动态链接库的代码段和数据段,这块内存使用buddy memory allocation算法管理。虽然是个简洁的算法,但如果是第一次接触,想通过阅读代码的方式理解它的工作原理,还是有些难度的。幸好维基百科上的条目解释得非常清楚,在此基础上,一些实现上的小技巧也就好理解了。

另一类是使用array + freelist的方式管理soinfo数据。因为数据类型相同,可以使用静态分配的数组;由于soinfo数据可能动态添加和删除,使用array + freelist方式,可以在O(1)内找到空余的项目。

还有一个很神奇的地方,即如果要使用dlopen/dlclose之类的函数,需要链接libdl.so这个动态库,然而在运行时调用的,确是dynamic linker里面的实现。

简单地说,提供libdl.so是为了让linker知道,dlopen/dlclose这几个函数是存在的,在静态链接时不要报undefined reference之类的错误。在实际调用的时候,dynamic linker把这几个symbol的值解析为自己的实现,以达到代码复用,避免重复的目的。在具体实现里,libdl.so对应的soinfo,并不是像其它动态链接库一样,是通过分析对应的文件得来的,而是dynamic linker硬造出来的,使得dlopen/dlclose等symbol解析为dynamic linker内的实现。