AOSP编译art.module.platform.api.stubs出现NaN相关Java报错怎么解决
AOSP art.module.platform.api.stubs 编译错误修复方案
错误特征
你遇到的是构建平台API存根阶段的编译错误,核心报错如下:
out/soong/.intermediates/libcore/mmodules/core_platform_api/art.module.platform.api.stubs/android_common/javac/srcjars/java/lang/Double.java:106: error: self-reference in initializer public static final double NaN = NaN; ^ out/soong/.intermediates/libcore/mmodules/core_platform_api/art.module.platform.api.stubs/android_common/javac/srcjars/java/lang/Float.java:108: error: cannot find symbol public static final float NaN = NaNf; ^ symbol: variable NaNf location: class Float 2 errors
直接修改out目录下的自动生成文件无效,因为构建时会重新生成该文件,需要修改上游源定义或生成规则。
对应源文件位置
自动生成的存根文件的原始定义位于libcore模块,路径如下:
- Double类源文件:
libcore/ojluni/src/main/java/java/lang/Double.java - Float类源文件:
libcore/ojluni/src/main/java/java/lang/Float.java - 存根生成规则配置文件路径:
libcore/mmodules/core_platform_api/Android.bp
彻底修复步骤
步骤1:检查并修正原始类定义
打开上述Double、Float源文件,确认NaN常量定义:
- Double类的NaN正确定义应为:
public static final double NaN = 0.0d / 0.0; - Float类的NaN正确定义应为:
public static final float NaN = 0.0f / 0.0f;
如果发现源文件中存在NaN = NaN、NaN = NaNf之类的错误定义,直接修改为上述正确值即可。
步骤2:清理中间缓存重新编译
修改完源文件后,删除对应存根的中间生成缓存,避免复用错误产物:
rm -rf out/soong/.intermediates/libcore/mmodules/core_platform_api/art.module.platform.api.stubs/
之后重新触发AOSP全编译即可。
特殊场景:源文件定义正确仍报错
如果检查发现原始源文件的NaN定义是正确的,说明是存根生成工具metalava的常量解析bug,需要修改生成规则强制指定生成值:
编辑libcore/mmodules/core_platform_api/Android.bp,找到art.module.platform.api.stubs对应的构建目标,在metalava_flags配置项中添加如下参数:
metalava_flags: [ // 原有其他参数保留,新增以下两行 "--replace-static-field-value java.lang.Double.NaN=0.0d/0.0", "--replace-static-field-value java.lang.Float.NaN=0.0f/0.0f", ]
修改后清理中间缓存重新编译即可。
内容的提问来源于stack exchange,提问作者Антон Иванов
相关产品推荐
相关产品推荐

