Posts tagged with android


最近看到几篇几年前的文章,关于多任务执行在移动设备上设计。

http://blog.rlove.org/2010/04/why-ipad-and-iphone-dont-support.html

这篇谈到iOS上为什么没有想android那样去做multitasking,他的观点是认为android有着良好的api去保存程序状态,有着一整套复杂的程序组件状态机,以及能够很好的去管理在不同状态之间的切换。而iOS在iphone/iPad上实现这样一套系统会非常复杂,而android则是一开始就考虑好的。

个人认为到应该不是这么回事,苹果的工程师绝不会一个这样的系统都无法在iOS上做出来。只不过双方的设计哲学有所不同。

无论是andorid还是iOS的设计者,在移动设备上用户只能关注于一个应用上这个观点保持了一致。而感觉android是倾向于给予程序更多的自治权利:我提供功能众多,开发者在其中选取自己需要的,所以你的程序你可以选择在后台运行,这是你的权利。

而可以参考apple文档:

https://developer.apple.com/library/ios/documentation

  • WakeLock 可以用来唤醒屏幕和CPU,用来做重要事情的通知。微信天天晚上还响个不停是不是就是这种情况?建议是只在真正需要的时候用。影响电池使用,增加耗电。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);

PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "WakeLock");

wl.acquire(10000);

wl.release();  

说到耗电,关于老外和国人还有一个梗: 记得最早看到mobile web的时候,google有个研究是研究什么技术在什么网络下比较耗电

在模拟器中localhost已经被设置为虚拟机的机器,需要在本地调试的时候,通常需要在app里面连接本地起的server来调试连接和访问。但是localhost已经不能用了,而模拟器是绑定在一个虚拟的网络上的,在android开发网站上有http://developer.android.com/tools/devices/emulator.html#networkaddresses, 说明把10.0.2.2这个地址绑定到了开发机器的localhost。就不用去尝试别的地址了。

而genymotion则是bind在10.0.3.2这个地址。

build from source

Android是一个开源系统,源码都是公开的, 可以到http://source.android.com/上去下载源码。

具体的操作都在官网上这了:http://source.android.com/source/building.html

首先,需要的是一个unix环境,window就装虚拟机装ubuntu吧,很多build的工具也只能在unix环境下用。

然后是装各种需要的工具和依赖库,包括bison,gmake之类。

在macos上要注意的一点是mac默认安装的时候都是大小写不敏感的文件系统,而android framework的文件是区分大小写的,官方的说法是大小写不敏感会影响git对文件的处理。所以我们需要一块大消息区分的磁盘区域。

有些老教程做法是用mac自带的工具去分了一块新的大小写区分的磁盘。千万不要这么做!虽然mac的磁盘工具不会影响你的数据,但新磁盘分区设计到老磁盘分区的大小调整

Security Sandbox 安全沙盒

Android操作系统是基于多用户的iinux系统上的,从他的系统架构图就中可以看得很明显:

Android System Architecture

所以很多地方Android都直接利用了linux的特性。

  • Android里面每个应用都被当作linux系统中的一个用户,被赋予一个唯一的user ID。这个user ID只有操作系统知道,应用自己是不知道的(当然通过root之后没有什么不可能)。这样应用的文件也就很简单的可以通过user permission来设定。
  • 每个应用都运行在独立的进程里,这样的好处是Android系统对应用的管理可以简化到对进程的管理,如挂起恢复等都可以直接用进程的特性。而内存管理也变得简单,因为不同的应用就是不同的进程,不会相互影响。
  • 另外,每个京城都有着自己独立的虚拟机dvm,也就意味着应用都是运行在独立的虚拟机里的,虚拟机相当于沙盒,互相之间的影响非常小。

当然应用之间不可能完全没有交流,Android提供了如下几种方式:

  • 两个应用如果是同一个组织个人开发,并且有着同样的签名,那么他们可以要求系统赋予他们一样的user ID,这样他们可以互相访问文件;而android在设计时为了节省系统资源,则认为既然你们都已经有一样的user