如何在定制Android编译版本中集成AWS客户端
定制Android系统集成AWS CLI编译方案
AWS CLI v2基于Python实现,无法直接按原生C/C++项目规则编译,需要依托AOSP的Python编译规则完成集成,步骤如下:
前置准备
- 将获取到的AWS CLI源码放置到AOSP源码树的
external/aws-cli/目录,这是AOSP约定的第三方外部组件存放路径 - 确认你的AOSP版本已预置Python 3.8+运行时,AWS CLI v2最低要求该Python版本,若未预置需要先完成Python 3的系统分区适配
- 提前准备好AWS CLI的所有Python依赖库:botocore、s3transfer、pyyaml、urllib3、six、python-dateutil、jmespath,同样放到external对应目录,后续统一纳入编译
编译配置编写
Android 10及以上版本(使用Soong构建系统,配置文件为Android.bp)
在external/aws-cli/目录下新建Android.bp文件,内容如下:
// AWS CLI核心Python库模块 python_library { name: "aws-cli-core", srcs: ["awscli/**/*.py", "bin/*"], version: "2.15.0", // 替换为你实际拉取的AWS CLI版本号 installable: true, libs: [ "python3", "py-botocore", "py-s3transfer", "py-pyyaml", "py-urllib3", "py-six", "py-python-dateutil", "py-jmespath", ], } // 系统可执行入口,对应/system/bin/aws命令 python_binary_host { name: "aws", srcs: ["bin/aws"], main: "bin/aws", libs: ["aws-cli-core"], required: ["python3"], relative_install_path: "bin", }
如果依赖的Python库使用预编译whl包,可以通过python_prebuilt_library规则引入,不需要单独从源码编译:
python_prebuilt_library { name: "py-botocore", whl: "prebuilt/botocore-1.35.0-py3-none-any.whl", }
Android 9及更早版本(使用Make构建系统,配置文件为Android.mk)
在external/aws-cli/目录下新建Android.mk文件,内容如下:
LOCAL_PATH := $(call my-dir) # 编译AWS CLI核心Python库 include $(CLEAR_VARS) LOCAL_MODULE := aws-cli-core LOCAL_SRC_FILES := $(call all-subdir-python-files, awscli) LOCAL_MODULE_CLASS := PYTHON_LIBRARIES LOCAL_REQUIRED_MODULES := python3 py-botocore py-s3transfer pyyaml urllib3 six python-dateutil jmespath include $(BUILD_PYTHON_LIBRARY) # 编译aws可执行命令到系统bin目录 include $(CLEAR_VARS) LOCAL_MODULE := aws LOCAL_SRC_FILES := bin/aws LOCAL_MODULE_CLASS := EXECUTABLES LOCAL_REQUIRED_MODULES := aws-cli-core python3 LOCAL_MODULE_PATH := $(TARGET_OUT)/bin include $(BUILD_PYTHON_BINARY)
配套适配
- 配置SELinux规则:给shell域添加执行aws命令、访问网络、读写对应存储路径的权限,否则运行时会被SELinux拦截报错
- 补全Python依赖:如果运行时提示Python标准库缺失(如ctypes、sqlite3等),需要调整Python3的编译配置,打开对应标准库的编译开关重新编译Python组件
- 不要直接使用Linux平台预编译的AWS CLI二进制:这类二进制依赖glibc,和Android系统的bionic libc不兼容,必然运行失败
编译验证
- 在AOSP根目录执行
source build/envsetup.sh,lunch选择对应的目标产品 - 执行
mmm external/aws-cli/单独编译AWS CLI模块,确认无编译报错 - 将编译生成的系统镜像刷入设备,或通过adb push将编译产物推送到设备对应分区,进入shell执行
aws --version,正常输出版本信息即代表集成成功
注意:如果你的定制系统对系统分区大小有严格限制,可以考虑将AWS CLI安装到product分区,修改对应配置里的安装路径即可。
内容的提问来源于stack exchange,提问作者Margish thumar
相关产品推荐
相关产品推荐

