
简介面向Android底层开发者与系统定制爱好者的三星Galaxy Note 8国际版GT-N5120设备源代码资源包围绕设备树、内核驱动、HAL、Bootloader与RIL等关键层级展开旨在辅助还原AOSP设备移植与固件适配流程。压缩包共22个文件体积仅约50KB以mk构建脚本、xml配置、rc启动文件为主体辅以c/h源码、prop系统属性、license及dependencies等结构紧凑便于按模块快速导航。目前已有108人学习。参考其中BoardConfig.mk、AndroidProducts.mk可梳理产品构建配置init.smdk4x12.rc与ueventd.rc能理解早期初始化与设备节点创建audio_hw.c/h对应音频HAL实现而extract-files.sh、proprietary-files.txt则提供了私有固件提取与打包思路对理解AOSP源码树、Linux内核与硬件驱动交互以及C/C在系统底层的实际运用均有直接帮助。 先聊聊这个名字本身。android_device_samsung_n5120看起来像一串乱码但对搞安卓底层的来说它代表的是一个相当具体的东西三星Galaxy Note 8.03G版这台的设备的AOSP设备树。如果你对编译刷机、定制ROM、移植高版本安卓有兴趣或者手头恰好躺着这么一台老平板想让它活过来那这篇文章就是给你准备的。我会从设备树是什么讲起再拆开这个目录里的关键文件最后把我在折腾过程中踩过的坑、总结的排查套路全部摊开讲。1. 项目背景N5120是台什么设备1.1 从设备树命名看懂硬件血统AOSP的device目录下目录名格式通常是厂商_设备_产品型号比如android_device_samsung_n5120对应的就是device/samsung/n5120。这里samsung是厂商n5120则是产品代号。N5120对应三星Galaxy Note 8.02013年发布搭载Exynos 4412四核处理器Cortex-A9架构、2GB RAM、8英寸1280×800屏幕支持3G蜂窝网络和通话。官方系统停在了Android 4.4.2后续想体验更高版本只能靠社区移植。1.2 2025年还折腾它的三个理由很多人会问一台2013年的平板还有折腾价值吗我的回答是有而且价值不小。第一学习价值极高。Exynos 4412是典型的32位ARM嵌入式平台设备树结构不复杂作为练手对象比现在那些动辄几十个分区、带TEE和安全启动的新机友好太多。第二硬件素质不差。2GB RAM在当年算大内存配上续航还行的电池拿来做电子相册、离线视频播放器、床头钟都绰绰有余。第三这是理解Android系统“硬件适配层”的最佳标本。你改一行fstab改一个音频策略文件会不会影响开机马上就能在真机上验证这种反馈速度是模拟器给不了的。2. 设备树的核心知识AOSP为什么不能开箱即用2.1 从一个目录到整机镜像的编译链路AOSP源码本身是通用系统代码它不知道你的设备有没有Wi-Fi、用哪颗GPU、屏幕分辨率是多少。设备树就是告诉编译系统“这台设备长什么样”的接口。完整编译一条ROM大概走这么条链路lunch选择设备配置 → 读取device/samsung/n5120/下的所有.mk文件 → 根据BoardConfig.mk设置架构、分区、内核参数 → 生成系统镜像 → 使用mkbootimg把内核和ramdisk打包成boot.img → 最终产出完整的刷机包。设备树里有一个地方写错轻则某个功能失效重则直接编不过或开不了机。2.2 BoardConfig、device.mk、proprietary这些文件分别管什么拆开device/samsung/n5120这个目录核心文件就这么几个我把每个职责说清楚。BoardConfig.mk是“硬件配置清单”。它定义CPU架构TARGET_ARCH : arm、硬件浮点TARGET_ARCH_VARIANT : armv7-a-neon、内核镜像路径、BOOT分区大小、是否支持recovery等。这里最容易犯的错是架构变体和CPU变体写错比如把cortex-a9写成cortex-a15编译能过但跑起来会有莫名其妙的性能问题和指令兼容问题。device.mk是“软件功能清单”。它声明这个设备要编译哪些包、要添加哪些权限、要复制哪些配置文件。比如声明PRODUCT_PACKAGES Camera、加入PRODUCT_COPY_FILES把audio_policy.conf复制到/system/etc/。N5120的device.mk里还会引用vendor/samsung/n5120下的私有库清单。proprietary-files.txt是“闭源二进制清单”。因为GPU驱动、RIL通信库、硬件编解码库等很多部件不开源AOSP本身没有这些代码需要在编译前从原厂固件里提取出来放到vendor/samsung/n5120/proprietary目录。编译时系统根据这个清单把这些.so和固件文件打进镜像。剩下如init.rc、fstab.n5120、ueventd.rc、audio_policy.conf、power_profile.xml分别负责系统初始化、分区挂载、设备节点权限、音频策略和电源配置。这些配置与内核的dts设备树源码互相呼应dts里定义硬件资源init.rc里做运行时配置缺一个都不行。3. 实操复现基于N5120设备树编译一次ROM3.1 准备编译环境与源码分支选择建议在Ubuntu 18.04或20.04 LTS上操作磁盘至少留200GB内存16GB起步否则编译会很痛苦。N5120是2013年的设备Android 10以内版本都能用OpenJDK 8编译Android 11以上建议OpenJDK 11。代码分支选择上如果目标是做一条相对稳定的ROM我建议拿android-8.1.0_rXX起步。原因很简单8.1是老设备移植的黄金版本既保留了大量的兼容层又比4.4多了很多安全特性。版本太新比如Android 13再往上Bionic的改动和老GPU驱动的兼容性问题会成倍增加不推荐新手直接碰。源码同步完把android_device_samsung_n5120放到device/samsung/n5120目录再创建或同步对应的vendor/samsung/n5120和kernel/samsung/n5120。这时候先别急着编译先把提取好的专有库放到vendor/samsung/n5120/proprietary目录里。N5120的专有库可以从原厂4.4.2固件提取主要包含libMali.soGPU驱动、libRIL.so系列、libExynosHWC.so硬件合成器、libOMX.*硬解码等。3.2 关键参数修改与内核补丁下面是BoardConfig.mk里我实际用下来比较关键的一段配置TARGET_ARCH : arm TARGET_ARCH_VARIANT : armv7-a-neon TARGET_CPU_VARIANT : cortex-a9 TARGET_KERNEL_SOURCE : kernel/samsung/n5120 TARGET_KERNEL_CONFIG : n5120_android_defconfig BOARD_KERNEL_CMDLINE : consolettySAC2,115200 BOARD_KERNEL_BASE : 0x40000000 BOARD_PAGE_SIZE : 4096 BOARD_SYSTEMIMAGE_PARTITION_SIZE : 1610612736 BOARD_USERDATAIMAGE_PARTITION_SIZE : 12834570240 BOARD_FLASH_BLOCK_SIZE : 131072BOARD_KERNEL_BASE和BOARD_PAGE_SIZE需要严格和内核的链接地址保持一致N5120的base多数版本是0x40000000page size是4096。这块不能拍脑袋改刷进去起不来的情况大多是这里和boot.img里的实际信息对不上。内核源码建议直接用官方开源包但要打一个补丁把老内核的编译器相关flag调整为当前gcc可接受的格式。Exynos 4412内核版本停在3.0.x默认的-marcharmv7-a配合新版GCC会有编译报错加上-Wno-errormaybe-uninitialized等规避参数或者直接用gcc-arm-4.9工具链开编。我建议用老工具链稳定踩坑少。3.3 打包烧录与首次开机一切就绪后进入编译source build/envsetup.sh lunch n5120-eng make -j8 otapackagen5120-eng里的eng表示工程版会附带root权限和调试工具对手上的样机很合适。编译完成后产物在out/target/product/n5120/下.zip包就是卡刷包也可以用make bootimage单独编boot.img。烧录时三星老设备有个特殊费劲点N5120没有标准的fastboot分区烧录模式早期靠Odin刷tar包。如果你在做系统调试更快的办法是直接在已root的旧系统上装“FlashFire”之类工具或者用adb shell dd把boot.img写到boot分区。开发阶段我强烈建议先只刷boot.img测试内核能否启动确认没问题再刷system。千万别一上来就全盘刷一旦新系统没起来要用Odin回原厂费时费力。4. 移植路上绕不开的坑编译、启动与运行时4.1 编译期blobs缺失、老内核与新版工具链编译期最常见的报错是类似missing rule to make target vendor/samsung/n5120/proprietary/libMali.so。原因就是proprietary-files.txt里声明了某个文件但vendor目录下没放。解决办法是检查清单确认文件名是否匹配或从原厂固件重新提取。这里有个小经验不要一次性把清单里所有文件全配上可以先留一个最小集先保证系统能编过、能启动再逐步加功能。老内核和新版工具链的问题是另一个大坑。如果你用Ubuntu 20.04默认的gcc 9编3.0内核会出现大量unrecognized command line option这类报错。我的建议是直接用预编译的arm-eabi-4.9工具链把CC指向它稳定性和兼容性会好很多。这里面不用理解太深可以简单理解成老内核是用老式编译器环境的新编译器已经不吃那套语法了强行用新编译器就是自找麻烦。4.2 启动期卡LOGO、system_server重启、低频reboot编译通过只是第一步启动期才是大头。刷完系统开机卡在三星LOGO优先怀疑内核问题一是内核恐慌Kernel panic - not syncing用adb logcat看不到的时候抓串口或者开BOARD_KERNEL_CMDLINE里的consolettySAC2,115200看内核日志二是有可能boot.img打包格式不对三星老设备的boot.img是特殊的Samsung kernel trailer格式直接用AOSP的mkbootimg打出来的包刷进去是认不出来的需要额外处理头。过了内核这一关下一个常见问题是通过开机动画后system_server反复崩溃重启。这时候用adb logcat抓日志重点看FATAL EXCEPTION和am_crash崩溃原因可能是某个系统服务依赖的vendor接口没实现。N5120上我遇到过audio service起不来原因是audio.primary.exynos4.so与AOSP 8.1的音频HAL接口不完全兼容。解决思路有两个改源码适配新版接口或者用兼容层audio.primary.default.so这类兜底HAL顶上先开机能用再优化。卡在开机动画反复重启还有一个容易忽略的点/data分区权限。如果fstab里挂载/data时没正确处理旧文件系统会频繁软重启。检查fstab.n5120的分区格式和挂载参数必要时BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE : ext4并在编译后对userdata分区格式化一次。4.3 运行时RIL、Wi-Fi、相机与功耗问题排查系统能启动后就该逐项测功能了。N5120的3G通话模块RIL出问题的一大特征是“基带进程还在但SIM卡读不到”。这通常是rild和libreference-ril之间的兼容问题。你需要核对device.mk里引用的RIL实现是否和你提取的原厂libRIL.so匹配检查/system/lib下的libril.so、libsec-ril.so版本是否一致。Wi-Fi上老设备经常出现永远打不开开关的情况十有八九是wlan.ko内核模块没有正确加载。确认BoardConfig.mk里配置的内核模块路径是否对得上并在init.n5120.rc里用insmod提前加载Wi-Fi驱动。相机的花屏和绿屏问题源自HAL层输出的buffer格式和SurfaceFlinger期望的格式不一致。N5120的libExynosCamera是厂商深度定制的和AOSP上层Camera API不一定完全兼容。快速排查方式是换一个第三方相机App测试如果第三方App正常、系统相机不正常说明上层适配没做好问题出在HAL与框架层的接口对接上。功耗问题在移植里最容易被忽视很多移植包待机一天掉电一半。典型原因是Wi-Fi锁或者GPS没有休眠。检查方式是在root状态下用dumpsys deviceidle看唤醒锁来源再对照power_profile.xml核对每个组件的电流参数。配置不对不会导致无法开机但会让体验大打折扣。5. 写在最后老设备移植给我的几点经验折腾N5120这套设备树我最大的感受是硬件适配这件事看起来是一堆没有温度的文件实际上考验的是对整个系统启动链路的理解。你会被迫去搞懂init进程、HAL、内核驱动、文件系统这些平时碰不到的东西这个过程中获得的体系化认知比单纯会写App值钱太多。最后分享一个实用小技巧改任何内核配置之前先备份一份当前能启动的boot.img到电脑上同时把/proc/config.gz导出来看当前内核实际启用的选项。很多“我明明编进内核了却不起效果”的假象其实都是内核配置项名写错或没真正生效。对比config.gz和你自己的defconfig能省掉一大半排查时间。如果你也有一台压箱底的老设备别急着卖废品试着从设备树开始让它跑起新版系统这个过程本身就是最好的安卓底层教材。本文还有配套的精品资源点击获取