离线下载
PDF版 ePub版

极客学院团队出品 · 更新于 2018-11-28 11:00:43

已知的问题

即使是在我们最好的照看下,也会偶尔出现小的问题。这篇文章会持续追踪在使用 Android 源码的过程中出现的问题。

构建问题

在 toro 构建中丢失 CellBroadcastReceiver

症状

在 AOSP 给 toro 的构建中(Jelly Bean 4.2.1 之后的版本),CellBroadcastReceiver 并不会包括在系统中。

原因:

vendor/samsung/toro/device-partial.mk 中的 PRODUCT_PACKAGES 有一个排版错误:有一个 H 替代了 K。

修复:

使用 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 依赖的路径并不存在。

修复:

无。这是一个无害的警告。

Black Gingerbread 模拟器

症状:

这个模拟器直接由 gingerbread 分支构造而且没有启动,一直卡死在绿屏状态下。

原因:

gringerbread 分支使用的是 R7 版本的模拟器,该模拟器并没有所有必要的特征来运行最近版本的 gingerbread。

修复:

使用 R12 版本的模拟器,以及一个新的匹配工具的核心。不需要清理 build。

$ 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 6 的 MacOS 10.6 上,并且可以在 MacOS 10.7 上工作。

WITH_DEXPREOPT=true 以及模拟器构建。

症状:

在模拟器的构建中,当部分行为的构建以及同步(使系统没有依赖)时,结果构建没有生效。

原因:

默认情况下,现在所有模拟器构建都会进行 Dex 优化,这就会导致每次框架改变都会请求跟随所有的依赖,用来重新优化应用。

修复:

export WITH_DEXPREOPT=false 使本地的 Dex 优化失效,用 make installclean 删除已经存在的优化版本,然后运行一个完整的构造,重新生成没有优化的版本。在进行完上述操作之后,部分的构造将会开始工作。

构造过程中出现 Permission Denied

症状:

所有的构建失败都伴随着 Permission Denied,可能伴随着反病毒警告。

原因:

有些反病毒程序会将一些 Android 源码树中的文件错误的识别成包含病毒。

修复:

经过确认没有病毒存在后,让反病毒程序在 Android 源码树中失效。这样做对减少构建次数有好处。

构建错误与使用错误的编译器

特征:

构建错误有许多的特征。其中一个特征是: cc1: error: unrecognized command line option "-m32”

原因:

在 PATH 中 Android 构建系统使用的是默认的编译器,假设在 host 中有合适的编译器生成的二进制文件。其他情况(比如使用 Android NDK 或者构建内核)将会导致默认的编译器不是主编译器。

修复:

使用 “clean” 脚本,确保没有别的操作会更改默认的编译器。

由于无默认工具设置导致的构造错误

特征:

构造失败有很多特征,可能是由于文件丢失或者文件格式错误。其中一个的特征是 member [...] in archive is not an object

原因:

Android 构建系统往往使用很多 host 工具并依赖于他们默认的行为。有些设置更改了工具的行为并使他们的行为干扰到了系统构建。已知会导致问题的变量是 CDPATHGREP_OPTIONS

修复:

在尽可能少的自定义环境中构建 Android。

在 MacOS 10.7 上构建 4.0.x 以及之前版本的错误

特征:

在 MacOS 10.7 上构建 IceCreamSandwich 4.0.x(和更老的版本)失败,并提示下面的错误信息: Undefined symbols for architecture i386: "_SDL_Init”

原因:

在 MacOS 10.7 上不能适配 4.0.x

修复:

降级电脑系统到 MacOS 10.6 或者是在 MacOS 10.7 上构造当前版本。

$ 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 或者之后的版本中使用。

$ repo init -b master
$ repo sync

源文件同步问题

复杂同步源代码(代理问题)

特征:

在 http 错误的时候 repo 或者是 repo sync 失败,通常是 403 或者是 500。

原因

有很多引起错误的原因,其中最常见的是关联到了 http 代理,这是传输大数据的时候比较困难。

修复:

暂时还没有通用解决方法,使用 python 2.7 以及明确的使用 repo sync -jl 来改善一些用户的使用情况。

复杂同步源代码(VituralBox 以太网问题)

特征:

当在一些 VituralBox 安装中运行 repo sync,进程伴随着可能的特征挂起或者失败。其中一种特征是:DownloadError: HTTP 500 (Internal Server Error: Server got itself in trouble)

原因:

默认的 VirualBox 的网络行为是使用 NAT(Network Addrss Translation)连接客户系统来连接网络。繁重的网络行为将会引发 NAT 中的某些代码。

修复:

配置 VirtualBox 让其使用桥连接来代替 NAT。

复杂同步源代码(NDS 问题)

特征:

当运行 repo sync 时,由于无法识别 hostname 伴随着一些错误导致进程失败。其中一个错误是: <urlopen error [Errno -2] Name or service not known>

原因:

有些 DNS 系统在应对大数量的请求时需要同步源码树而导致运行缓慢(在最坏的假设情况下可能有好几百请求)

修复:

手工移除相关的 hostname,并在本地硬编码那些结果。

你可以用 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

需要注意的是这只在服务的地址没有改变的情况下,所以如果他们更改了地址而你又无法连接,这时候你就要重新的获取 hostname,相应的你还要更改 etc/hosts

复杂同步源代码(TCP 问题)

特征:

在同步时 repo sync 挂起,通常都是在已经同步了 99% 的情况下。

原因:

在 TCP/IP 堆的设置会使一些网络环境变的很糟糕,比如 repo sync 会既不编译,也不失败。

修复:

在 Linux 上执行 sysctl -w net.ipv4.tcp_window_scaling=0。在 MacOS 上,使 rfc 1323 扩展失效。

运行问题

照相机和 GSP 在 Galaxy Nexus 上失效

特征:

照相机和 GSP 在 Galaxy Nexus 上失效。举个例子,照相机应用一启动就崩溃。

原因:

在 Android 开源项目中不提供这些硬件外设需要专有库。

修复:

无。

上一篇: Android 平台 64... 下一篇: 开发