Launcher更重要的意义在于它是一个桌面。就像一般PC机的桌面一样,在Android的桌面上,你可以放置经常使用的应用程序快捷方式,也可以将相同类型的快捷方式合并为一个文件夹以便管理;你可以放置一些桌面小部件,让你的桌面变得更炫更便利,也可以通过Launcher更换壁纸,使你的桌面更加个性化。
既然Launcher有如此重要的功能,下面我们就开始学习Launcher的实现。
1.1 总体结构
我们在讲解Launcher的时候经常会用到“组件”这个词。Launcher组件主要有以下3种。
基于Android应用程序框架来说,组件范围比较广,也就是我们常说的Android应用程序的四大组件。
从Launcher的UI角度来看,组件包括桌面(Workspace)、应用程序菜单(Allapps)、快捷启动栏(Hotseat)、搜索和页面指示条、快捷菜单等。我们称这类组件为UI组件。为了让大家对Launcher有一个比较直观的了解,我们针对Launcher的不同状态分别给出了相应的UI组件图。如图1-1到图1-3所示。
图1-1 初始状态的Launcher
图1-2 应用程序菜单(AllApps)
图1-3 预览模式
从Launcher桌面元素的角度来说,组件包括应用程序的快捷方式1及相关视图实现、文件夹及相关视图实现、桌面小部件及相关组件,我们称这类组件为桌面组件。它们的表现形式如图1-4所示。
图1-4 Launcher的桌面组件实例
以上3种组件是本书的重点剖析对象,我们将介绍一些Launcher中值得学习的经验以及一些好的编程习惯,还将讲解Launcher相关的动画效果(比如页面切换、模式切换、应用程序启动及退出效果、桌面组件的添加动画以及打开或关闭文件的过程动画等)、定制化的UI组件效果(比如点击时候的外发光效果、拖放桌面组件过程中的效果、搜索及拖放条的状态切换动画效果,以及快捷方式的投放效果等)以及一些相关应用程序的配置等,希望这些内容和经验能应用于你的开发工作中。
本书主要讨论的Launcher3是Launcher2的进化版本,在Android原生的设备中,从Android 4.4开始就将Launcher3作为桌面提供给设备使用者。相对于Launcher2,Launcher3进行了以下重要改动。
桌面页面动态管理。在Launcher3中,桌面页的数量不再是一成不变的,它可以随着软件的使用而有所增减。
桌面的页面提供了客户定制化页面。在Launcher3中,设备厂商可以通过该特性来个性化桌面。
桌面导航的更新,在这一点上,桌面的页面导航不再是单调的一条横线,而是页面指示更强的点导航。
1.2 Launcher3的交叉编译
想要了解一个软件,没有什么比让软件跑起来看看实际效果更好的途径了。因此,我们需要了解在交叉编译环境下如何编译Launcher3。这里我们在Ubuntu 14.10 64位的环境下进行分析,当然在此之前你需要按照Android官方网站的说明对编译环境做正确的配置,并且下载Android源代码,这些步骤我们就不在这里赘述了。
Launcher3位于Android源码的code_root\packages\apps\Launcher3下。这里的“code_root”是指你下载源代码的根目录。它的目录结构如图1-5所示。
图1-5 目录结构
以下是各个文件夹的内容及作用。
1. protos
这是一个使用protocol buffer描述的数据结构文件,文件名叫backup.proto。在这里描述了一些数据结构,它们用于Launcher的备份功能。关于这个文件以及相关编译我们稍后将会介绍。
2. res
这里保存了Launcher3所需要的资源文件,包括字符串资源、动画配置资源、尺寸以及相关标志资源、布局资源等。对于Launcher3来说,这个文件夹是至关重要的。
3. src
src文件夹中保存的是Launcher3的代码文件,这是Launcher3的核心部分。
4. tests
这是针对Launcher3的测试工程目录。对于很多应用程序来说,这个可能并不那么重要。但是如果都能提供这样的工程,软件质量将会有很大的提高。
5. util
util文件夹内存放的是protocol buffer的调试工具,包含了一个工具类、编译脚本以及该工具的清单文件。
6. WallpaperPicker
这是选择壁纸的应用程序。在Launcher2中,它只是Launcher的一部分,而在Launcher3中,它开始作为独立的应用程序出现。但是在完成编译的时候,它会作为一个Activity容纳到Launcher3中。
7. AndroidManifest.xml
这是Launcher3的清单文件,它记录了Launcher3的应用程序组件信息、声明的应用程序权限、使用到的权限以及应用程序配置信息等。这个文件非常关键。
8. Android.mk
这是Launcher3的编译脚本,是每一个需要通过交叉编译环境编译的应用程序都需要提供的文件。在这里记录了应用程序依赖的库、模块名称、源代码和资源文件路径以及编译属性等重要信息。它也是本节的主要内容。
9. CleanSpec.mk
这是Launcher3编译结果的清理脚本,当你使用make clean命令清理的时候,实际上执行的是这个脚本的内容。
10. proguard.flags
这是Launcher3的混淆脚本。为了保证代码安全,需要隐藏一些方法或者变量的名称,有一些方法在混淆过程中需要保留,这些东西都会记录在这个文件中。使用方法将会在讲解Android.mk文件的时候进行解释。
以上就是Launcher3需要我们关注的文件夹的内容及相关作用,了解这些知识有助于更好地理解接下来要讲解的Android.mk文件的内容。接下来我们进入主题,讲解Launcher3的主体编译部分。