尽管我们一直万分谨慎,但 Android 源代码有时还是会出现一些小问题。本页记录了使用 Android 源代码方面的已知问题。

编译问题

在针对 toro 进行编译时缺少 CellBroadcastReceiver

症状

在针对 toro 进行 AOSP 编译时(最高为 Jelly Bean 4.2.1),CellBroadcastReceiver 无法添加到系统中。

原因:

vendor/samsung/toro/device-partial.mk 中存在拼写错误,PRODUCT_PACKAGES 将其中的 K 替换成了 H。

解决方法:使用适用于 4.2.2 的最新程序包,或手动更正该拼写错误。

缺少 CTS 本机 XML 生成器

症状:在对 IceCreamSandwich 及更高版本进行的一些编译中,编译初期显示以下警告:/bin/bash: line 0: cd: cts/tools/cts-native-xml-generator/src/res: No such file or directory

原因:有些 Makefile 引用该路径,但该路径并不存在。

解决方法:无。这是一个无害的警告。

黑屏 Gingerbread 模拟器

症状:从 Gingerbread 分支直接编译的模拟器无法启动,一直卡在黑屏状态。

原因:Gingerbread 分支使用的是 R7 版本的模拟器,该模拟器并不具备运行最近推出的一些 Gingerbread 版本所需的所有功能。

解决方法:使用 R12 版本的模拟器,以及与这些工具匹配的较新内核。无需进行清除编译。

$ repo forall platform/external/qemu -c git checkout aosp/tools_r12
$ make
$ emulator -kernel prebuilt/android-arm/kernel/kernel-qemu-armv7

在 MacOS 10.7 Lion 中编译的模拟器无法正常工作。

症状:在 MacOS 10.7 Lion 和/或 XCode 4.x 中编译的模拟器(所有版本)无法启动。

原因:在开发环境中进行的某些更改导致系统在对模拟器进行编译时,采用的方式使模拟器无法正常工作。

解决方法:使用 SDK 中的模拟器二进制文件,该文件是通过 XCode 3 在 MacOS 10.6 中编译的,可在 MacOS 10.7 中正常工作。

WITH_DEXPREOPT=true 和模拟器编译。

症状:在模拟器编译期间进行部分编译或同步(使系统没有任何依赖关系)时,生成的版本无法正常工作。

原因:默认情况下,所有模拟器编译操作现在都会在编译时运行 Dex 优化,这就需要遵循所有依赖关系,以便在框架每次发生更改时都重新优化应用。

解决方法:通过 export WITH_DEXPREOPT=false 在本地停用 Dex 优化,通过 make installclean 删除现有的已优化版本,然后运行完整编译以重新生成未优化的版本。完成上述操作后,部分编译将会正常工作。

编译期间提示“权限遭拒”。

症状:所有编译都会失败,并且系统会提示“权限遭拒”,可能还会显示防病毒警告。

原因:某些防病毒程序将 Android 源代码树中的一些源文件错误地识别为包含病毒的文件。

解决方法:确认实际上并未包含病毒之后,在 Android 树中停用防病毒程序。这还有助于减少编译次数。

症状:编译会失败,而且症状各式各样。其中一种症状是 cc1: error: unrecognized command line option "-m32"

原因:Android 编译系统使用路径中的默认编译器,并假设它是用于生成在主机上运行的二进制文件的合适编译器。其他情况(例如:使用 Android NDK,或编译内核)导致默认编译器不是主机编译器。

解决方法:使用一个“干净的”shell,其中没有任何先前操作可能更换了默认编译器。

由非默认工具设置导致的编译错误。

症状:编译会失败,而且症状各式各样,并且系统可能会提示缺少文件或文件格式不正确。其中一种症状是 member [...] in archive is not an object

原因:Android 编译系统倾向于使用多种主机工具并依赖其默认行为。有些设置会更改这些工具的行为,导致其行为方式干扰编译系统。导致此类问题的已知变量是 CDPATHGREP_OPTIONS

解决方法:在自定义设置尽可能少的环境中编译 Android。

在 MacOS 10.7 中编译 4.0.x 及更低版本时出现的错误。

症状:在 MacOS 10.7 中编译 IceCreamSandwich 4.0.x(及更低版本)时会失败,并显示类似以下的错误:Undefined symbols for architecture i386: "_SDL_Init"

原因:4.0.x 与 MacOS 10.7 不兼容。

解决方法:改用 MacOS 10.6,或使用可在 MacOS 10.7 中编译的 master 分支。

$ repo init -b master
$ repo sync

在 MacOS 中使用 XCode 4.3 进行编译时出现的错误。

症状:使用 XCode 4.3 时,所有编译都会失败。

原因:XCode 4.3 将默认编译器从 gcc 切换成了 llvm,而 llvm 拒绝接受之前 gcc 会接受的代码。

解决方法:使用 XCode 4.2。

在 Ubuntu 11.10 中编译 4.0.x 及更低版本时出现的错误。

症状:在 Ubuntu 11.10 及更高版本中编译 IceCreamSandwich 4.0.x(及更低版本)时会失败,并显示类似以下的错误:<command-line>:0:0: warning: "_FORTIFY_SOURCE" redefined [enabled by default]

原因:Ubuntu 11.10 使用的 gcc 版本中默认已定义该符号,而 Android 也会定义该符号,从而导致冲突。

解决方法:改用 Ubuntu 10.04,或使用可在 Ubuntu 11.10 及更高版本中编译的 master 分支。

$ repo init -b master
$ repo sync

源代码同步问题

同步源代码时遇到的问题(代理问题)。

症状repo initrepo sync 失败,并显示 HTTP 错误,通常为 403 或 500。

原因:有很多可能的原因,大多数情况下都与 HTTP 代理有关,这些代理无法顺利传输大量数据。

解决方法:虽然还没有通用的解决方法,但有人报告说使用 Python 2.7 以及明确使用 repo sync -j1 可以改善某些用户的情况。

同步源代码树时遇到的问题(VirtualBox 以太网问题)。

症状:在某些 VirtualBox 安装过程中运行 repo sync 时,进程挂起或失败,而且症状各式各样。其中一种症状是 DownloadError: HTTP 500 (Internal Server Error: Server got itself in trouble)

原因:VirtualBox 的默认网络行为是使用 NAT(网络地址转换)将客户系统连接到网络。在执行 repo sync 时的大量网络活动会触发 NAT 代码中的某些临界情况。

解决方法:将 VirtualBox 配置为使用桥接网络,而非 NAT。

同步源代码树时遇到的问题(DNS 问题)。

症状:在运行 repo sync 时进程失败,并显示与无法识别主机名相关的各种错误。其中一种错误是 <urlopen error [Errno -2] Name or service not known>

原因:有些 DNS 系统难以应对同步源代码树时涉及的大量查询(在最糟糕的情况下,可能会有数百条查询请求)。

解决方法:手动解析相关主机名,并在本地对解析结果进行硬编码。

您可以使用 nslookup 命令解析主机名,该命令将为每个主机名指定一个数字 IP 地址(通常是在输出的“Address”(地址)部分)。

$ nslookup googlesource.com
$ nslookup android.googlesource.com

然后,您可以在本地对它们进行硬编码,方法是修改 /etc/hosts,在该文件中添加两行内容,形式如下:

aaa.bbb.ccc.ddd googlesource.com
eee.fff.ggg.hhh android.googlesource.com

请注意,这种方法只适用于服务器的地址不会更改的情况;如果服务器的地址发生更改,导致您无法连接,那么您必须重新解析这些主机名,并相应地修改 etc/hosts

同步源代码树时遇到的问题(TCP 问题)。

症状:在同步时 repo sync 挂起,通常是在同步操作完成 99% 时出现这种情况。

原因:TCP/IP 堆栈中的某些设置在有些网络环境中会导致出现问题,使得 repo sync 既无法完成,也不会失败。

解决方法:在 Linux 中,请运行 sysctl -w net.ipv4.tcp_window_scaling=0。在 MacOS 中,请在网络设置部分停用 rfc1323 扩展程序。

运行时问题

摄像头和 GPS 在 Galaxy Nexus 上无法正常工作。

症状:摄像头和 GPS 在 Galaxy Nexus 上无法正常工作。比如,摄像头应用一启动便会崩溃。

原因:Android 开放源代码项目中未提供这些硬件外围设备所需的专有库。

解决方法:无。