1. MTK6735/8735方案概述与开发环境搭建
MTK6735和8735作为联发科早期的4G智能手机解决方案,虽然在性能上无法与当代旗舰芯片抗衡,但在低成本物联网设备、功能机和特定行业终端领域依然保持着稳定的市场需求。这两款芯片采用四核Cortex-A53架构,集成Mali-T720 GPU,并内置了支持Cat4 LTE的基带处理器。在实际项目中,我发现它们特别适合对成本敏感但需要4G连接的设备,比如工业手持终端、车载定位器等。
1.1 开发环境配置要点
搭建编译环境是接触MTK平台的第一道门槛。不同于普通Android开发,MTK方案对32位库的依赖更为严格。以下是经过多个项目验证的环境配置方案:
bash复制sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev \
libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
特别提醒几个容易踩坑的细节:
- Ubuntu 22.04默认移除了部分32位库支持,如果遇到
libncurses.so.5缺失错误,除了安装lib32ncurses5-dev外,可能需要手动创建符号链接 - 建议使用Ubuntu 18.04 LTS作为基础系统,这是MTK官方测试最充分的版本
- 硬盘空间至少预留200GB,完整编译一次代码加缓存通常会占用150GB以上空间
注意:不要尝试在WSL环境下进行完整编译,我曾因此浪费两天时间排查奇怪的文件系统错误。MTK的编译脚本对Windows/Linux混合环境支持极差。
1.2 源码获取与代码结构
MTK平台的Android源码通常由三部分组成:
- 标准AOSP基础代码
- MTK发布的专有补丁集
- 客户定制化内容(如有)
关键目录结构说明:
code复制device/mediatek/ - MTK设备树核心配置
vendor/mediatek/proprietary/ - 闭源驱动和库
kernel-3.18/ - 定制化内核源码
获取代码后,建议先执行以下命令建立编译环境:
bash复制source build/envsetup.sh
lunch full_[project]-userdebug
make -j$(nproc) 2>&1 | tee build.log
2. Modem驱动深度解析
2.1 Modem镜像组成与配置
MTK平台的modem驱动由多个二进制组件构成,主要存放在vendor/mediatek/proprietary/modem/mt6735目录下。其中最关键的两个文件类型:
-
BPLGU文件:包含AP侧与基带通信的协议栈配置
- 命名模式:BPLGUInfoCustomApp_[运营商代号]_[版本号]
- 控制射频参数、频段支持等关键配置
-
DSPG文件:实际的基带固件
- 命名模式:DSPG_[版本号]
- 包含基带处理器的运行时代码
在device.mk中常见的modem相关配置:
makefile复制PRODUCT_PROPERTY_OVERRIDES += \
persist.vendor.radio.sw_mbn_update=1 \
ro.vendor.mtk_protocol1_rat_config=Lf/Lt/W/G
这里的Lf/Lt/W/G表示支持的无线技术:
- Lf: LTE FDD
- Lt: LTE TDD
- W: WCDMA
- G: GSM
实战经验:频段顺序直接影响设备搜网策略。曾遇到某批出口印度的设备无法注册4G,最终发现是配置中把Lt放在Lf前面,导致设备优先尝试不支持的TDD网络。
2.2 运营商定制化处理
不同运营商对modem配置有特殊要求,MTK提供了灵活的切换机制:
bash复制./mk r custgen MODEM_BIN=path/to/operator_specific_modem.bin
常见运营商代码参考:
- 中国移动:SPEC0200
- 中国联通:SPEC0400
- 中国电信:SPEC0300
- 欧洲通用:SPEC0000
我曾处理过一个典型案例:出口南非的设备在Vodafone网络下工作正常,但在MTN网络下无法通话。最终解决方案是:
- 提取运营商特定的modem配置
- 对比发现缺少WCDMA 900MHz频段支持
- 修改
BPLGU文件中的RF_COMMON_MSL_L1_BAND参数 - 重新生成modem镜像
3. 射频与电源管理关键配置
3.1 设备树中的射频设置
MTK平台的射频配置主要通过设备树(DTS)实现,以下是典型配置示例:
dts复制rf_clock_buffer_ctrl: rf_clock_buffer {
compatible = "mediatek,rf_clock_buffer";
mediatek,clkbuf-quantity = <4>;
mediatek,clkbuf-config = <2 1 1 1>;
// 配置说明:
// 第一个数字:主时钟缓冲器驱动能力
// 后续数字:各频段时钟缓冲器配置
};
参数调整经验:
- 增大驱动能力可以改善弱信号环境下的连接稳定性,但会显著增加功耗
- 在室内固定场景下,可以适当降低配置值以节省电量
- 修改后必须用专业射频测试仪验证信号质量,并用电流表测量待机功耗
血泪教训:曾将配置从<2 1 1 1>改为<4 2 2 2>,导致待机电流从0.8mA飙升到12mA。这个改动在实验室测试时没发现问题,但量产后的退货率异常高。
3.2 功耗优化技巧
MTK平台常见的功耗问题排查步骤:
-
使用
powerhal工具抓取功耗日志:bash复制adb shell dumpsys power | grep "Wake Locks" -
检查modem的睡眠状态:
bash复制adb shell cat /proc/mtkrft/mtkrft_attr -
分析wakelock持有者:
bash复制adb shell cat /sys/kernel/debug/wakeup_sources
常见功耗杀手及解决方案:
- modem频繁搜网:调整
ro.vendor.mtk_ps1_rat参数,限制不必要的网络扫描 - GPS模块漏电:检查
vendor.mediatek.hardware.gnss服务状态 - 传感器持续唤醒:优化
alsps驱动中的采样间隔
4. 调试技巧与常见问题解决
4.1 基带日志分析
MTK提供了强大的日志工具mdlogger,使用方法:
bash复制adb shell mdlogger -f /sdcard/mdlog -d 3
日志分析要点:
- 搜索
0x1C9可以定位WCDMA 900MHz频段相关事件 AT<开头的行显示AP与CP的原始通信+CMS ERROR系列错误需要结合3GPP规范解读
典型问题排查案例:
- 现象:短信发送失败但通话正常
- 分析步骤:
- 抓取radio日志:
adb logcat -b radio | grep "AT<" - 发现modem返回
+CMS ERROR: 500 - 检查PDN连接状态:
adb shell dumpsys connectivity - 确认APN配置正确性
- 抓取radio日志:
4.2 编译问题应急处理
遇到modem相关编译错误时,可以尝试以下应急方案:
bash复制touch out/target/product/[project]/obj/ETC/modem.img
这个命令会生成一个空modem镜像,让编译流程继续。但需要注意:
- 这仅是临时解决方案
- 生成的系统镜像无法正常使用通信功能
- 必须随后修复真正的modem驱动问题
其他常见编译错误处理:
-
Java堆空间不足:
bash复制export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx8g" ./prebuilts/sdk/tools/jack-admin kill-server ./prebuilts/sdk/tools/jack-admin start-server -
ninja版本不兼容:
bash复制export USE_NINJA=false -
selinux策略冲突:
bash复制
make sepolicy_analyze
5. 进阶开发与性能优化
5.1 基带固件定制开发
对于有特殊需求的项目,可能需要对modem固件进行深度定制。MTK提供了有限的开发接口:
-
META工具:用于与基带处理器直接通信
bash复制
./META_Demo -p /dev/ttyUSB0 -b 115200 -
AT指令注入:
bash复制echo "AT+EGMR=1,7,\"1234567890\"" > /dev/radio/pttycmd1 -
RF校准数据读写:
python复制import serial ser = serial.Serial('/dev/ttyACM0', 115200) ser.write(b'AT+ERFTX=1,900,10\r\n') response = ser.readline()
重要提醒:修改modem固件可能导致设备无法入网,甚至硬件损坏。务必在专业射频实验室环境下操作,并做好备份。
5.2 系统性能调优
针对MT6735/8735的性能优化建议:
-
CPU调度策略:
bash复制echo "interactive" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor -
GPU优化:
bash复制
setprop debug.MB.rgx.fps 60 -
内存管理:
修改init.project.rc中的lmk参数:code复制write /sys/module/lowmemorykiller/parameters/minfree "1536,2048,4096,5120,5632,6144" -
IO性能:
bash复制
mount -o remount,noatime,nodiratime,data=writeback /data
经过这些优化,在标准Antutu测试中通常可以获得10-15%的性能提升。但在实际项目中,建议根据具体使用场景进行针对性优化,比如:
- 视频监控设备:侧重IO和网络吞吐
- 工业PDA:侧重CPU响应速度和稳定性
- 车载设备:考虑温度对性能的影响
最后分享一个实用脚本,用于快速检查系统关键状态:
bash复制#!/bin/bash
echo "=== CPU频率 ==="
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
echo "=== 温度 ==="
cat /sys/class/thermal/thermal_zone*/temp
echo "=== Modem状态 ==="
cat /proc/mtkrft/mtkrft_attr | grep "Modem state"
echo "=== 内存使用 ==="
dumpsys meminfo | grep "Free RAM"
这个脚本在批量测试时特别有用,可以保存为quick_check.sh并通过adb shell sh quick_check.sh快速执行。
