MTK Android12 Modem编译环境搭建:Ubuntu 18.04下的完整解决方案
在移动通信领域,联发科技(MTK)平台的modem编译环境搭建一直是Android系统工程师面临的技术挑战之一。本文将针对Ubuntu 18.04系统,详细解析MTK Android12 modem编译环境的完整搭建流程,涵盖关键依赖安装、补丁修复以及环境验证的全套解决方案。
1. 环境准备与系统要求
搭建MTK modem编译环境前,必须确保硬件和软件满足基本要求。不同于普通的Android应用开发,modem编译对系统资源有更高需求。
硬件配置要求:
- 内存:物理内存至少16GB(推荐32GB)
- 交换空间:至少32GB(可使用以下命令创建):
sudo dd if=/dev/zero of=/swapfile bs=1G count=32 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 存储空间:建议预留100GB以上可用空间
软件版本要求:
- 操作系统:Ubuntu 18.04 LTS(64位)
- Perl:5.26.1(系统默认版本)
- Python:2.7.15和3.6.7(系统默认版本)
- GCC:主机gcc版本4.8以上
提示:Ubuntu 18.04是MTK官方推荐的编译环境,其他版本可能导致兼容性问题。如果使用其他Linux发行版,需特别注意Perl和Python的版本匹配。
2. 关键依赖安装与配置
modem编译过程依赖多个Perl模块和开发工具,这些依赖项的完整安装是成功编译的前提条件。
2.1 基础编译工具链安装
首先更新软件源并安装基础开发工具:
sudo apt-get update sudo apt-get install -y build-essential git-core gnupg flex bison gperf \ zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \ lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \ libgl1-mesa-dev libxml2-utils xsltproc unzip2.2 Perl模块安装
modem编译脚本大量使用Perl,必须安装以下关键模块:
sudo apt-get install -y libswitch-perl libxml-simple-perl \ libfile-copy-recursive-perl libexpat1-dev验证Perl模块是否安装成功:
perl -MSwitch -e 'print "Switch模块安装成功\n"' perl -MXML::Simple -e 'print "XML::Simple模块安装成功\n"'2.3 Python环境配置
虽然modem编译主要使用Perl,但部分辅助工具依赖Python:
sudo apt-get install -y python2.7 python3.6 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 23. 专用工具链下载与配置
MTK modem编译需要特定的交叉编译工具链,这些工具必须从官方渠道获取并正确配置。
3.1 MIPS交叉编译器安装
modem部分代码需要MIPS架构的交叉编译器,具体版本要求为GCC 4.9.2:
从MIPS官网下载工具链(需注册账号):
https://codescape.mips.com/components/toolchain/2016.05-08/Codescape.GNU.Tools.Package.2016.05-08.for.MIPS.MTI.Bare.Metal.CentOS-5.x86_64.tar.gz校验文件完整性:
echo "a01155719d881799b5491ef63aa78e55 Codescape.GNU.Tools.Package.2016.05-08.for.MIPS.MTI.Bare.Metal.CentOS-5.x86_64.tar.gz" | md5sum -c解压并部署到指定目录:
tar -zxvf Codescape.GNU.Tools.Package.*.tar.gz mkdir -p ~/modem/mcu/common/tools/GCC/MIPS/4.9.2/linux cp -r mips-mti-elf/2016.05-08/* ~/modem/mcu/common/tools/GCC/MIPS/4.9.2/linux/
验证编译器是否可用:
~/modem/mcu/common/tools/GCC/MIPS/4.9.2/linux/bin/mips-mti-elf-gcc --version应显示版本号为4.9.2。
3.2 Android NDK配置
modem编译还需要特定版本的Android NDK(r14b):
从Google官方下载NDK r14b:
https://dl.google.com/android/repository/android-ndk-r14b-linux-x86_64.zip校验文件完整性:
echo "becd161da6ed9a823e25be5c02955d9cbca1dbeb android-ndk-r14b-linux-x86_64.zip" | sha1sum -c解压并部署:
unzip android-ndk-r14b-linux-x86_64.zip -d ~/modem
4. 关键补丁修复
NDK r14b存在已知的链接问题,必须应用以下补丁才能正常编译modem。
4.1 NDK补丁应用
在NDK目录中修改两个关键文件:
修改
build/core/default-build-commands.mk:-TARGET_LDLIBS := -lc -lm +TARGET_LDLIBS := -lc -lm -ldl修改
build/core/build-binary.mk,在文件末尾添加:# If LOCAL_LDLIBS contain any TARGET_LDLIBS, remove them from LOCAL_LDLIBS. # Those occurrences must be removed because the ordering of TARGET_LDLIBS is # important. If libdl is placed before libc and binaries are in /vendor/bin, # libdl won't be able to link __cxa_finalize(), which is defined in libc. # TARGET_LDLIBS will be appended to PRIVATE_LDLIBS later. LOCAL_LDLIBS := $(filter-out $(TARGET_LDLIBS),$(LOCAL_LDLIBS))
注意:这些修改解决了modem编译过程中可能出现的动态链接库顺序问题,特别是libdl和libc之间的依赖关系。
5. modem源码编译流程
完成环境配置后,可以开始正式的modem编译工作。以下是详细的编译步骤。
5.1 源码准备
- 从MTK官网下载modem源码包(通常为
TK_MD_BASIC_MOLY.*.tar.gz格式) - 创建编译目录并解压源码:
解压后会生成三个主要目录:mkdir -p ~/modem cd ~/modem tar -zxvf TK_MD_BASIC_MOLY.*.tar.gzapps、common和mcu。
5.2 mcu部分编译
进入mcu目录并设置GCC路径:
cd mcu mkdir -p common/tools/GCC/MIPS/4.9.2/linux复制之前配置的MIPS编译器:
cp -r ~/modem/mips-mti-elf/2016.05-08/* common/tools/GCC/MIPS/4.9.2/linux/开始编译(工程名根据实际项目而定):
./m "TK_MD_BASIC(LWTG_TB_8765).mak" new使用Perl脚本处理生成的文件:
perl device/mediatek/build/build/tools/modemRenameCopy.pl ./ "TK_MD_BASIC(LWTG_TB_8765).mak"此步骤会生成
temp_modem目录,包含后续需要的modem镜像文件。
5.3 apps部分编译
返回modem根目录并配置NDK:
cd ~/modem cp -r android-ndk-r14b apps/NDK执行编译脚本:
cd apps ./build.sh clean,build,pack all GEN93_USER编译完成后会生成
*_rel.tar.bz2压缩包。
6. 集成到Android系统
编译生成的modem需要集成到Android系统镜像中才能最终使用。
6.1 准备系统目录
在Android源码目录中创建modem专用目录:
cd ~/android_src/vendor/mediatek/proprietary mkdir modem cp device/mediatek/build/build/tools/modem/modem_Android.mk modem/Android.mk创建与项目对应的modem目录(名称来自
ProjectConfig.mk中的CUSTOM_MODEM):CUSTOM_MODEM_NAME=$(grep CUSTOM_MODEM device/*/ProjectConfig.mk | awk -F '=' '{print $2}' | tr -d ' ') mkdir -p modem/$CUSTOM_MODEM_NAME
6.2 复制modem文件
将编译生成的modem文件复制到系统目录:
cp -R ~/modem/mcu/temp_modem/* modem/$CUSTOM_MODEM_NAME/ cp -R ~/modem/apps/rel/* modem/$CUSTOM_MODEM_NAME/6.3 全系统编译
最后进行完整的Android系统编译:
cd ~/android_src source build/envsetup.sh lunch full_<project>-userdebug make -j$(nproc) 2>&1 | tee build.log7. 环境验证与问题排查
为确保编译环境配置正确,建议执行以下验证步骤。
7.1 环境验证脚本
创建一个验证脚本check_modem_env.sh:
#!/bin/bash # 检查Perl版本 perl -v | grep "v5.26" || echo "[错误] Perl版本不匹配" # 检查Perl模块 for module in Switch XML::Simple File::Copy::Recursive; do perl -M$module -e "print\"$module 模块正常\n\"" 2>/dev/null || echo "[错误] 缺少Perl模块: $module" done # 检查MIPS编译器 ~/modem/mcu/common/tools/GCC/MIPS/4.9.2/linux/bin/mips-mti-elf-gcc --version | grep "4.9.2" || echo "[错误] MIPS编译器版本不正确" # 检查NDK补丁 grep "TARGET_LDLIBS.*ldl" ~/modem/android-ndk-r14b/build/core/default-build-commands.mk || echo "[警告] NDK补丁可能未正确应用" # 检查交换空间 free -h | grep "Swap" | awk '{if($2+0 < 32) print "[警告] 交换空间不足32GB"}'7.2 常见问题解决方案
问题1:编译时出现perl模块缺失错误
sudo apt-get install -y libswitch-perl libxml-simple-perl libfile-copy-recursive-perl问题2:NDK链接错误确保已正确应用第4节提到的补丁,特别是-ldl的添加和LOCAL_LDLIBS的修改。
问题3:内存不足导致编译中断增加交换空间:
sudo fallocate -l 32G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile问题4:modemRenameCopy.pl脚本执行失败检查工程名是否与mcu/make/projects目录下的.mak文件完全一致,包括大小写。