Android 构建AOSP 5.1时发生API更改错误

Android 构建AOSP 5.1时发生API更改错误,android,android-source,Android,Android Source,目前正在尝试构建android-5.1.0_r5。我查过资料来源,没有做任何修改。但是,在编译时,我得到以下错误 Checking API: checkpublicapi-current out/target/common/obj/PACKAGING/public_api.txt:20: error 5: Added public field android.Manifest.permission.BACKUP out/target/common/obj/PACKAGING/public_api

目前正在尝试构建android-5.1.0_r5。我查过资料来源,没有做任何修改。但是,在编译时,我得到以下错误

Checking API: checkpublicapi-current
out/target/common/obj/PACKAGING/public_api.txt:20: error 5: Added public field android.Manifest.permission.BACKUP
out/target/common/obj/PACKAGING/public_api.txt:82: error 5: Added public field android.Manifest.permission.INVOKE_CARRIER_SETUP
out/target/common/obj/PACKAGING/public_api.txt:106: error 5: Added public field android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE
out/target/common/obj/PACKAGING/public_api.txt:116: error 5: Added public field android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST

******************************
You have tried to change the API from what has been previously approved.

To make these errors go away, you have two choices:
   1) You can add "@hide" javadoc comments to the methods, etc. listed in the
      errors above.

   2) You can update current.txt by executing the following command:
         make update-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************
对公共api txt文件进行区分确实显示了不同

diff frameworks/base/api/current.txt out/target/common/obj/PACKAGING/public_api.txt 
19a20
>     field public static final java.lang.String BACKUP = "android.permission.BACKUP";
80a82
>     field public static final java.lang.String INVOKE_CARRIER_SETUP = "android.permission.INVOKE_CARRIER_SETUP";
103a106
>     field public static final java.lang.String READ_PRIVILEGED_PHONE_STATE = "android.permission.READ_PRIVILEGED_PHONE_STATE";
112a116
>     field public static final java.lang.String RECEIVE_EMERGENCY_BROADCAST = "android.permission.RECEIVE_EMERGENCY_BROADCAST";

然而,我不知道这些额外的公共字段是从哪里来的。有什么想法吗?

我确实看到了我的r8代码中的条目,因此您可能可以安全地运行make update api,完成后,再正常运行make命令。

如果您没有触摸任何东西,请不要执行“make update api”。还有其他API来自frameworks/base/res/AndroidManifest.xml,aapt使用错误的system/core/libcore/String8.cpp@@removeAll()对其进行了错误解析。它们使用memcpy,但对于内存中的重叠字符串,应该使用memmove

这是最新的Debian(sid)或Ubuntu(16或15)构建机器上的问题。 这是libcore/String8.cpp中的谷歌bug。修复程序如下:

这个人找到了它(迈克尔·斯科特),也许还有其他人。以下是他的调查:

生活在(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上次检查API:checkpublicapi当前 /out/mydroid ara/target/common/obj/PACKAGING/public_api.txt:20:error 5:添加了公共字段android.Manifest.permission.BACKUP /out/mydroid ara/target/common/obj/PACKAGING/public_api.txt:82:error 5:添加了公共字段android.Manifest.permission.INVOKE\u CARRIER\u设置 /out/mydroid ara/target/common/obj/PACKAGING/public_api.txt:106:错误 5:增加了公共字段 android.Manifest.permission.READ\u PRIVILEGED\u PHONE\u STATE /out/mydroid ara/target/common/obj/PACKAGING/public_api.txt:116:错误 5:增加了公共字段 android.Manifest.permission.RECEIVE\u EMERGENCY\u广播

****************************您已尝试更改先前批准的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和任何当前 设备的overlay.xml文件和进程项标记为 上面注释中的标志:@SystemApi、@hide等。此 checkapi阶段的解析和处理部分由 二进制“aapt”(安卓资产打包工具)。它的源头在哪里 在frameworks/base/tools/aapt下

我首先检查平台/构建或应用程序的上游修复 平台/框架/基础项目。出局后,我开始 通过使用“make checkapi”调试android构建 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函数,我能够 pin point将memcpy函数作为 造成腐败

然后我研究了一下memcpy,注意到你不应该这样做 在重叠的内存地址上使用memcpy,而不是使用memmove 首选,因为它在进行任何更改之前都会复制源 被送到目的地。将memcpy的用法更改为 memmove建筑已经修复,一切都很好

作为开源领域的一名优秀玩家,我立即想到 应该把这个令人难以置信的调试壮举上传到主分支 系统/核心的设计。但是,唉!修复已在主分支中进行 从2014年11月11日开始!而且还没有被带进任何一个 当前开发标签!发牢骚

此后,我就这一变化联系了谷歌团队,并让他们接受 了解我的经验,希望我们能在未来看到这个补丁 Android的未来发布标签

结论:显然,glibc正在经历一些变化,其中一些是 这些现在已经过滤到我的Ubuntu盒上。以前 memcpy的用法不正确,但仍然可用,它现在导致生成错误 我看到的那个破绽

如果你看到这种错误