源码中新增API后的编译问题(Android 12)

最近公司的产品平台升级,芯片厂商换了,Android版本也由原来的Android 9 升级到了Android 12;

Audio模块要求支持支持多通道录音,于是在源码里新增了几个音频通道常量的定义,包括Audio的java层和hal层,主要新增的文件如下:

frameworks/base/media/java/android/media/AudioFormat.java

  public static int inChannelMaskFromOutChannelMask(int outMask) throws IllegalArgumentException {
          if (outMask == CHANNEL_OUT_DEFAULT) {
              throw new IllegalArgumentException(
                     "Illegal CHANNEL_OUT_DEFAULT channel mask for input.");
         }
         switch (channelCountFromOutChannelMask(outMask)) {
             case 1:
                 return CHANNEL_IN_MONO;
             case 2:
                 return CHANNEL_IN_STEREO;
         /**add by *** mic start**/
             case 8:
                  return CHANNEL_IN_08;
             case 12:
                  return CHANNEL_IN_12;
              case 16:
                  return CHANNEL_IN_16;
          /**add by *** mic end**/
 
              default:
                  throw new IllegalArgumentException("Unsupported channel configuration for input.");
          }
      }

system/media/alsa_utils/alsa_device_profile.c

system/media/audio/include/system/audio-hal-enums.h

hardware/libhardware/modules/usbaudio/audio_hal.c

API增加完之后编译报错 1:

[ 83% 111200/133076] //system/media/audio_utils:libaudioutils header-abi-diff libaudioutils.so.abidiff
FAILED: out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.abidiff
(prebuilts/clang-tools/linux-x86/bin/header-abi-diff -allow-unreferenced-changes -allow-unreferenced-elf-symbol-changes -lib libaudioutils -arch arm64 -o out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.abidiff -new out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.lsdump -old prebuilts/abi-dumps/vndk/31/64/arm64_armv8-a/source-based/libaudioutils.so.lsdump)|| (echo 'error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libaudioutils' && (mkdir -p $DIST_DIR/abidiffs && cp out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.abidiff $DIST_DIR/abidiffs/) && exit 1)
******************************************************
error: VNDK library: libaudioutils's ABI has INCOMPATIBLE CHANGES Please check compatibility report at: out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.abidiff
******************************************************
error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libaudioutils
[ 83% 111203/133076] //system/media/audio_utils:libaudioutils header-abi-diff libaudioutils.so.abidiff [arm]
FAILED: out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm_armv8-a_shared/libaudioutils.so.abidiff
(prebuilts/clang-tools/linux-x86/bin/header-abi-diff -allow-unreferenced-changes -allow-unreferenced-elf-symbol-changes -lib libaudioutils -arch arm -o out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm_armv8-a_shared/libaudioutils.so.abidiff -new out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm_armv8-a_shared/libaudioutils.so.lsdump -old prebuilts/abi-dumps/vndk/31/64/arm_armv8-a/source-based/libaudioutils.so.lsdump)|| (echo 'error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libaudioutils' && (mkdir -p $DIST_DIR/abidiffs && cp out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm_armv8-a_shared/libaudioutils.so.abidiff $DIST_DIR/abidiffs/) && exit 1)
******************************************************
error: VNDK library: libaudioutils's ABI has INCOMPATIBLE CHANGES Please check compatibility report at: out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm_armv8-a_shared/libaudioutils.so.abidiff
******************************************************
error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libaudioutils
[ 83% 111304/133076] soong_build docs out/soong/docs/soong_build.html
libRkTeeWeaver want to conditional Compile
libgralloc_priv want to conditional Compile

初看这里的报错,一脸懵逼--,再仔细深入读英文得知在out目录有一份报告,

地址是 out/soong/.intermediates/system/media/audio_utils/libaudioutils/android_vendor.31_arm64_armv8-a_shared/libaudioutils.so.abidiff

进入out目录后,打开文档内容:

lib_name: "libaudioutils"
  2 arch: "arm"
  3 enum_type_diffs {
  4   type_stack: "android::audio_utils::Balance::setBalance-> android::audio_utils::Balance *-> android::audio_utils::Balance-> audio_channel_mask_t-> "
  5   name: "audio_channel_mask_t"
  6   fields_diff {
  7     old_field {
  8       enum_field_value: 7864316
  9       name: "AUDIO_CHANNEL_IN_ALL"
 10     }
 11     new_field {
 12       enum_field_value: 7864318
 13       name: "AUDIO_CHANNEL_IN_ALL"
 14     }
 15   }
 16   fields_added {
 17     enum_field_value: 262152
 18     name: "AUDIO_CHANNEL_IN_08"
 19   }
 20   fields_added {
 21     enum_field_value: 262162
 22     name: "AUDIO_CHANNEL_IN_12"
 23   }
 24   fields_added {
 25     enum_field_value: 262176
 26     name: "AUDIO_CHANNEL_IN_16"
 27   }
 28 }
 29 compatibility_status: INCOMPATIBLE

AUDIO_CHANNEL_IN_ALL的值确实不一样,再就是后面我新增的三个音频通道的定义,看到这里其实也没有什么解决思路。。。 

后来再仔细阅读报错信息,其实这里有说明如何解决:

error: Please update ABI references with: $ANDROID_BUILD_TOP/development/vndk/tools/header-checker/utils/create_reference_dumps.py  -l libaudioutils
就是执行一个python脚本,于是回到源码的主目录执行脚本,接着又继续报错

 看着是脚本要在out目录创建文件夹,但是我没有权限,后续跟公司SCM沟通,取得root权限后继续执行python脚本,仍然报错!

这有又是什么鬼....问题困扰了我大概1天时间,各种尝试,后来也是网上搜到前辈们的文章,说是还要在执行脚本的后面增加 product参数,也即是-product product_name ,增加该参数后继续执行脚本,以为会编译成功呢,一直没关注终端,半个多小时后,又继续编译报错。。。

错误二:

[ 49% 5177/10550] //packages/modules/Permission/PermissionController:PermissionController aapt2 link [common apex30]
packages/modules/Permission/PermissionController/res/layout-television/preference_permissions_category.xml:35: warn: generated id 'android:id/summary' for external package 'android'.
packages/modules/Permission/PermissionController/res/layout-television/preference_permissions_category.xml:27: warn: generated id 'android:id/title' for external package 'android'.
[ 50% 5361/10550] //frameworks/base/packages/SystemUI:SystemUI-core aapt2 link [common]
warn: removing resource com.android.systemui:string/car_add_user without required default value.
warn: removing resource com.android.systemui:string/car_guest without required default value.
warn: removing resource com.android.systemui:string/car_new_user without required default value.
warn: removing resource com.android.systemui:string/start_guest_session without required default value.
warn: removing resource com.android.systemui:string/user_add_user_message_setup without required default value.
warn: removing resource com.android.systemui:string/user_add_user_message_update without required default value.
[ 56% 5907/10471] //packages/apps/TV:LiveTv aapt2 link [common]
warn: removing resource com.android.tv:string/setup_sources_description without required default value.
[ 60% 6146/10211] //frameworks/base:api-stubs-docs-non-updatable check current API [common]
FAILED: out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/check_current_api.timestamp
( true && diff -u -F '{ *$' frameworks/base/core/api/current.txt out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_api.txt && diff -u -F '{ *$' frameworks/base/core/api/removed.txt out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_removed.txt && touch out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/check_current_api.timestamp ) || ( echo -e "\n******************************\nYou have tried to change the API from what has been previously approved.\n\nTo make these errors go away, you have two choices:\n   1. You can add '@hide' javadoc comments (and remove @SystemApi/@TestApi/etc)\n      to the new methods, etc. shown in the above diff.\n\n   2. You can update current.txt and/or removed.txt by executing the following command:\n         m api-stubs-docs-non-updatable-update-current-api\n\n      To submit the revised current.txt to the main Android repository,\n      you will need approval.\n******************************\n" ; exit 38 ) # hash of input list: 029245c8d5b1fb42417b35080e5be16671c76fca0c74c985b4a579247f7b7b1e
--- frameworks/base/core/api/current.txt        2022-05-27 12:41:29.773770347 +0800
+++ out/soong/.intermediates/frameworks/base/api-stubs-docs-non-updatable/android_common/metalava/api-stubs-docs-non-updatable_api.txt  2022-05-27 12:49:10.344732414 +0800
@@ -20436,9 +20436,9 @@ public final class AudioFormat implement
     field @Deprecated public static final int CHANNEL_CONFIGURATION_MONO = 2; // 0x2
     field @Deprecated public static final int CHANNEL_CONFIGURATION_STEREO = 3; // 0x3
     field public static final int CHANNEL_INVALID = 0; // 0x0
-    field public static final int CHANNEL_IN_08 = 262152; // 0x40008 add by pzxu for DTEN ON mic start
+    field public static final int CHANNEL_IN_08 = 262152; // 0x40008
     field public static final int CHANNEL_IN_12 = 262162; // 0x40012
-    field public static final int CHANNEL_IN_16 = 262176; // 0x40020 add by pzxu for DTEN ON mic end
+    field public static final int CHANNEL_IN_16 = 262176; // 0x40020
     field public static final int CHANNEL_IN_BACK = 32; // 0x20
     field public static final int CHANNEL_IN_BACK_PROCESSED = 512; // 0x200
     field public static final int CHANNEL_IN_DEFAULT = 1; // 0x1

******************************
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 (and remove @SystemApi/@TestApi/etc)
      to the new methods, etc. shown in the above diff.

   2. You can update current.txt and/or removed.txt by executing the following command:
         m api-stubs-docs-non-updatable-update-current-api

      To submit the revised current.txt to the main Android repository,
      you will need approval.
******************************

12:50:19 ninja failed with: exit status 1

#### failed to build some targets (08:48 (mm:ss)) ####

这种编译错误,其实有些似曾相识,在Android 低版本时 新增API后也遇到过类似的错误,主要是在android 的framework层增加了API后,要更新 frameworks/base/core/api/current.txt 的文档,是通过 make update-api 命令执行的更新,命令执行后文档里会生成一句新增接口的标识常量

但是仔细看这里提示的是  m api-stubs-docs-non-updatable-update-current-api 

不同版本略微有不同,不过实际还是一样的,经过尝试,有效的执行命令是:

make api-stubs-docs-non-updatable-update-current-api 

 另外还补充一句,执行该脚本时也需要out目录的root权限,由于公司编译架构的限制,开始执行该脚本时,也会报权限不允许,后来是跟SCM沟通开放root权限后,才得以执行成功,至此整个软件版本也编译通过

参考:

(6条消息) You have tried to change the API from what has been previously approved_平仄散人的博客-CSDN博客

(6条消息) Android P VNDK报错_他叫小黑的博客-CSDN博客_create_reference_dumps.py

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
本次更新对 UDP 系列组件作了大量优化,新增了可靠 UDP 组件! HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序。 HPSocket v5.5.1 rc2 更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 增加可靠 UDP 示例 TestEcho-ARQ 和性能测试示例 TestEcho-ARQ-PFM 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 C# SDK 增加 UDP 组件封装类 二、Linux 更新 提供 Shell 编译脚本 compile.sh,支持在本机编译 HP-Socket 提供 Android NDK 交叉编译脚本(脚本目录:/project/android-ndk) 三、其它更新 http-parser 升级到 2.9.1 版本 jemalloc 升级到 5.2.0 版本 HPSocket v5.5.1 rc2 模块更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 二、模块部分代码优化 三、更新为HPSocket 5.5.1 rc2版本,完全兼容5.4.4版本
本次更新对 UDP 系列组件作了大量优化,新增了可靠 UDP 组件! HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序。 HPSocket v5.5.1 rc2 更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 增加可靠 UDP 示例 TestEcho-ARQ 和性能测试示例 TestEcho-ARQ-PFM 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 C# SDK 增加 UDP 组件封装类 二、Linux 更新 提供 Shell 编译脚本 compile.sh,支持在本机编译 HP-Socket 提供 Android NDK 交叉编译脚本(脚本目录:/project/android-ndk) 三、其它更新 http-parser 升级到 2.9.1 版本 jemalloc 升级到 5.2.0 版本 HPSocket v5.5.1 rc2 模块更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 二、模块部分代码优化 三、更新为HPSocket 5.5.1 rc2版本,完全兼容5.4.4版本
android技术内幕:系统卷》 前言 第1章 准备工作 /1 1.1 深入认识android /2 1.1.1 android的系统构架 /2 1.1.2 android的初始化流程 /5 1.1.3 各个层次之间的相互关系 /8 1.1.4 android系统开发(移植)和应用开发 /11 1.2 获取和编译android码 /13 1.2.1 环境配置 /13 1.2.2 获取android码 /14 1.2.3 编译android码及其工具包 /16 1.2.4 运行android系统 /21 1.3 开发环境搭建 /23 1.3.1 应用开发环境搭建 /23 1.3.2 码开发环境搭建 /26 1.4 android码结构 /32 1.5 小结 /33 第2章 android的内核机制和结构剖析 /34 2.1 linux与android的关系 /35 .2.1.1 为什么会选择linux /35 2.1.2 android不是linux /35 2.2 android对linux内核的改动 /37 2.2.1 goldfish /37 2.2.2 yaffs2 /38 2.2.3 蓝牙 /39 2.2.4 调度器(scheduler)/39 2.2.5 android新增的驱动 /40 2.2.6 电管理 /41 2.2.7 杂项 /41 2.3 android对linux内核的增强 /42 2.3.1 alarm(硬件时钟)/43 2.3.2 ashmem(匿名内存共享)/46 2.3.3 low memory killer(低内存管理)/52 2.3.4 logger(日志设备)/56 2.3.5 android pmem /65 2.3.6 switch /79 2.3.7 timed gpio /88 2.3.8 android ram console /94 2.4 小结 /99 第3章 android的ipc机制--binder /100 3.1 binder概述 /101 3.1.1 为什么选择binder /101 3.1.2 初识binder /102 3.2 binder驱动的原理和实现 /102 3.2.1 binder驱动的原理 /102 3.2.2 binder驱动的实现 /103 3.3 binder的构架与实现 /132 3.3.1 binder的系统构架 /132 3.3.2 binder的机制和原理 /133 3.4 小结 /150 第4章 电管理 /151 4.1 电管理概述 /152 4.2 电管理结构 /152 4.3 android的电管理机制 /153 4.4 android管理机制的实现 /154 4.5 小结 /187 第5章 驱动的工作原理及实现机制 /188 5.1 显示驱动(framebuffer)/189 5.1.1 framebuffer的工作原理 /189 5.1.2 framebuffer的构架 /190 5.1.3 framebuffer驱动的实现机制 /190 5.2 视频驱动(v4l和v4l2)/201 5.2.1 v4l2介绍 /201 5.2.2 v4l2的原理和构架 /201 5.2.3 v4l2的实现 /202 5.3 音频驱动(oss和alsa)/208 5.3.1 oss与alsa介绍 /208 5.3.2 oss的构架与实现 /209 5.3.3 alsa的构架与实现 /213 5.4 mtd驱动 /214 5.4.1 mtd驱动的功能 /214 5.4.2 mtd驱动的构架 /215 5.4.3 mtd驱动的原理及实现 /215 5.5 event输入设备驱动 /223 5.5.1 input的系统构架 /223 5.5.2 event输入驱动的构架 /224 5.5.3 event输入驱动的原理 /224 5.5.4 event输入驱动的实现 /225 5.6 蓝牙驱动(bluetooth)/235 5.6.1 bluetooth驱动的构架 /235 5.6.2 bluez的原理及实现 /237 5.7 wlan驱动(wi-fi)/244 5.7.1 wlan构架 /244 5.7.2 wi-fi驱动的实现原理 /245 5.8 小结 /245 第6章 原生库的原理及实现 /246 6.1 系统c库(bionic libc)/247 6.1.1 bionic libc功能概述 /247 6.1.2 bionic libc实现原理 /248 6.2 功能库 /258 6.2.1 webkit构架与实现 /258 6.2.2 多媒体框架与实现 /275 6.2.3 android sqlite框架及原理
本次更新对 UDP 系列组件作了大量优化,新增了可靠 UDP 组件! HP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言 )、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知模型的 API 接口,能非常简单高效地整合到新旧应用程序。 * HP-Socket 官方网站:http://www.jessma.org * HP-Socket 项目主页:http://www.oschina.net/p/hp-socket * HP-Socket 开发文档:http://www.oschina.net/p/hp-socket/doc HPSocket v5.5.1 rc2 更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 增加可靠 UDP 示例 TestEcho-ARQ 和性能测试示例 TestEcho-ARQ-PFM 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 C# SDK 增加 UDP 组件封装类 二、Linux 更新 提供 Shell 编译脚本compile.sh ,支持在本机编译 HP-Socket 提供 Android NDK 交叉编译脚本(脚本目录:/project/android-ndk ) 三、其它更新 http-parser 升级到 2.9.1 版本 jemalloc 升级到 5.2.0 版本 HPSocket v5.5.1 rc2 模块更新 一、UDP 组件更新 增加可靠 UDP 组件:IUdpArqServer、IUdpArqClient 可靠 UDP 组件详细说明请参考开发文档 《HP-Socket Development Guide》 优化 IUdpServer 组件,修复潜在缺陷 二、模块部分代码优化 三、更新为HPSocket 5.5.1 rc2版本,完全兼容5.4.4版本

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值