You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android AOSP编译依赖AOSP库的外部GitHub项目报错及最佳实践

依赖AOSP库的外部GitHub项目编译最佳实践(针对Android 7.1_r36)

碰到这种ninja: error .... missing and no known rule to make it的报错,大概率是你的外部项目没适配AOSP的编译体系——普通GitHub项目一般用Gradle、CMake这类独立编译工具,和AOSP基于Make/早期Soong的编译逻辑不兼容。下面是我踩过不少坑后总结的适配和编译最佳实践:

1. 先理清项目的依赖关系

首先得明确你的项目到底依赖哪些AOSP核心库,比如libloglibutilslibcutils这些,要对应上Android 7.1_r36分支里的正式模块名。同时清理掉项目自带的第三方依赖(如果有),优先用AOSP已有的同功能库,避免编译冲突。

2. 给项目添加AOSP兼容的编译脚本

Android 7.1_r36还是以Android.mk作为主要编译脚本(Soong在这个版本还未全面普及),你需要给项目写一份适配的脚本:

示例Android.mk(编译可执行文件)

LOCAL_PATH := $(call my-dir)

# 清空之前的变量
include $(CLEAR_VARS)

# 替换成你的项目实际源文件列表,用相对路径(相对于LOCAL_PATH)
LOCAL_SRC_FILES := \
    src/main.c \
    src/helper.cpp

# 依赖的AOSP共享库,根据实际需求调整
LOCAL_SHARED_LIBRARIES := \
    liblog \
    libutils \
    libcutils

# 如果需要依赖静态库,用LOCAL_STATIC_LIBRARIES
# LOCAL_STATIC_LIBRARIES := libsome_static_lib

# 定义模块名称,要保证在AOSP里唯一
LOCAL_MODULE := githubProject

# 选择编译类型:可执行文件/共享库/静态库
include $(BUILD_EXECUTABLE)
# include $(BUILD_SHARED_LIBRARY)
# include $(BUILD_STATIC_LIBRARY)

如果项目本身用CMake(Android 7.1有限支持)

如果你的项目已经有CMakeLists.txt,也可以通过Android.mk调用它,但需要调整CMake的依赖路径指向AOSP系统库:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := githubProject
LOCAL_SRC_FILES := CMakeLists.txt
# 传递给CMake的参数,指定AOSP的头文件和库路径
LOCAL_CMAKE_FLAGS := \
    -DCMAKE_INCLUDE_PATH=$(SYSROOT)/usr/include \
    -DCMAKE_LIBRARY_PATH=$(SYSROOT)/usr/lib

include $(BUILD_CMAKE_PROJECT)

3. 正确初始化编译环境

不要直接跳转到项目目录就跑mm!一定要先在AOSP根目录完成环境初始化:

# 在AOSP根目录执行
. build/envsetup.sh
# 选择你的目标设备(比如aosp_arm-eng)
lunch

之后再切换到external/githubProject目录执行mm,如果要强制重新编译避免缓存问题,用mm -B

4. 排查"missing rule"错误的核心要点

如果还是报找不到文件的错误,先看报错里的具体文件名:

  • 如果是项目自身的源文件:检查LOCAL_SRC_FILES里的路径是否正确,确保文件确实存在于指定位置,路径是相对于LOCAL_PATH的相对路径。
  • 如果是AOSP的库/头文件
    • 确认依赖的模块在Android 7.1_r36中存在(有些高版本AOSP的模块在7.1里没有,需要找替代方案或者自行移植)。
    • 若缺失头文件,在Android.mk里用LOCAL_C_INCLUDES添加头文件路径:
      LOCAL_C_INCLUDES := \
          $(LOCAL_PATH)/include \
          system/core/include \
          frameworks/native/include
      

5. 可选:将模块集成到系统镜像

如果你想让这个项目随系统镜像一起编译打包,需要在设备的device/<vendor>/<device>/device.mk里添加:

PRODUCT_PACKAGES += githubProject

之后执行make全编译时,这个模块就会自动被打包到系统镜像中。

内容的提问来源于stack exchange,提问作者s1ckb0y

火山引擎 最新活动