编译问题-make update-api-Api 小结
提示:make update-api-Api 问题小结
文章目录
- 前言
- 一、问题
- 二、如何产生这个问题
- 1、编译报错提醒语音
- 2、举例说明编译报错案例
- 尝试更改系统服务-添加服务
- 修改了系统文件Build
- 三、解决方案
- 1、环境准备
- 2、Lunch 自己的项目
- 3、更新api
- 4、update 成功 信息
- 5、提醒-闭坑-小结
- 提醒-闭坑
- 小结
- 总结
前言
自己在做Framework层开发时候,更改了系统api 会无法编译,报错提醒我们类似如下:m api-stubs-docs-non-updatable-update-current-api
为什么关注这个问题:
- 可能自己现在有经验了,这样的问题特别简单,常规操作,但是也是一个知识点,经常遇到,所以记录下。
- 对于新手而言,特别是刚开始接触Framework层开发的同学,遇到这个问题一脸懵逼,无从下手。
所以这里以自己的经验,来说明问题并总结一下,方便自己理解知识点和其他友人能够有所启发并解决实际问题。
一、问题
当我们更改了系统的api , 编译不会通过的,会报错,类似如下错误提醒:
{米米米米米米家家术家家术术术术术京京家京京京京京家本术术本Youhave triedtochangetheAPIfrom what has been previouslyapproved.Tomake these errors go away,you have two choices:1.Youcan add 'ehide"javadoc comments(and remove eSystemApi/eTestApi/etc)tothenewmethods,etc.shown in the above diff2.Youcan update current.txt and/or removed,txt by executing the following command:m api-stubs-docs-non-updatable-update-current-apiTosubmit the revised current,txttothemainAndroidrepository,you will need approval.米家家家米京家家京家京京家京京京京京京京京京家米米米米二、如何产生这个问题
1、编译报错提醒语音
本质原因是系统本身是有一套机制和规则、权限的,必须按照系统要求、规范进行开发,当你尝试去更改系统API方法时候,系统就会提醒你了,比如如上,系统已经提醒你了说得很清楚:You have tried to change the API from what has been previously approved.
2、举例说明编译报错案例
尝试更改系统服务-添加服务
大家可以看一下之前的文章: 就是新增了系统服务与应用端进行aidl 通信:
系统定制服务-IPC实战-系统新增aidl接口-实现自定义系统服务功能
Framework-自定义服务 + AIDL 与应用通信(二)
实际编译时候就会提醒你让你更新API
路径如下:\frameworks\base\services\api
实际更新的内容:
修改了系统文件Build
由于项目需求,需要修改文件:frameworks/base/core/java/android/os/Build.java
比如 自己做了如下修改:其实就是新增了一下 字段定义,但是系统检测到你要更改我的api,那么我就提醒你破坏了体系环境,需要更新一下环境。
所以,当我们更新了环境后,我们看看实际的源码对应变化:
路径:/frameworks/base/core/api/current.txt
我们看看实际源码变化:
三、解决方案
这里给出自己的经验总结,解决方案,其实就是按照系统提醒针对性的更新一下系统api 就可以了,你可以理解为更新系统环境:
1、环境准备
执行命令:source build/envsetup.sh
我个人理解就是准备编译环境
2、Lunch 自己的项目
分两步:
- lunch 命令执行
- 选择自己的项目 比如:
rk3576_u-ap4a-userdebug
放在一起执行就是一条命令:lunch rk3576_u-ap4a-userdebug(rk3576_u-ap4a-userdebug是我自己开发的项目,举例说明而已)
3、更新api
按照编译报错提醒,更新一次api ,如下:m api-stubs-docs-non-updatable-update-current-api, 有时候更新命令不一样的,按照 系统提醒进行更改即可。
4、update 成功 信息
比如如下:
5、提醒-闭坑-小结
提醒-闭坑
特别是新手,遇到类似的问题会懵逼,所以首先要有解决的意愿。 在如上1 和 2 步骤中,好多同学懵逼,不知道自己项目是什么,因为实际开发当中我们有自己的编译指令,高度集成或者封装的,如下:
RK平台
#!/bin/bash #生成软件路径FS_SW_BIN_PATH=rockdev #DM77_20250509_V1.0.0.0#项目名 exportFS_PRODUCT_NAME=DR7600_LVDS#日期FS_SW_DATE=20260413#版本号 exportFS_PRODUCT_VERSION=1.0.0.3#完整项目软件版本名 exportFS_SW_VERSION=${FS_PRODUCT_NAME}_${FS_SW_DATE}_V${FS_PRODUCT_VERSION}functionbinPac(){source build/envsetup.sh lunch rk3576_u-ap4a-userdebug./build.sh-AUCKuo# 带OTA#./build.sh-AUCKu# 无OTA#./build.sh-Au# 无OTAmkdir./${FS_SW_BIN_PATH}/${FS_SW_VERSION}cp./${FS_SW_BIN_PATH}/Image-rk3576_u/update.img./${FS_SW_BIN_PATH}/${FS_SW_VERSION}/${FS_SW_VERSION}.img cp./${FS_SW_BIN_PATH}/Image-rk3576_u/rk3576_u-ota*.zip./${FS_SW_BIN_PATH}/${FS_SW_VERSION}/${FS_SW_VERSION}_ota.zip rm-rf./${FS_SW_BIN_PATH}/Image-rk3576_ureturn0;}binPac;MTK 平台
#!/bin/bash #生成软件路径 #FS_SW_BIN_PATH=rockdev #DM88_S_20230904_V1.0.0.0#项目名 exportFS_PRODUCT_NAME=DM88_P_YL_FP#日期FS_SW_DATE=20260415#版本号 exportFS_PRODUCT_VERSION=1.0.0.3#完整项目软件版本名 exportFS_SW_VERSION=${FS_PRODUCT_NAME}_${FS_SW_DATE}_V${FS_PRODUCT_VERSION}exportDM88_MODEM=TK_MD_BASIC_LWTG_6177M_6769_DM88_PfunctionbinPac(){# full_k65v1_64_bsp-user # full_k65v1_64_bsp-userdebug # full_k65v1_64_bsp_k510-user # full_k65v1_64_bsp_k510-userdebug # full_k69v1_64_k419-user # full_k69v1_64_k419-userdebug # full_k69v1_64_k510-user # full_k69v1_64_k510-userdebug python vendor/mediatek/proprietary/scripts/releasetools/split_build_helper.py--run full_k69v1_64_k419-userdebug #Normalpython out_sys/target/product/mssi_64_cn/images/split_build.py--system-dir out_sys/target/product/mssi_64_cn/images--vendor-dir out/target/product/k69v1_64_k419/images--kernel-dir out/target/product/k69v1_64_k419/images--output-dir ${FS_SW_VERSION}/${FS_SW_VERSION}/#OTA# python out_sys/target/product/mssi_64_cn/images/split_build.py--system-dir out_sys/target/product/mssi_64_cn/images--vendor-dir out/target/product/k69v1_64_k419/images--kernel-dir out/target/product/k69v1_64_k419/images--output-dir ${FS_SW_VERSION}/${FS_SW_VERSION}/--otapackage cp./vendor/mediatek/proprietary/modem/${DM88_MODEM}/MDDB_InfoCustomAppSrcP_MT6768_S00_MOLY_LR12A_R3_MP_V283_3_P1_1_ulwtg_n.EDB./${FS_SW_VERSION}/${FS_SW_VERSION}/MDDB_InfoCustomAppSrcP_MT6768_S00_MOLY_LR12A_R3_MP_V283_3_P1_1_ulwtg_n.EDBcp./${FS_SW_VERSION}/${FS_SW_VERSION}/target_files.zip./${FS_SW_VERSION}/target_files.zip rm-rf./${FS_SW_VERSION}/${FS_SW_VERSION}/target_files.zipreturn0;}binPac;但是你要搞清楚,无论平台源码怎么变,谷歌体系下的源码编译一定有:sourcelunch指令,对于自己的项目名称是什么,在编译脚本里面一定有的,自己去查找。
小结
做完如上、更新完api 后,重新编译一次就可以了,编译就不会提醒和报错了。
总结
- 这里是对 编译过程中常见问题的一个小结,总结一下,是一个必备技能知识点。
- 涉及道德编译环境问题、编译步骤、编译命令 也是基础中的基础,需要掌握的,这里暂不讨论。
最后,希望每一次的总结都是后续高效工作的基石! 在重新编译之前就先解决api 更新问题,努力提高开发效率。
