Android 模块mm命令编译时出错

在尝试编译Android2.2/ndk/sources/scanapl目录下的模块时遇到问题。执行mm命令后,Android.mk文件内容未被正确识别导致编译出错。问题出现在设置和执行build/envsetup.sh以及vendorsetup.sh脚本之后,具体编译错误细节未给出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在android2.2/ndk/sources/scanapl/目录下创建Android.mk和scanapl.c文件

lai@lai-ThinkPad-X61:~/af-t34$ source build/envsetup.sh
including device/htc/dream/vendorsetup.sh
including device/htc/passion/vendorsetup.sh
including device/htc/sapphire/vendorsetup.sh

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

问题描述

创建Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := scanapl.c
LOCAL_MODULE := scanapl
LOCAL_SHARED_LIBRARIES:= libcutils libutils
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
ubuntu 的termianl中:

lai@lai-ThinkPad-X61:~/af-t34/ndk/sources/scanapl$ mm

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=2.2
TARGET_PRODUCT=generic
TARGET_BUILD_VARIANT=eng
TARGET_SIMULATOR=
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=FRF91
============================================
make:进入目录'/home/lai/af-t34'
make: *** 没有规则可以创建“out/target/product/generic/obj/EXECUTABLES/scanapl_intermediates/LINKED/scanapl”需要的目标“out/target/product/generic/obj/lib/crtbegin_dynamic.o”。 停止。
make:离开目录“/home/lai/af-t34”

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

解决问题

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := scanapl.c
LOCAL_MODULE := scanapl
LOCAL_SHARED_LIBRARIES:= libcutils libutils
LOCAL_MODULE_TAGS := optional

LOCAL_CFLAGS:= /
	-I/home/lai/ak-t34

include $(BUILD_EXECUTABLE)

添加源文件编译路径,注意 -I/home/lai/ak-t34前面使用的是“TAB”键


<think>我们正在处理一个关于在服务器上编译Android MM模块的问题。根据用户的问题,他/她想要知道如何在服务器上进行MM模块的编译。这里的“MM模块”可能指的是Android源码中的一个模块,而“MM”可能是某个模块的缩写,但在Android编译环境中,通常使用“mm命令来编译当前目录下的模块。 回顾之前的引用内容,特别是引用[1]和引用[2],我们可以找到关于如何单独编译某个模块的信息。 根据引用[1]: 1. 首先需要初始化编译环境:通过执行`source build/envsetup.sh`(或者如引用中提到的`. build.sh`,但通常使用`source build/envsetup.sh`)来设置环境变量和函数,包括`mmm`命令。 2. 然后使用`mmm`命令来编译指定目录的模块,例如:`mmm ./packages/apps/Settings/` 引用[2]则提到了使用`mm`命令来编译当前目录下的模块,例如: - 进入模块所在的目录,比如`frameworks/base/services/` - 执行`mm -B`(`-B`选项表示强制重新编译) 另外,引用[3]也提到了系统编译流程和单模块编译。 因此,我们可以总结出在服务器上编译MM模块的步骤: 1. 进入Android源码的根目录。 2. 初始化编译环境:执行`source build/envsetup.sh`(或者根据具体环境,如引用[1]中提到的,如果出错可以尝试`. build.sh`,但通常使用`source`命令)。 3. 选择目标设备(通过`lunch`命令选择对应的产品)。 4. 进入要编译的模块的目录(如果知道具体路径)。如果不知道具体路径,可能需要先确定模块所在的目录。 5. 使用`mm`命令(在模块目录下)或`mmm`命令(后跟模块路径)来编译该模块。 注意:`mm`命令需要在模块的目录下执行,而`mmm`命令可以在任何目录下执行,但需要指定模块的路径。 如果用户所说的“MM模块”是一个特定的模块,我们需要知道这个模块的路径。但用户没有给出具体路径,所以这里提供通用的方法。 另外,引用[4]提到了在编译完成后运行模拟器,但用户目前只关心编译。 因此,回答如下: **在服务器上编译Android源码中的MM模块的步骤:** 1. **初始化编译环境** 在Android源码根目录下执行: ```bash source build/envsetup.sh ``` 如果遇到问题(如引用[1]中提到的错误),可以尝试: ```bash . build.sh # 注意这里有一个点和一个空格,然后build.sh(如果存在的话) ``` 但通常,`source build/envsetup.sh`是标准做法。 2. **选择目标产品** 执行`lunch`命令,并选择对应的产品编号(例如,通过数字选择)。例如: ```bash lunch ``` 然后从列表中选择一个目标。如果不确定,可以选择一个通用的,如`aosp_x86_64-eng`用于模拟器。 3. **定位到模块目录(如果使用mm命令)** 如果知道模块所在的目录,可以进入该目录: ```bash cd path/to/your/module # 将路径替换为实际模块路径 ``` 然后使用`mm`命令编译: ```bash mm -B # -B 表示强制重新编译 ``` 或者,如果不进入目录,可以使用`mmm`命令: ```bash mmm path/to/your/module ``` 4. **编译模块** 执行命令后,编译系统会编译该模块及其依赖(如果有必要)。编译生成的输出文件(如.apk、.jar等)将放在`out/target/product/<product_name>/`对应的目录下。 **注意:** - 如果模块名称不是路径,需要先确定模块的路径。在Android源码中,模块通常由Android.mk或Android.bp文件定义。可以尝试在源码中搜索模块名。 - 如果编译过程中出现头文件缺失等问题(如引用[5]),可能需要安装额外的依赖包。 **示例:** 假设要编译Settings模块,其路径为`packages/apps/Settings`,则可以使用: ```bash mmm ./packages/apps/Settings/ ``` 或者进入该目录后: ```bash cd packages/apps/Settings mm ``` **引用说明:** 上述步骤参考了Android源码编译中关于单模块编译的方法[^1][^2][^3]。 §§相关问题§§ 1. 如何确定Android源码中某个模块的路径? 2. 使用`mm`和`mmm`命令编译模块时有哪些常用选项? 3. 模块编译完成后如何将生成的文件部署到设备上?</think>### 在服务器上编译 Android MM 模块的方法 在 Android 源码环境中编译特定模块(如 MM 模块)需遵循以下步骤: #### 1. **初始化编译环境** 在源码根目录执行环境初始化脚本: ```bash source build/envsetup.sh # 或 . build.sh(若 source 命令出错)[^1][^3] ``` #### 2. **选择目标设备** 通过 `lunch` 命令选择目标产品(根据服务器配置选择对应编号): ```bash lunch # 从列表中选择设备编号(如 30)[^4] ``` #### 3. **编译 MM 模块** - **方法 1:使用 `mmm` 命令(无需进入目录)** 指定模块路径直接编译: ```bash mmm path/to/MM_module/ # 例如 mmm frameworks/base/services/[^1][^2] ``` - **方法 2:使用 `mm` 命令(需进入模块目录)** 先切换到模块目录再编译: ```bash cd path/to/MM_module/ mm -B # -B 强制重新编译[^2] ``` #### 4. **获取编译输出** 生成的产物(如 `.jar` 或 `.apk`)位于: ```bash out/target/product/<设备名>/system/<目录>/ # 例如:out/target/product/generic_x86_64/system/framework/services.jar[^2] ``` #### 5. **部署到设备(可选)** 通过 ADB 推送更新文件: ```bash adb push out/.../MM_module.apk /system/app/ adb reboot # 重启生效 ``` --- ### 关键注意事项 1. **依赖检查** 若编译报错(如头文件缺失): ```bash sudo apt-get install libv4l-dev # 安装缺失依赖[^5] ``` 2. **完整编译要求** - 首次编译需先执行 `make` 生成基础环境[^2][^3] - 模块路径必须包含 `Android.mk` 或 `Android.bp` 构建文件 3. **环境变量** 确保 `JAVA_HOME` 等变量已配置,避免工具链错误 > **编译流程总结**: > `source → lunch → mmm/mm → 获取输出 → 部署` > 此流程适用于任何 Android 源码模块(Settings/Services 等)[^1][^2][^3] ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值