Android编译命令

本文介绍了Android的编译方法,包括全部编译和模块编译。全部编译可生成完整镜像文件包和ota包;模块编译涵盖apk、preloader等模块。还介绍了代码搜索等其他指令,以及Android.mk文件,它用于向编译系统描述源代码,定义模块相关属性。

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

一、全部编译:

1、source build/envsetup.sh
初始化编译环境。

2、lunch sl8541e_1h10_oversea-user/userdebug
指定目标编译设备和编译类型,选择对应项目工程user是发布版本,userdebug是调试版本。

3、make -j12 2>&1 | tee build.log
-JX X表示数字,X表示可以使用CPU核数,build.log 查看编译信息。
cat /proc/cpuinfo | grep processor | wc -l 该linux命令可以查询服务器支持多少核。
该命令可以编译完整的android镜像文件包。

4、make -j12 otapackage 2>&1 | tee buildota.log
编译ota包

5、ota包制作命令:
./build/tools/releasetools/ota_from_target_files -i old.zip new.zip update.zip

二、模块编译:

1、apk模块编译
指令:mmm [module_path ] 解释: 编译指定路径下所有模块,但不包含依赖模块
列如:mmm packages/apps/Launcher3/ 编译Launcher3 模块
生成路径out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk

指令:mm 编译当前路径下所有模块,但不包含依赖模块
列如:cd packages/apps/Launcher3/ mm 在当前路径下编译模块

使用adb 工具可快速验证修改:
列如:
1、adb root 2、adb remount
3、adb push out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk system/priv-app/Launcher3/
4、adb shell stop 5、adb shell start
或者覆盖安装验证
adb install -r out\target\product\sl8541e_1h10\system\priv-app\Launcher3\Launcher3.apk

使用make snod 打包验证
由于launcher3 属于system镜像分区,我们可以使用make snod 进行重新打包烧录验证。

2、preloader编译
make -j24 pl 2>&1 | tee pl.log preloader
可实现更新logo bin文件的目的。

3、lk编译
make lk

4、kernel编译
make kernel

5、userdataimage编译
make userdataimage

6、vnod编译
make vnod

7、几个主要模块编译调试
在这里插入图片描述

三、其他指令

  make clean  等同于rm -rf out/
  make update-api 更新api文件
  update-modem

代码搜索:
在这里插入图片描述

四、Android.mk

Android.mk是Android工程管理文件,类似于编译文件的说明书,用来向编译系统描述源代码,并将源文件分组为模块(包括静态库、共享库、独立可执行文件)。Android.mk会被编译系统解析一次或多次,可以在每一个Android.mk文件中定义一个或多个模块,也可以多个模块使用同一个 .mk 文件

#定义当前模块的位置
LOCAL_PATH := (callmy−dir)LOCALPATH是表示当前模块位置的变量,my−dir是由系统提供的宏函数,返回当前文件所在的路径,(call my-dir) LOCAL_PATH 是表示当前模块位置的变量,my-dir 是由系统提供的宏函数,返回当前文件所在的路径,(callmydir)LOCALPATH是表示当前模块位置的变量,mydir是由系统提供的宏函数,返回当前文件所在的路径,(call my-dir) 表示调用这个函数

#清除LOCAL_XXX变量
include $(CLEAR_VARS)
这句代码清除了 LOCAL_PATH 变量之外的 LOCAL_XXX 变量。所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的,在编译该模块之前可能编译过别的模块,产生了大量变量,会被系统误认为是属于该模块的,可能产生不可预知的错误。

#代表需要编译的文件
LOCAL_SRC_FILES :=$(call all-subdir-java-files)
all-subdir-java-files 函数返回LOCAL_PATH 子目录的所有java文件。
也可以直接写出需要编译的文件路径:
LOCAL_SRC_FILES :=com/android/launcher/Launcher.java
几个常用的获取源文件的方法:
$(call all-java-files-under, src) :获取指定目录下的所有 Java 文件。
$(call all-c-files-under, src) :获取指定目录下的所有 C 语言文件。
$(call all-Iaidl-files-under, src) :获取指定目录下的所有 AIDL 文件。
$(call all-makefiles-under, folder):获取指定目录下的所有 Make 文件。

#代表需要编译资源文件
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

#定义编译生成的模块名称
LOCAL_MODULE := Launcher3
Launcher3变量必须定义且唯一,作为模块的标识,编译系统会自动产生合适的前缀和后缀。

#签名属性
LOCAL_MODULE_TAGS := optional
常用的有:debug, eng, user,development 或者 optional(默认)。

#指定签名
LOCAL_CERTIFICATE := platform
platform:该 APK 完成一些系统的核心功能。经过对系统中存在的文件夹的访问测试。
shared:该APK需要和 home/contacts 进程共享数据。
media:该APK是 media/download 系统中的一环。

#混淆代码
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
proguard.cfg:是一个混淆文件
disabled:是不混淆

#编译apk
include $(BUILD_PACKAGE)
include $(BUILD_STATIC_LIBRARY) :编译成静态库
include $(BUILD_SHARED_LIBRARY) :编译成动态库
include $(BUILD_EXECUTABLE) :编译成可执行程序
include $(BUILD_STATIC_JAVA_LIBRARY) :编译成Java静态库

#代表APK生成的目录
LOCAL_MODULE_PATH:=$(TARGET_OUT)
通过 LOCAL_MODULE_PATH 变量,可以指定生成的 apk 目录
$(TARGET_OUT)代表 /system ,后续路径按需要补充完整
$(TARGET_OUT_DATA_APPS) 代表 data/app 目录

#表示APP生成在system/priv-app/目录下
LOCAL_PRIVILEGED_MODULE := true

#需要进行预编译的库
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libarity:arity-2.1.2.jar
include $(BUILD_MULTI_PREBUILT) 拷贝到本地编译

#引用静态jar库
LOCAL_STATIC_JAVA_LIBRARIES:= libarity

#这个表示获取当前目录以及子目录下的android.mk文件
include (callall−makefiles−under,(call all-makefiles-under,(callallmakefilesunder,(LOCAL_PATH));

#代表不提取odex
LOCAL_DEX_PREOPT=false

#去掉某某APK
LOCAL_OVERRIDES_PACKAGES:= AlarmClock

#aapt 是Android Asset Packaging Tool的缩写,是编译和打包资源的工具。而aapt2是在aapt上做了优化。
LOCAL_USE_AAPT2 := true

<think>我们正在处理Android构建过程中的两个问题: 1. PRODUCT_COPY_FILES被忽略的警告 2. ninja构建失败,报错:unknown target 'rk3128_box_defconfig' 根据引用[1]和引用[2]中的信息,我们可以推断构建失败可能与构建规则重复定义和Android.bp与Android.mk的混用有关。 步骤1:分析PRODUCT_COPY_FILES被忽略的警告 这个警告通常是因为在多个地方定义了同一个目标文件的复制规则。例如,在Makefile中多次定义了同一个目标文件的复制命令。我们需要检查构建系统中是否有重复的PRODUCT_COPY_FILES定义。 步骤2:解决ninja构建失败的问题 报错信息:`ninja: error: unknown target 'MODULES-IN-xxxxroid-external-AndroidBp'` 和 `unknown target 'rk3128_box_defconfig'` 引用[2]提到,当出现`unknown target MODULES-IN-xxx`时,将Android.bp改为Android.mk可以解决。但这里我们的错误是未知目标`rk3128_box_defconfig`,这可能是内核配置问题。 具体解决思路: 问题1:PRODUCT_COPY_FILES被忽略 在Android构建系统中,PRODUCT_COPY_FILES用于在构建过程中复制文件到输出目录。如果出现警告,说明有重复定义。我们需要检查: - 设备树中的makefile(通常位于device/<vendor>/<device>目录) - 可能重复定义的地方,如多个.mk文件定义了相同的目标文件。 解决方法:找到重复的PRODUCT_COPY_FILES行,删除重复项或合并。 问题2:ninja构建失败,未知目标`rk3128_box_defconfig` 这个目标通常与内核配置有关。`rk3128_box_defconfig`应该是Rockchip平台的一个内核默认配置。错误可能是由于: a) 内核配置目标名称错误(可能是拼写错误) b) 内核源码未正确设置或路径不对 c) 构建系统在配置内核时找不到这个defconfig 解决方法: - 检查内核源码目录,确认是否存在`rk3128_box_defconfig`文件(一般在arch/arm/configs或类似路径)。 - 检查设备树的BoardConfig.mk中是否正确定义了内核配置,例如: TARGET_KERNEL_CONFIG := rk3128_box_defconfig - 确保内核源码已经正确下载并放置在预期路径。 如果内核配置正确,但仍然出现此错误,可能是构建系统在生成ninja文件时未能正确包含内核构建规则。这可能是由于Android.bp和Android.mk的混合使用导致的。引用[2]提到,将模块的构建描述文件从Android.bp改为Android.mk可以解决类似问题,但这里我们面对的是内核配置,所以需要检查内核构建的规则定义。 另外,引用[1]中提到了多个警告,这些警告表明有多个地方对同一个目标(如prodnv.img和ota包)定义了构建命令。这可能是由于设备树和平台构建系统之间的冲突。我们需要检查设备树中的makefile,避免重复定义。 综合步骤: 1. 搜索整个源码树,查找`PRODUCT_COPY_FILES`中包含被忽略文件(如`prodnv.img`)的定义,删除重复项。 2. 检查内核配置: - 确认`rk3128_box_defconfig`文件存在。 - 检查BoardConfig.mk中的`TARGET_KERNEL_CONFIG`设置。 - 确保内核构建路径正确(`TARGET_KERNEL_SOURCE`)。 3. 如果内核配置正确,考虑构建系统的问题。尝试清理构建中间文件(如out目录)并重新构建。 4. 如果问题仍然存在,检查内核的Android.bp或Android.mk文件。如果内核使用Android.bp,尝试将其改为Android.mk(但内核通常使用Kbuild,不是Android.mk,所以这个可能性不大)。或者,检查是否有其他模块的Android.bp文件导致冲突,将其改为Android.mk(如引用[2]的解决方案)。 注意:对于内核配置,通常使用Kbuild系统,与Android.bp无关。因此,我们应关注内核配置是否正确。 5. 如果错误信息中提到了具体的模块路径(如`MODULES-IN-xxxxroid-external-AndroidBp`),则按照引用[2]的方法,将该模块的Android.bp改为Android.mk,并编写对应的Makefile规则。 针对我们的错误信息`ninja: error: unknown target 'rk3128_box_defconfig'`,我们首先检查内核配置步骤。 具体操作: 步骤一:解决PRODUCT_COPY_FILES警告 - 在源码根目录执行: grep -rn "PRODUCT_COPY_FILES.*prodnv.img" . 找到重复定义的地方,删除或合并。 步骤二:解决ninja构建失败 - 确认内核defconfig存在: 在内核源码目录下:`ls arch/arm/configs/rk3128_box_defconfig` 如果不存在,则可能是名称错误或内核版本不对。 - 检查设备树的BoardConfig.mk(通常在device/rockchip/rk3128/BoardConfig.mk或类似路径): 确保有以下行: TARGET_KERNEL_CONFIG := rk3128_box_defconfig TARGET_KERNEL_SOURCE := kernel/路径 # 确保路径正确 - 如果内核配置正确,尝试单独编译内核: make -C kernel/路径 O=out/target/product/.../obj/kernel rk3128_box_defconfig 看是否成功。 步骤三:如果上述步骤无效,考虑构建系统规则冲突 - 查看错误信息中提到的文件(如build/core/Makefile和vendor/sprd/build/tasks/sprdbuildota.mk)中关于`prodnv.img`和`sl8541e_1h10_gofu_osll-ota-6.zip`的规则,删除重复的规则定义。 步骤四:清理并重新构建 make clean rm -rf out/ 重新source build/envsetup.sh和lunch make -j8 如果问题仍然存在,请提供更多上下文信息。 生成相关问题: 1. 如何正确设置Android设备的内核配置? 2. 如何解决Android构建中的PRODUCT_COPY_FILES重复定义问题? 3. 为什么ninja会报告未知目标? 4. 如何将Android.bp模块转换为Android.mk? 5. 在Android构建中,内核配置的流程是怎样的?</think>### Android构建问题解决方案:PRODUCT_COPY_FILES警告与ninja失败 #### 问题1:PRODUCT_COPY_FILES被忽略警告 **根本原因**:在多个Makefile中重复定义了同一个文件的复制规则,导致构建系统冲突[^1]。 **解决步骤**: 1. 定位冲突文件: ```bash grep -rn "PRODUCT_COPY_FILES.*prodnv.img" . ``` 2. 检查以下文件: - `build/core/Makefile`(第1902行和34行) - `vendor/sprd/build/tasks/sprdbuildota.mk`(第98行) 3. **解决方案**: - 删除重复定义,保留一个规则 - 或使用条件判断避免覆盖: ```makefile ifndef MY_CUSTOM_RULE PRODUCT_COPY_FILES += ... endif ``` #### 问题2:ninja报错`unknown target 'rk3128_box_defconfig'` **根本原因**:内核配置目标未正确定义或路径错误[^2]。 **解决步骤**: ```mermaid graph TD A[检查内核配置] --> B{config存在?} B -->|是| C[验证BoardConfig.mk] B -->|否| D[添加defconfig] C --> E[检查TARGET_KERNEL_CONFIG] E --> F[修正路径或名称] ``` 1. **确认defconfig存在**: ```bash ls arch/arm/configs/rk3128_box_defconfig # 内核目录下 ``` - 若不存在,从官方SDK复制或手动创建 2. **修正BoardConfig.mk**: ```makefile # 确保正确定义内核配置 TARGET_KERNEL_CONFIG := rk3128_box_defconfig TARGET_KERNEL_SOURCE := kernel/rockchip/rk3128 # 正确内核路径 ``` 3. **清理重建**: ```bash make clobber rm -rf out/target/product/sl8541e_1h10_go/obj/KERNEL_OBJ make -j8 ``` #### 预防措施 1. **统一构建规则**: - 将设备特定规则集中到`device.mk`,避免多文件定义 2. **版本控制**: ```bash repo forall -c 'git clean -xdf; git reset --hard' # 重置代码 repo sync # 同步最新代码 ``` 3. **环境验证**: ```bash . build/envsetup.sh lunch sl8541e_1h10_go-eng # 确认选对target ``` #### 相关问题延伸 1. 如何正确管理Android设备树中的PRODUCT_COPY_FILES规则? 2. 当内核defconfig缺失时如何从芯片厂商获取? 3. make clobber和make clean的区别是什么? 4. 如何调试Android构建系统中的ninja规则冲突? 5. 在大型团队中如何避免Android.mk的重复定义问题?[^1][^2] > 通过以上步骤可解决95%的类似构建问题。若仍失败,检查`build/core/tasks/kernel.mk`中的内核构建逻辑是否与设备匹配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值