Android 笔记1

本文介绍了Android操作系统,它是Google基于Linux开发的用于手持设备的操作系统,拥有丰富的特性,如SQLite数据库、网络连接、多媒体支持等。Android得到了广泛的开发者支持,并提供了Android Market下载应用程序。虽然与Linux相关,但由于不支持X Window和GNU C库,移植Linux程序较为困难。文章还提到了Android开发入门,包括使用模拟器的注意事项和调试技巧,以及Android应用程序的生命周期和内存管理特点。
摘要由CSDN通过智能技术生成
2011-10-09

==Android 简介==

Android 是 Google 公司基于 Linux 操作系统开发的一种专用于手持设备的操作系统。它支持 ARM 架构,这是一种智能手机经常使用的平台。事实上 Android 当初是由一家名字就叫 Android 的公司开发的。Google 公司于 2005 年将其收购,并成功地将 Android 发展得更好。由于其本身的开放特性,以及 Google 不遗余力的推动,Android 得到了广大软硬件厂商的支持。

Android 目前已得到了广泛开发人员的支持。目前已有 50 多万个应用程序。应用程序可以从开发商网站上下载,或从 Google 的 Android Market 网上商店下载。

Android 虽然其大部分是开源的,但硬件厂商如果直接不付费使用的话,将无法得到 Google 的 Android 认证,于是就不能合法地冠以 Android 设备的名义。因此意图制造 Android 产品的生产商必须花费一定费用来得到 Google Android 认证。

Android 虽然是从 Linux 分支出来的,但是它不支持 X Window 系统,也不支持标准的 GNU C 库,因此要把 Linux 程序移植到 Android 上是非常困难的,除非那个程序不使用 X Window 和 GNU C 库的功能。

Android 有以下特性:

- 适应不同的屏幕大小,提供基于 OpenGL ES 2.0(嵌入式设备)标准的 2 维图形库、3 维图形库

- SQLite 轻型数据库

- 网络连接:GSM/EDGE、IDEN、CDMA、EV-DO、UMTS、Bluetooth、Wi-Fi、LTE、NFC 以及 WiMAX

- 消息:SMS(短信)、MMS(彩信)、C2DM 等支持推送的消息协议

- 多语言支持

- 浏览器:基于 WebKit 开发的浏览器,加上基于 Chrome 开发的 Javascript 引擎,有着良好的兼容性

- Java 支持:Java 代码被编译成 Java byte code 之后,再被翻译成 Dalvik 虚拟机代码(文件扩展名 .dex,能包含多个类),然后安装于设备上,运行在 Dalvik 虚拟机上。http://en.wikipedia.org/wiki/Dalvik_(software);Dalvik 支持的基础类库不是 Java ME,而是它自己的一套基于 Apache Harmony 的类库;http://www.dalvikvm.com/;http://lordhong.iteye.com/blog/200009;http://v.youku.com/v_show/id_XMTQzMzIxMDg0.html

相对于苹果的 Objective-C 来说,Java 的好处是类型安全、内存安全和有垃圾回收。这可以节省大量发生 bug 时调试的时间,也能避免大多数内存泄漏的情形(少数由于使用复杂数据结构引起的内存泄漏还是需要程序员自己掌控)。

但另一方面来说,Android 不像 iOS,它不支持虚拟内存,因此编程时需要注意,不要占用太多内存,并且针对一定内存容量的客户群编写应用程序。否则一旦整个系统内存不够,low memory killer 将会启动并中止正在运行的进程。

- 多媒体支持:H.263、H.264、AAC、MP3、Ogg Vorbis 等常见视音频格式,以及 JPG、PNG、GIF、BMP 等图片格式。

- 多点触摸

- 蓝牙

- 视频电话

- 多任务

- 语音识别和相关应用

- 成为 WiFi 热点,进行互连与中继(tethering)

- 第三方的屏幕抓图支持


==Android 开发入门==

Android 的安装在此不进行展开,因为在 developer.android.com 上有详细的说明。首先开始看 examples 里面的 http://www.moandroid.com/?p=1095。

Android 模拟器的几个关键点:
- 模拟器基于 qemu 编写,速度不是很快(记得 qemu x86-x86 在 x86 机器上的速度大约是实机的 10%~20%,而 Android 模拟器则是 qemu arm-x86)。有条件的话还是用手机直接连上去调试比较快。
- 至今(2011 年左右)模拟器还未支持多点触摸。
- 模拟器支持快照(snapshot),可以保存运行时的状态到文件中,这样下次启动模拟器就不必重新启动模拟器内的操作系统了。如果使用快照的话,在 SDK and AVD Manager 里面按下设备的“启动”按钮的时候,会有个对话框弹出来。此时有两个复选框可供选择。一个是 Wipe User Data,另一个是 Start from Snapshot。前者用于想清除快照,从干净的状态启动时使用。后者用于从快照启动。(奇怪的是我的三星 GALAXY 模拟器如果从快照启动经常会失败,不知为何)。

Android 的应用程序在用户按下 Back 键或 Home 键时,程序可以选择退出,也可以选择在后台继续运行。一个程序运行时,就会有一个对应的进程。一个应用程序的用户界面包含多个 Activity,就好比多个网页。程序能够选择何时关闭 Activity,而 Android 将管理它何时退出。当一个应用程序自己的所有 Activity 都退出了,它的进程才会被关闭。这也许就是为什么有的人觉得 Android 这点不好,程序不退出在后台运行吃电池。如果程序写得好些的话,在后台一定时间之后应该做到不吃 CPU 才好。当程序开得实在太多了,内存不够用了(目前 Android 不支持虚拟内存),程序会被 Android 强制退出。

我在我的 Core 2 Duo 2.2GHz CPU 的单个核上跑 x86 虚拟机,在虚拟机上跑 Android 模拟器,发现速度真的很慢,启动一个 Android 2.2 设备需要大约 5 分钟的 CPU 时间(emulator-arm.exe 进程的 CPU 时间,Windows 任务管理器中可以查看),也许是因为 CPU 一级缓存发挥不了多少作用的缘故吧。此外,有时只要 adb 在,就半小时都启动不出来,这可能是个连接问题,有一些方法解决,请看后文。

《深入浅出 Android》一书(电子书,主页位于 http://code.google.com/p/androidbmi/wiki/DiveIntoAndroid 和 http://code.google.com/p/androidbmi/)中讲过,在命令提示符窗口里,把 android-sdk\tools 目录和 android-sdk\platform-tools 目录加到 PATH 环境变量之后,运行命令 adb shell 就能打开 Android Debugging Bridge (adb) 的命令提示符,它好比能让我们看到模拟器内的文件和目录树。但是,在我的配置里,如果用 Eclipse 启动项目,在日志里 adb 总是显示连不上模拟器。以下我会讲述一个配置 Windows 防火墙的方法来使其可用。但也许可以跳过这一步,而直接使用后面讲的 adb connect localhost 方法就能解决。

后来我用上述命令行的方法试下来,发现 adb 会去连端口 5037(它会显示这个端口号的)。然后我把防火墙设置为允许此端口,于是就能连了。此外,通过 Mark Russinovich 的 Process Explorer 发现使用 adb 的时候,应该有两个 adb,一个是用作客户端的 adb shell 命令,另一个是服务端,即提供 5037 端口的 adb.exe。然后,emulator-arm.exe 有两个服务端口:5554 和 5555。因此防火墙里这些端口都应被允许。

如果要使用 Eclipse 调试 Android 程序,ADT 插件会在 Eclipse 中使用端口 8600~8612 以及 8700 进行通讯。为了方便起见,在 Windows 防火墙中把 eclipse.exe 加到例外列表从而使其服务端口可以接受入站连接即可。

有时候即使防火墙都设好了还是不能连上,adb shell 仍然显示没有运行中的实例,后来发现是因为网线拔了的缘故。此时的解决办法只有把网线插上并保证另一头是可以连到一个路由器或电脑的……也可试试 adb connect localhost:5555,看看能否连上(因为一则它连到 localhost,即 127.0.0.1,这个不需要通过网卡就能访问;二则有时端口不是 5554 而是 5555,eclipse 会去连 5554),连上后再试一下 adb devices 看看是否能找到设备。如果不放心的话可以用 adb devices 显示一下,如果没有设备则表示网络不通了,如果显示 offline 或 device 则是连上了,只是 offline 表示正在启动中或其他什么情况。

通过运行 adb help 可以显示它的许多命令选项的帮助(这一点类似于 svn help,或 dir /?)。由于它显示时用的标准错误输出(stderr)而不是标准输出,因此可以在 cmd.exe 中这样运行:adb help 2>&1 | more。或者写一个临时的批处理文件 tempadb.bat,里面写 adb help 2>&1,然后在 cmd 里面运行 tempadb.bat > adbhelp.txt。以后就可以直接打开这个文件来查看它的帮助了,方便吧!

adb 有些有趣的命令。有一个命令选项是用于从模拟器中复制目录树出来的。比如 mkdir data\app,然后运行 adb pull data/app data\app,它就把模拟器中所有的应用程序文件复制出来了。我是通过 adb shell 来发现哪些目录底下有哪些文件的。由于 Android 是基于 Linux 的,而 Linux 是仿照 Unix 的,因此 Android 里有许多特殊的设备文件,这些文件是不能复制的(而且可能有符号链接导致无穷递归),所以如果用 adb pull / . 这样的命令将会陷入无穷递归,无法结束。data/data 目录则是应用程序的数据库文件。我把 dpk 文件复制了出来,并经过校验后,发现虚拟设备上的 apk 文件与本机编译出的文件完全一样,说明没有经过数字签名。我估计数字签名是应用程序放到 Android Market 上去的必要条件。

adb shell 运行以后,许多命令存在于 /system/bin 目录。里面有一些常见的 Unix/Linux 命令,比如 df(disk free,查看磁盘空闲空间)和 ps(process,查看进程列表)。ls 命令也有,但是好像没有帮助信息,因此不知道如何让它在显示目录时加个斜杠,也不知道如何让它带颜色显示。通常 Linux 下的 ls 命令可以加 -F 开关来让目录名后有个斜杠,而 --color 开关可以让它使用颜色来区分不同类型的文件,但在 adb 中都没用(基于 2.2 的 SDK)。当有多个设备时,需要给 adb shell 指定设备序列号,即 adb -s <serial> shell 这样的形式。

Eclipse 的调试器我一开始还不大会用。当 Android 调试开始时它会问你是否要显示调试界面。这个我觉得可以理解,就像 Visual Studio 一样,调试的界面与开发的界面会有不同的窗口和按钮的。一开始显示调试界面时,奇怪的是,我只找到菜单里的“停止”菜单项是可用的,其他的菜单项是不可有用的。当我开始怀疑是不是哪里状态不对时,偶然发现在“Debug”窗格里我选中的线程不是当前要调试的线程。然后当我选中了要调试的线程后,“单步”、“继续”等功能都可以用了。

Android 有一个调试日志显示器 Logcat,它可以用来显示日志。在 Eclipse 进入调试模式调试 Android 程序时,默认在右下角会显示 Logcat 的日志。每条日志带有一个级别:Verbose(详细的)、Debug(调试)、Information(给用户的信息)、Warning(警告)、Error(错误)。每条日志也有一个标签(tag),用于区别信息源。参见 http://www.droidnova.com/debugging-in-android-using-eclipse,541.html

有时候,R.java 中的资源并未被及时地编译进 apk 文件(就是在 Android 设备上运行的文件);不知道这个算不算一个 bug。我找到了一个解决办法。使用 Project 菜单下的选项,可以看见 Build Automatically(自动构建)左边有个钩。不需要去掉 Build Automatically 这一项的钩,而只要使用 Clean... 菜单项即可清理项目文件。在清理后它会自动重新编译。要是去掉 Build Automatically 的钩的话,运行 Clean... 之后,R.java 可能会消失,所以我不推荐这种做法。

在运行过程中,Android 界面有一些使用技巧。Android 模拟器的屏幕一开始可能是横向或纵向显示的。现在的手机都有重力感应,在感应到重力方向变化后,会相应调整屏幕的方向。Android 模拟器也有这样的功能。根据《深入浅出 Android》一书中的描述,在 Windows 上,按 Ctrl+F12 键就能切换纵横显示。另一个是它上面的几个按钮:Back 按钮是用于返回的,有时候它也会结束一个 Activity。Menu 按钮用于显示应用程序的菜单。Home 按钮用于回到桌面,长按(按住它几秒)Home 按钮在 Android 2.2 上会显示最近用过的应用程序,但并不一定表示它们还在运行。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值