如果您没有触及任何内容,请不要执行“make update-api”。还有其他 api 来自框架/base/res/AndroidManifest.xml,被 aapt 严重解析,使用有缺陷的 system/core/libcore/String8.cpp@@removeAll() 它们使用 memcpy 但应该是 memmove 来处理内存中重叠的字符串。
这是最新的 Debian (sid) 或 Ubuntu(16 也许 15)构建机器上的问题。
这是 libcore/String8.cpp 中的谷歌错误。修复在这里:https://android.googlesource.com/platform/system/core/+/dd060f01f68ee0e633e9cae24c4e565cda2032bd https://android.googlesource.com/platform/system/core/+/dd060f01f68ee0e633e9cae24c4e565cda2032bd
生活在(Ubuntu)边缘......可能会很痛苦!
我已经运行 Ubuntu 15.04 一段时间了。太棒了
拥有最新的内核以及最新的改进
Ubuntu 和 Debian。 (我过去关于使用 zRAM ramdisk 的文章是
例子)。
然而,拥有最新最好的玩具也有其缺点。我
最近花了 4 天对 Android 中的构建中断进行故障排除
3月25日之后的一段时间开始。我猜我更新了软件包
或者无意中更改了我的 glibc 版本。
结果是 Android checkapi 阶段出现构建错误
建造:
安装:/out/mydroid-ara/host/linux-x86/bin/apicheck 检查 API:
checkpublicapi-last 检查 API:checkpublicapi-current
/out/mydroid-ara/target/common/obj/PACKAGING/public_api.txt:20:错误
5:添加公共字段android.Manifest.permission.BACKUP
/out/mydroid-ara/target/common/obj/PACKAGING/public_api.txt:82:错误
5:添加公共字段android.Manifest.permission.INVOKE_CARRIER_SETUP
/out/mydroid-ara/target/common/obj/PACKAGING/public_api.txt:106:错误
5:添加公共字段
android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
/out/mydroid-ara/target/common/obj/PACKAGING/public_api.txt:116:错误
5:添加公共字段
android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST
**************************** 您已尝试更改先前批准的 API。
要消除这些错误,您有两种选择:1) 您可以添加
“@hide”javadoc 对方法中列出的注释等
上面的错误。
2)您可以通过执行以下命令来更新current.txt:
制作更新API
To submit the revised current.txt to the main Android repository,
you will need approval.
这发生在我的两个 Ubuntu 15.04 机器上,并且在
当构建 AOSP android-5.0.2_r1 和 android-5.1.0_r1 时。
对于那些不熟悉 Android 这部分的人
构建时,Android 框架导出所有公共部分
API 并确保当前版本与当前版本相匹配
位于frameworks/base/api/current.txt下。它通过以下方式做到这一点
解析frameworks/base/res/AndroidManifest.xml和任何当前的
设备的覆盖 .xml 文件并处理标有各种标记的项目
上面注释中的标志:@SystemApi、@hide 等。
checkapi 阶段的解析和处理部分是由
二进制“aapt”(Android 资产打包工具)。它的来源位于
在frameworks/base/tools/aapt下。
我首先检查平台/构建的上游修复或
平台/框架/基础项目。出局后我开始
通过使用以下命令调试 android 构建:“make checkapi
showcommands”,然后使用“strace”手动运行命令
查看每个二进制文件是如何参与的以及它生成的输出。
经过最初几个小时的调试后,很明显
out/target/common/obj/APPS/frameworks-res_intermediates/src/android/Manifest.java
文件中的注释在生成 aapt 时已损坏
它。我能够对 AndroidManifest.xml 进行一些手动更改
文件并让构建通过(删除多余的部分
评论)。
通过 strace 深入挖掘,然后查看各种静态链接
来源,我发现在 AndroidManifest.xml 注释中
处理 @SystemApi 令牌是通过
String8.removeAll("@SystemApi") 函数调用。实验上,我
去掉了这部分的处理。你瞧!构建
工作了。仔细研究一下removeAll函数,我能够
将 memcpy 函数定位为函数的一部分
造成腐败。
然后我研究了一点 memcpy 并指出你不应该
在重叠的内存地址上使用 memcpy,而不是 memmove
首选,因为它会在进行任何更改之前复制源文件
正在被送往目的地。将 memcpy 的使用更改为
memmove 构建已修复,世界一切顺利!
作为开源世界的一名优秀玩家,我立即认为我
应该将这一令人难以置信的调试壮举上游到主分支
系统/核心。可惜!修复已在 master 分支中
自2014年11月11日起!并且还没有被带入任何
当前的开发标签!叽https://android.googlesource.com/platform/system/core/+/dd060f01f68ee0e633e9cae24c4e565cda2032bd https://android.googlesource.com/platform/system/core/+/dd060f01f68ee0e633e9cae24c4e565cda2032bd
此后,我就这一更改联系了 Google 团队,并让他们
了解我的经验,希望我们能在
Android 的未来版本标签。
结论:显然 glibc 正在经历一些变化,其中一些
这些现在已经过滤到我的 Ubuntu 盒子里了。以前的地方
memcpy 用法不正确但仍然可用,它现在导致构建
我看到了。
如果您在 Android 版本中看到此类错误,并且您正处于
新版本的 Ubuntu 或 Debian 发行版,您可能想尝试
这个简单的补丁,看看是否有帮助。