7
0

三星 SM-A5108 移植 LineageOS 17.1 实录:分区、设备树、相机与电量修复

2026-10-21
三星 SM-A5108 移植 LineageOS 17.1 实录:分区、设备树、相机与电量修复

三星 SM-A5108 移植 LineageOS 17.1 实录:分区、设备树、相机与电量修复

2026-10-21 · 实验版 / 不支持 VoLTE,LTE 回落待查。下载链接后续贴。

这次折腾的是一台三星 Galaxy A5 2016 移动定制版 SM-A5108。起点是能正常开机的官方 Android 7.1.1,目标是在这台老机器上运行一个接近 AOSP 的系统。最终采用 LineageOS 17.1,也就是 Android 10,并针对本机的分区、设备树、相机固件和电量读取做了适配。

本文记录的是一台实机的排查过程,同时提供本次整合的 UNOFFICIAL r1 实验包。截至 2026 年 10 月 21 日,系统已经进入桌面,前后摄像头拍照、录像以及电量显示通过了测试;移动网络仍有 LTE 回落 EDGE 的问题,而且本版没有可用的 IMS / VoLTE 通话支持。因此,这一版适合有回退条件的同型号设备研究,不能满足依赖 VoLTE 的日常通话需求。

一、先把适用范围说清楚

项目本次实机情况
型号与平台SM-A5108,Exynos 7580,标称 3 GB 内存,双卡
原厂设备代号a5xeltecmcc
硬件修订号ro.boot.revision=12
原厂固件基线A5108ZMS4CTI1,Bootloader 修订位 4
成功启动的 Recovery官方 TWRP 3.2.1-0,a5xelte 镜像
系统基础历史 a5xelte LineageOS 17.1 构建,Android 10 / SDK 29
系统安全补丁日期2022-01-05
本次发布标识UNOFFICIAL a5108 r1,本地修改整合包

安装脚本会检查固件基线和硬件修订号。这里只验证了上表这台机器,不能据此认为 A5100、A510F 或其他 A5 2016 版本都能互刷。安装时遇到机型或基线断言失败,应停下来核对设备,不要直接删掉检查。

本次使用了现有 LineageOS 构建作为基础,保留其内核和 ramdisk,另外编译匹配的 CMCC 设备树,再离线处理系统镜像。没有从头完成一次 Android 全源码编译。电脑当时内存占用较高,实际处理主要在 Windows、Python、Node.js 和限制内存的 WSL2 环境中完成。

二、解锁状态与 Recovery:刷写成功不等于能启动

最开始容易误判的是解锁状态:刷回官方包后,开机没有以前的感叹号,也找不到 OEM 解锁入口。后来运行经过签名核验的三星 CROM Service,应用明确提示这台设备已经解锁。因此,本次没有再执行一次新的解锁写入。这个结果只说明本机当时的状态,不能代替其他设备的解锁检查。

也试过通过 ADB 重启到 bootloader。实机进入的是三星 Download 模式,电脑没有获得可用的 Fastboot 连接,所以最后沿用三星 Download 协议刷写 Recovery。

较新的官方 TWRP 3.7.0_9-0 在本机停在 Galaxy A5 / Powered by Android;围绕它制作的诊断镜像也没有进入可用界面。之后改用官方 TWRP 3.2.1-0,终于进入主界面,并能建立 Recovery ADB 连接。3.7 无法启动的具体原因没有单独证实,不能简单归结为“版本太新”。

本次使用 samloader-rs 2.2.0,刷写时只指定 RECOVERY 分区,并关闭自动重启:

samloader flash --partition RECOVERY twrp-3.2.1-0-a5xelte.img --no-reboot

写入完成后,按住“电源+音量下”至黑屏,立即切换“音量上+Home+电源”,直接进入 Recovery。首次提示先选择 Keep Read Only,不安装 TWRP App。这里的 Keep Read Only 是针对系统分区的选择,不代表手机所有分区都处于只读状态。

下载请使用 TWRP 官方 3.2.1-0 下载页面。本文不镜像分发 TWRP。下载得到的原始 .img 也不能直接当成 Odin 的 AP tar 包使用。

三、第一道坎:SYSTEM 分区少了 96 MiB

之前刷机包一直报错,首先需要解决的确实是 SYSTEM 分区容量。读取实机分区表后,发现通用 a5xelte 包的系统写入范围比本机分区更大:

对象字节数4096 字节块数
原始 LineageOS 系统写入范围3,145,728,000(3000 MiB)768000
本机 SYSTEM 分区3,045,064,704(2904 MiB)743424

差额正好是 96 MiB。处理时没有修改 PIT 或重新分区,而是在电脑上从 system.new.dat.br 与 transfer list 重建 ext4 镜像,检查文件系统后,用 resize2fs 缩小副本,再生成新的完整写入数据。

缩容后的 transfer list 为:

4
743424
0
0
new 2,0,743424

缩容阶段对比了 3966 个文件和目录的内容、链接、所有者、权限及扩展属性,确认文件树和元数据保持一致。随后校验 Brotli 解压回来的字节数与镜像 SHA-256,文件系统检查也通过了。后续相机和电量修复会再修改四个文件,不能把最终包描述成“系统文件完全没动”。

安装时出现 Patching system image unconditionally...,没有细分进度,确实很容易让人着急。这份包连续写入约 2.84 GiB 的 SYSTEM 数据,界面不一定实时显示每一段进度。本次最终有明确的安装成功日志;排查时应结合日志和实际读写判断,单看这一行无法认定卡死,也不能保证每次等待都会成功。

四、动画出现后又冻结:换成匹配的 CMCC 设备树

解决分区之后,第一次终于看到 LineageOS 启动动画,但动画只动了一下便停止了。回到 TWRP 读取上一次启动的内核日志,发现启动约 16.74 秒发生了内核 BUG,问题已经进入内核和硬件描述这一层。

对比通用 a5xelte 与原厂 CMCC 设备树,可以看到共享内存、保留内存和部分板级属性有差异。例如共享内存的物理地址,通用布局使用 0xb0000000,本机原厂布局使用 0xf0000000。

最终从与现有内核一致的提交 d78a73afd9cec8a6d7f205519a6ca4eac4ea4443 编译 exynos7580-a5xelte_chn_cmcc_12.dts,保留 LineageOS 原有内核与 ramdisk,将 BOOT 中的设备树表替换为 CMCC 修订号 12 的条目,并重新计算旧式 boot image 头校验值。

重新写入并回读校验 BOOT 后,手机进入欢迎页和桌面。这次更换的是完整板级设备树,因此可以确认这条适配路线有效,但不能把全部故障归因于某一个地址。

五、打开相机整机重启:匹配人脸检测固件

能进桌面还没结束。第一次打开相机,手机直接重启。保存下来的内核日志指向 fimc_is_ischain_loadfd,也就是相机 FD(人脸检测)固件加载路径。

本机 CMCC 布局中的 FD 保留区与通用包不同。日志中的异常执行地址位于 0xffffffc07e200020,而 CMCC 布局对应的 FD 虚拟地址区域在 0xffffffc07f600000。继续对比固件内部地址,可以看到两份固件分别对应不同的内存布局。

解决办法是从本机固件基线 A5108ZMS4CTI1 的原厂镜像提取 fimc_is_fd.bin,替换到:

/system/vendor/firmware/fimc_is_fd.bin

替换时保留文件所有者、0644 权限和 SELinux 标签,没有手工批量改固件指针,也没有关闭固件检查。之后前摄、后摄均能拍照,并分别完成录像测试,未再复现这次打开相机立即重启的问题。

六、电量一直显示 0%:修正 SELinux 的 sysfs 路径

相机正常后,又发现状态栏显示 0% 电量。读取内核数据,电池实际上还有约 43%,而 Android 电池服务却报告电池不存在、状态未知,USB 供电也没有正确识别。

这次问题出在设备树变化后,电池节点路径与通用 SELinux genfs 标签不匹配:

通用策略路径本机实际路径
/devices/battery.43/power_supply/devices/battery.42/power_supply
/devices/i2c.42/i2c-7/7-0071/power_supply/devices/i2c.41/i2c-7/7-0071/power_supply

Health HAL 因此被拒绝读取节点。修复只调整这两个路径,并同步到系统根目录的 sepolicy、vendor 的 precompiled_sepolicy 与 vendor_sepolicy.cil,没有扩大 allow 规则。原始和修改后的二进制策略都经过 checkpolicy 解析检查。

重启后,Android 正确显示约 43% 电量和 USB 充电状态,电池健康状态正常;getenforce 仍返回 Enforcing。这次修复没有依赖把 SELinux 全局改为 Permissive。

七、r1 当前验证范围与未解决问题

项目结果
启动、欢迎页与桌面已实测进入,boot_completed 为 1
前后摄像头拍照、录像已分别实测正常
电量、USB 充电状态修复后读取正常,SELinux Enforcing
Wi-Fi 网页、扬声器、音量键、导航键使用者对这组基础检查反馈“目前正常”,未逐项单独留存结果
移动网络出现 LTE 回落 EDGE,原因待查,不能认定稳定
IMS / VoLTE已知不支持;实机两个通道均未注册 IMS,未找到标准 IMS 服务实现
传统语音通话、双卡切换未完成独立验证;不能把网络注册或 LTE 图标当作通话可用的证据
GPS / GNSS尚未通过定位验证;后续开发测试观察到一次 GNSS 回调引发系统进程崩溃,自动重启后恢复,原因待查
蓝牙、NFC、指纹、长期待机尚未逐项测试

移动网络补记:插卡后曾显示 LTE,按系统提示重启后只剩 EDGE。拔掉另一张 giffgaff、仅保留移动卡之后,已确认默认数据订阅指向当前移动卡,网络模式也包含 LTE。切换飞行模式后曾重新注册 LTE,但约 45 秒后再次回落 EDGE;把接入点从 CMWAP 改成 CMNET 后,重新搜网仍有回落。“仅 LTE”诊断设置被基带返回错误,随后已恢复 GSM/WCDMA/LTE 自动模式。关机把移动卡换到另一个卡槽后,仍然先 LTE、再 EDGE。使用者补充确认,同一张卡此前在官方 Android 7.1.1 上可稳定使用 4G 和 VoLTE 通话。因此,上述调整都不能作为已验证的修复办法,LTE 回落的直接原因仍待查。

VoLTE 是另一项已经确认的限制。LineageOS 的 a5xelte 设备页 标记了 IMS 限制,官方说明 明确表示这类构建不支持依赖 IMS 的功能。实机 TelephonyDebugService 的两个通道均显示 mImsRegistered=false,查询标准 android.telephony.ims.ImsService 也没有匹配服务。这不能通过打开一个 VoLTE 开关解决;如果所在地语音通话必须依赖 VoLTE,本版不适合承担通话用途。IMS 缺失与 LTE 回落目前只是同时存在,尚不能断言前者导致后者。

还需说明整合包的验证边界:手机是通过首次完整刷入系统,再逐项更新 BOOT、相机固件和电量策略达到当前状态。下面提供的 r1 将这些修改整合到一个 ZIP,已完成离线文件系统、压缩数据往返、ZIP CRC 和修改范围校验;尚未对这份最终整合 ZIP 再做第二次独立的清空数据安装回归。

八、本版刷机包与校验值

下载:LineageOS 17.1 SM-A5108 UNOFFICIAL r1 实验包 下载 SHA-256 校验文件

  • 文件名:lineage-17.1-20220214-UNOFFICIAL-a5108-r1.zip

  • 文件大小:463,138,178 字节,约 441.7 MiB。

  • SHA-256:15408ebbec8dc1a3ae8609f36d574301c7fd5182fbc0e98562ffb4fdb3a163bd

Windows 可用以下命令核对下载文件:

Get-FileHash .\lineage-17.1-20220214-UNOFFICIAL-a5108-r1.zip -Algorithm SHA256

这是修改后的本地实验包,没有官方 LineageOS OTA 签名。历史基础包的官方签名曾核验通过,但那个签名不适用于本次修改后的 ZIP。如果 TWRP 开启了 ZIP 签名校验,它会拒绝该包;应先独立核对上面的 SHA-256,再按本地未签名包处理。

本包只安装 SYSTEM 和 BOOT,不包含设备个人备份,也不刷入 Recovery、基带、Bootloader 或 PIT。相机 FD 固件来自上述原厂基线,LineageOS 与相关上游项目的权利和署名归原作者所有。

九、同条件设备的刷入顺序

  1. 核对 SM-A5108、硬件修订号 12 和固件基线 A5108ZMS4CTI1。准备完整原厂回退包,先备份自己的数据、EFS 和关键分区;不同手机的 EFS 备份不能互用。

  2. 确认本机允许自定义镜像。本文实机的 CROM Service 提示已经解锁,不能假设所有读者设备都是这个状态。

  3. 按前文方式将官方 TWRP 3.2.1-0 写入 RECOVERY,直接用实体按键进入 TWRP。

  4. 首次从官方系统迁移时,备份完成后执行 Factory Reset,并清理 Cache / Dalvik。本次实机 DATA 可正常读取且未加密;没有验证加密 DATA 的迁移。无需修改 PIT 或扩大 SYSTEM 分区。

  5. 把校验通过的 r1 ZIP 放到 TWRP 可读取的位置,通过 Install 安装。不要把 ZIP 当作 Odin 线刷包。

  6. 确认安装日志成功,再重启系统。进入桌面后先打开 USB 调试,依次检查相机、充电、Wi-Fi 和移动网络;遇到重启先保留日志,不要立即反复清空或重刷。

Recovery 测试阶段,恢复原厂 RECOVERY 曾让本机重新正常启动官方系统。但安装本 ROM 后,SYSTEM 和 BOOT 已经改变,此时只恢复原厂 Recovery 不能恢复完整官方系统;需要使用匹配基线的完整官方恢复方案。本文不提供包含 PIT 的一键重分区命令。

十、资料与实现线索

这次最有帮助的做法,是把每次失败对应到具体阶段:安装器报错先量分区,动画冻结看上次内核日志,相机重启追 FD 加载路径,电量异常再对照 Health HAL 的拒绝记录。能进入桌面只是一个节点,后面的硬件验证和网络问题仍需要继续完成。