本文档的原名是AndroidCompatibilityDefinition,以下简称ACD。以下对文档的重点进行了翻译,省略了一些图表和细节规范。如果想大致了解ACD的话,可以浏览该文档,但具体进行某一项CTS的时候,请参考原文档。
3 软件
Android平台包含了一个managedAPI集合,一个nativeAPI集合,还有一个softAPI集合(Intentsystem和web-applicationAPI)。这一章详细地说说兼容性要求的硬件参数、软件API及相关技术,还有UI行为。想符合兼容性标准,必须满足所有这些要求。
3.1 Managed API兼容
Android 应用程序运行在一个Managedenvironment中,也就是一个基于DalvikVm的运行时环境。Android平台API是指平台向APP开放的基于DalvikVm的API。必须提供这些API的完整实现,包括API文档中描述的所有API功能。
绝不能删除任何ManagedAPI,修改API接口或签名,改变API功能等,ACD特殊规定的API除外。
ACD允许一些针对特定硬件的API功能不被实现,但这些API必须存在,并且以合理的方法响应APP。
3.2 Soft API
Android对Intent,permission等Android应用程序在编译时不能确定的这些SoftAPI兼容性进行了规定。设备必须满足本章提到的所有要求。
3.2.1 Permissions
设备必须支持SDK开发文档中提到所有permission。在第10章中列出了满足Android安全模型需要满足的附加条件。
3.2.2Build Parameters
Android的android.os.Build类中包含了一些常是用来描述设备的编译属性。为保持兼容性,下面这些属性必须被支持。
VERSION.RELEASE
当前运行的Android系统的版本,它的值是一个字符串,必须是易读的,且是这里(http://source.android.com/compatibility/2.3/versions.html
)提供的几个值中的一个。
VERSION.SDK
当前运行的Android系统的版本,必须是一个第三方应用程序可读的格式。对Android2.3来说,这个字段必须是整数值9.
VERSION.INCREMENTAL
用来标识特定的编译版本,必须是易读的格式。这个值不能在提供给用户的几个编译版本之间共用。这个字段有一个经典的使用,就是用来标识哪个buildnumber或者source-controlchange identifier
被用来生成这个编译版本。对这个段的格式没有什么要求,但绝不能是null或者””。
BOARD
标识机器使用的硬件。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
BRAND
标识机器所有者(公司、组织或者个人)的名字。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
DEVICE
标识设备的工业设计代号。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
FINGERPRINT
唯一识别这个系统编译版本的字符串,必须是下面这种格式
$(BRAND)/$(PRODUCT)/$(DEVICE):$(VERSION.RELEASE)/$(ID)/$(VERSION.INCREMENTAL):$(TYPE)/$(TAGS)
比如:
acme/mydevice/generic/generic:2.3/ERC77/3359:userdebug/test-keys
fingerprint绝对不能包含空格字符。如果模板中包含的哪参数的值有空格,在这里必须被替换成"_"。这个字段必须全部是7-bit的ASCII。
HOST
系统是在哪个host上被编译的?这个字符串就是唯一标识这个host的值。不能为null或者””,其它没要求。
ID
标识一个特定的发布版本。可以和VERSION.INCREMENTAL
相同,但必须让用户可以借助它区分出不同的编译版本。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
MODEL
对用户可见的设备名字。应该和设备在市场上的名字相同。不能为null或者””,其它没要求。
PRODUCT
设备的编号,不必让终端用户觉得它有意义。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
TAGS
以comma分隔的标签列表为了更详细地区分系统的编译版本。比如“unsigned,debug”。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
TIME
系统编译时的时间戳。
TYPE
标识该版本的运行时配置。必须是与下面三个值中的其中一个相对应:user,userdebug,eng。这个字段必须全部是7-bit的ASCII,并且与下面的正则表达式相匹配"^[a-zA-Z0-9.,_-]+$"
USER
编译该系统的作者的名字或者ID。不能是null或者“”,其它没要求。
3.2.3 Intent兼容
这一章介绍一下系统必须安装处理哪些Intent的应用程序。
3.2.3.1核心应用程序Intent
默认的Android系统包含了一些核心的应用程序,比如Phonedialer,calendar,contacts,musicplayer等。可以替换这些程序,但它们所能支持哪些模式的Intent,你也的程序必须支持。下面列出了系统的核心应用程序:
• Desk Clock
• Browser
• Calendar
• Calculator
• Contacts
• Gallery
• GlobalSearch
• Launcher
• Music
• Settings
这些核心程序包含了各种Activity,Service组件,这些组件必须都是public的。也就是说,android:exported的值必须是true。
3.2.3.2 Intent重写
由于Android是一个可扩展的系统,那么3.2.3.1中提到的Intent都可以被第三方程序替换。你的系统也不能让核心应用程序对这些Intent有特权,或者阻止第三方应用程序处理这些Intent,请把选择权交给用户。
3.2.3.3 Intent Namespace
你的系统不能包含任何可以处理新的Intentpattern的Android组件,也不要修改或者扩展任何3.2.3.1列出的这些现存的Intentpattern。
3.2.3.4Broadcast Intent
第三方应用程序信赖于系统广播告诉它们软件和硬件环境的变化。你的设备也必须可以发送这些广播,SDK文档有这些广播的列表。
3.3 Native API兼容
Managedcode运行在Dalvik中,可以调用APK中包含的.so库提供的NativeAPI。由于本地代码调试信赖于处理器,Android的NDK中定义了一些ABI,可以看一下docs/CPU_ARCH_ABIS.txt。只要你的设备与其中一个或者多个兼容,你就可以实现NDK兼容性了。
想要你的设备支持一个ABI的话,必须做到这些:
让运行在Managedenvironment中的代码可以通过标准的JNI调用本地代码。
通过android.os.Build.CPU_ABI标识出设备支持最新的ABI。系统预定义的所有ABI列表可以参见docs/CPU_ARCH_ABIS.txt。如果你支持的ABI没有在这个列表中,就不要标识出来了。
包含本地代码的APP必须可以访问下面这些库:
• libc (C library)
• libm (math library)
• Minimal support forC++
• JNI interface
• liblog (Androidlogging)
• libz (Zlibcompression)
• libdl (dynamic linker)
• libGLESv1_CM.so(OpenGL ES 1.0)
• libGLESv2.so (OpenGLES 2.0)
• libEGL.so (nativeOpenGL surface management)
• libjnigraphics.so
• libOpenSLES.so (OpenSound Library audio support)
• libandroid.so (nativeAndroid activity support)
• Support for OpenGL, asdescribed below
未来的Android版本可能支持更多的ABI。另外,Nativecode兼容很难,尽量使用系统默认的吧。
3.4 Web兼容性
许多应用程序的功能实现严重信赖于android.webkit.WebView,所以,对WebView的实现必须保持兼容性。
3.4.1 WebView兼容性
对整个Webkit引擎的定制不要影响WebView的行为。WebView报告的UA必须是下面的格式:
Mozilla/5.0 (Linux; U;Android $(VERSION); $(LOCALE); $(MODEL) Build/$(BUILD))AppleWebKit/533.1 (KHTML, like
Gecko) Version/4.0 MobileSafari/533.1
$(VERSION)的值必须与android.os.Build.VERSION.RELEASE的值相同。
$(LOCAL)的值应该遵守ISO标准,并指明设备配置的真实locale
$(MODEL)必须与android.os.Build.MODEL的值相同。
$(BUILD)的值必须与android.os.Build.ID的值相同。
WebView应该尽可能多地支持HTML5.至少也应该支持下面的几个特征:
application cache/offlineoperation
<video>标签
geolocation
(几何定位)
另外,你的系统必须支持HTML5/W3Cwebstorage API,最好支持HTML5/W3CindexedDBAPI。另外,WEB开发目前正在由webstorage向indexedDB过渡,所以,未来的Android版本中,indexedDB可能变成必须的。
HTML5 APIs,和所有的JSAPI一样,在WebView中必须是默认禁止的,开发者可以手动打开。
3.4.2 Browser兼容性
系统必须包含一个独立的浏览器程序,是否基于WebKit不重要,这个浏览器的UA也可以定制。但是,WebView必须基于WebKit。
3.5 API行为兼容
所有的API(managed,soft,native以及web)的行为都要与原有实现保持一致。有几个地方要注意:
绝对不能修改标准Intent的含义和行为。
绝对不能修改系统组件(Activity,Service,ContentProvider等)的生命周期和生命周期的含义。
绝对不能修改标准权限的含义。
CTS没有对所有方面都进行测试,我们对自己的系统的负责,保证不要发动系统的关键部分。
3.6 API 命名空间
Android使用下面这些包名:
• java.*
• javax.*
• sun.*
• android.*
• com.android.*
为了确保兼容第三方应用程序,你千万不要修改这些包里的东西,下面的地方尤其注意:
你可以修改API的底层实现,但这样的修改不能影响到公共API的行为和签名。
不能向上面这些API中添加任何公共的类、接口、字段或者方法。
你可以向定制系统中添加API,但不能向上面的包或者其它组织的包(比如com.google.*)中添加。正确的做法是将定制的API打包成一个共享库,这样,只有通过<uses-library>标签明确标识要使用这些库的APP才会被这些API带来的附加的内存消耗影响到。
3.7 Virtual Machine兼容
对于把屏幕配置为中等或者低density的设备来说,必须把Dalvik配置为允许每个APP占用至少16MB内存。而把屏幕配置为高或者超高density的设备,被个数值至少是24MB。
3.8 UI兼容
这里包含AppWidget,Notification,Search,Toast,LiveWallpapers等部分,都可以用定制的来替换掉系统中原有的,但都得满足这里的要求:
细节略过。。。