编译 Android 时如何指定输出目录?

本文介绍了如何在Android编译过程中指定不同的输出目录,包括改变Android默认的out目录、设置dist编译的目标位置以及修改特定模块的编译输出路径。此外,还提到了Android源码中与编译相关的文档位置和查找方法。

0. 导读

偶尔会有朋友问编译 Android 时如何指定输出目录?

这里有两种情况:

一是如何将 Android 默认的输出目录 out 改到其它位置?

二是指定某个模块的输出目录。

设置 Android 默认输出的目录,请参考第 1 节;

设置 Android dist 编译输出目录,请参考第 2 节;

设置 Android 某个模块的编译输出目录,请参考第 3 节;

如何查找系统中的文档,请参考第 4 节;

1. 指定 Android 编译输出目录

比如我现在要基于 android-12.0.0_r28 的源码编译 Pixel 5a 设备(代号: barbet)的 image。

Android 默认的输出目录为 out,想将默认的输出目录修改为 out-barbet:

android-12.0.0_r28$ export OUT_DIR=out-barbet
android-12.0.0_r28$ source build/envsetup.sh 
android-12.0.0_r28$ lunch aosp_barbet-userdebug

============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=12
TARGET_PRODUCT=aosp_barbet
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.4.0-54-generic-x86_64-Ubuntu-20.04.4-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=SQ1A.220205.002
OUT_DIR=out-barbet
PRODUCT_SOONG_NAMESPACES=hardware/google/av hardware/google/camera...
============================================
android-12.0.0_r28$ 

在这里我们能够看到,输出目录已经设置为: OUT_DIR=out-barbet 了。

如果在 source 以后的环境中查看当前编译的配置,可以在命令行执行 printconfig 查看:

$ printconfig

2. 指定 Android dist 编译输出目录

Android 编译输出目录 OUT_DIR (默认为 “out”)存放的是非发布的文件。

当你要发布版本时,通常会编译 dist 目标,这个目标默认输出路径在 “out/dist” 下,可以通过设置 DIST_DIR 进行修改,如下:

make aosp_barbet-userdebug dist DIST_DIR=dist-barbet

这里的 dist 是 distribution 的简称,字面意思是“发布、分发”

3. 指定 Android 模块编译输出目录

有时候自己开发一个模块,想把这个模块编译输出到指定目录下(例如 “/vendor/app”),或者已经编译好的 apk,想存放到系统预制的 app 目录下(例如: “/system/priv-app”),可以通过修改模块对应 Android.mk 中的变量 LOCAL_MODULE_PATH 来达到这个目的。

我们看两个 Android 自带的例子吧。

  • 将库文件 librecovery_ui_ext 编译输出到某个 lib64lib录下。
# bootable/recovery/Android.mk

# librecovery_ui_ext (shared library)
# ===================================
include $(CLEAR_VARS)

LOCAL_MODULE := librecovery_ui_ext

# LOCAL_MODULE_PATH for shared libraries is unsupported in multiarch builds.
LOCAL_MULTILIB := first

ifeq ($(TARGET_IS_64_BIT),true)
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib64
else
LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/lib
endif

LOCAL_WHOLE_STATIC_LIBRARIES := \
    $(TARGET_RECOVERY_UI_LIB)

LOCAL_SHARED_LIBRARIES := \
    libbase \
    liblog \
    librecovery_ui.recovery

include $(BUILD_SHARED_LIBRARY)

如果是 64 位的目标环境,则输出到目录:

out/target/product/xxx/recovery/root/system/lib64

其它情况输出到目录:

out/target/product/xxx/recovery/root/system/lib

  • 将应用LeanbackCustomizer 放到系统预置目录system-priv 目录中
# device/sample/apps/tv/LeanbackCustomizer/Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/priv-app

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := LeanbackCustomizer

LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

4. Android 源码中编译相关的文档

其实在 Android 代码中有包含一些如何编译 Android 的说明文档,主要有以下几个:

  • build/soong/README.md
    • Android 编译相关说明文档的主入口
  • build/make/Usage.txt
    • Android 编译说明
  • build/make/Changes.md
    • Android 编译和上一版本的改变
  • build/make/Deprecation.md
    • Android 编译中一些过时的不再使用的设置
  • build/core/build-system.html
    • Android 以前的编译说明文档,也仍然值得一看

记不住这些文档的路径和名字怎么办?

又或者除了这些文档,想看下 soong, kati, bazel, blueprint 等其它工具要如何使用该怎么办?

一条 find 命令即可解决这个问题,在 Android 源码的根目录下执行下面这条 find 命令:

android-12.0.0_r28$ find build/ -type f -a \( -iname "*.md" -o -iname "*.txt" -o -iname "*.pdf" -o -iname "*.html" \)
build/make/target/board/generic_x86_64_arm64/README.txt
build/make/target/board/generic_arm64/README.txt
build/make/target/board/generic_x86/README.txt
build/make/target/board/generic_64bitonly_x86_64/README.txt
build/make/target/board/generic_x86_arm/README.txt
build/make/target/board/module_arm/README.md
build/make/target/board/module_arm64/README.md
build/make/target/board/generic_x86_64/README.txt
build/make/target/board/generic/README.txt
build/make/target/board/module_x86/README.md
build/make/target/board/module_x86_64/README.md
build/make/target/board/mainline_sdk/README.md
build/make/target/product/gsi/31.txt
build/make/target/product/gsi/current.txt
build/make/target/product/gsi/29.txt
build/make/target/product/gsi/28.txt
build/make/target/product/gsi/30.txt
build/make/target/product/virtual_ab_ota/README.md
build/make/Deprecation.md
build/make/README.md
build/make/core/build-system.html
build/make/navbar.md
build/make/tools/fs_config/README.md
build/make/tools/zipalign/README.txt
build/make/tools/docker/README.md
build/make/tools/rbcrun/README.md
build/make/tools/ziptime/README.txt
build/make/tools/releasetools/jarjar-rules.txt
build/make/tools/releasetools/testdata/apexkeys_framework.txt
build/make/tools/releasetools/testdata/apkcerts_framework.txt
build/make/tools/releasetools/testdata/apexkeys_vendor.txt
build/make/tools/releasetools/testdata/apexkeys_merge.txt
build/make/tools/releasetools/testdata/apkcerts_vendor.txt
build/make/tools/releasetools/testdata/apexkeys_framework_conflict.txt
build/make/tools/releasetools/testdata/apkcerts_merge.txt
build/make/Changes.md
build/make/Usage.txt
build/soong/README.md
build/soong/navbar.md
build/soong/java/lint_defaults.txt
build/soong/cc/config/integer_overflow_blocklist.txt
build/soong/python/scripts/stub_template_host.txt
build/soong/scripts/check_boot_jars/package_allowed_list.txt
build/soong/docs/map_files.md
build/soong/docs/best_practices.md
build/soong/docs/clion.md
build/soong/docs/compdb.md
build/soong/docs/perf.md
build/bazel/README.md
build/bazel/examples/queryview/README.md
build/bazel/examples/queryview/apex_available.txt
build/bazel/examples/queryview/nocrt.txt
build/bazel/examples/queryview/android_apps.txt
build/bazel/examples/queryview/libc.txt
build/bazel/bazel_skylib/README.md
build/bazel/rules_cc/README.md
build/bazel/json_module_graph/README.md
build/bazel/docs/concepts.md
build/blueprint/README.md
build/blueprint/CONTRIBUTING.md
build/pesto/experiments/prepare_bazel_test_env/README.md

上面这条 find 命令查找 build 目录下所有后缀为 md, txt, pdf 和 html 的文件,基本上包含了常用的文档格式。

如果觉得不能满足需要,那就根据情况将这条 find 命令稍微调整一下吧。

思考题:

Android 编译时有 m, mm, mmm 这些命令,你能在 Android 代码中找到这些命令的使用说明吗?

<think>好的,我现在需要回答用户关于如何自定义Android源码编译的out输出目录路径的问题。首先,我要仔细理解用户的需求。用户希望知道如何改变默认的out目录,将其指向自定义的路径,这可能是因为存储空间管理、多版本编译或者项目隔离等原因。 接下来,我需要回忆Android编译系统的相关知识。记得Android使用Make和Soong(Ninja)作为构建系统,编译过程中的中间文件和输出通常都存放在源码目录下的out目录中。用户想要自定义这个路径,我需要找到相关的环境变量或配置选项。 查阅资料,发现可以通过设置环境变量OUT_DIR来指定输出目录。比如,在编译前执行export OUT_DIR=/path/to/custom_out,这样编译生成的文件就会存放在指定的路径下。这个方法适用于AOSP的较新版本,但需要确认是否兼容用户使用的Android版本。 另外,还有一种方法是在执行编译命令直接指定OUT_DIR参数,例如make OUT_DIR=/path/to/custom_out。这可能在较旧的版本中使用,但不确定是否已被弃用。需要检查官方文档或社区讨论,确认这种方法的有效性。 还需要考虑权限问题,确保用户有权限在目标路径下创建文件和目录。此外,自定义路径的磁盘空间是否足够,以及路径是否在同一个文件系统上,避免跨文件系统导致的性能问题。 另外,可能存在的陷阱是,某些脚本或工具可能硬编码了out目录,导致自定义路径后出现错误。需要提醒用户在遇到问题检查相关脚本或查阅社区解决方案。 然后,我需要整理步骤,确保逻辑清晰。首先介绍环境变量方法,然后说明命令行参数方法,接着提到注意事项,如权限、磁盘空间、路径有效性等。同,引用相关的参考资料,比如引用[2]提到out目录的重要性,可以在这里说明自定义路径的好处,比如组织性和管理方便。 还需要验证这些步骤是否正确。比如,在Android官方文档中是否有关于OUT_DIR的说明,或者开发者社区是否有成功案例。引用[5]提到了PRODUCT_PACKAGES的配置,可能和编译系统相关,但不确定是否直接影响out目录的配置,所以暂不涉及这部分内容。 最后,生成相关问题,帮助用户进一步探索。例如,如何优化编译速度、如何处理多版本编译输出等,这些都与out目录的管理有关联。 总结,回答的结构应该是:先说明两种配置方法,然后列出注意事项,最后给出相关问题。确保步骤具体,示例明确,用户能够按照指导操作。</think>### 如何自定义 Android 源码编译的 out 输出目录路径 #### 方法一:通过环境变量 `OUT_DIR` 配置 1. **设置临环境变量** 在终端中执行以下命令,将 `OUT_DIR` 设置为自定义路径(例如 `/home/user/custom_out`): ```bash export OUT_DIR=/path/to/custom_out ``` 此方式仅对当前终端会话生效,重启后需重新设置。 2. **永久配置环境变量** 将以下内容添加到 `~/.bashrc` 或 `~/.zshrc` 文件中: ```bash export OUT_DIR=/path/to/custom_out ``` 执行 `source ~/.bashrc` 使其生效。此方式对所有后续编译操作持续有效。 3. **验证配置** 运行编译命令(如 `m` 或 `make`)后,检查自定义路径下是否生成 `out` 目录编译输出文件。 #### 方法二:编译指定参数(适用于旧版本) 在编译命令中直接指定 `OUT_DIR` 参数(部分旧版本 Android 支持): ```bash make OUT_DIR=/path/to/custom_out # 或 m OUT_DIR=/path/to/custom_out ``` #### 注意事项 1. **路径权限与有效性** - 确保用户对目标路径有读写权限。 - 路径需位于同一文件系统,避免跨磁盘导致的符号链接问题。 2. **磁盘空间** 编译 Android 源码需至少 100GB 可用空间,自定义路径所在磁盘需满足此要求[^2]。 3. **版本兼容性** - Android 7.0 (Nougat) 及以上版本支持 `OUT_DIR` 环境变量[^4]。 - 若编译失败,检查构建日志中是否包含路径相关错误(如权限不足或路径无效)。 4. **多版本隔离** 通过自定义路径可隔离不同版本(如 Android 11 和 14)的编译输出,避免冲突[^3]。 #### 示例操作流程 ```bash # 设置自定义输出目录 export OUT_DIR=/home/user/android_build/out_android14 # 进入源码目录 cd /path/to/android/source # 执行编译命令 source build/envsetup.sh lunch aosp_arm-eng m -j8 ``` --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛奇看世界

一分也是爱~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值