MT8766平台Android 12系统ESIM功能实现指南
2025-09-27 / 龙之叶   

开发平台基本信息

  • 芯片型号:MT8766
  • 操作系统版本:Android 12
  • Kernel版本:msm-4.19

问题描述

客户要求设备支持ESIM功能。初期在高通6125平台上预研ESIM功能时,集成流程较为简单,仅需内置ESIM厂商的APK并开启相应feature及权限即可。然而,由于原ESIM供应商Links field报价过高,我们转而选择了鹏越与紫光两家新供应商。鹏越提供了ESIM芯片,并要求我们按照谷歌标准流程操作,而紫光则提供了包含权限与feature配置的APK。最终,我们决定遵循谷歌LPA(Licensed Profile Assistant)标准流程来实现ESIM功能。

实现流程

1. 准备工作

  • 获取LPA资料:从GMS实验室获取包含三份文档及一个APK的资料包,内容涵盖如何集成LPA、实现overlay app以及在开机向导和系统设置中增加ESIM选项。
  • 硬件准备:确保设备已安装ESIM芯片(贴片式或拔插式),并能够正常读取到EID(ESIM芯片的唯一标识)。

2. 启用euicc的feature

在设备配置文件中启用euicc的feature,通常只需将相关feature文件拷贝到设备指定目录。

1
2
3
# 示例:将euicc feature文件拷贝到系统权限目录
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.telephony.euicc.xml:system/etc/permissions/android.hardware.telephony.euicc.xml

3. 内置谷歌LPA服务

将谷歌提供的LPA服务APK内置到系统的system/priv-app/目录下,并赋予其必要的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 示例:将EuiccGoogle.apk内置到系统
PRODUCT_PACKAGES += \
EuiccGoogle

# 在设备特定的mk文件中定义APK路径及属性
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := EuiccGoogle
LOCAL_SRC_FILES := EuiccGoogle.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_TAGS := optional
include $(BUILD_PREBUILT)

4. 配置权限

为LPA服务增加priv-app权限或关闭权限校验。本文选择关闭权限校验以简化流程。

1
2
3
4
5
6
7
8
9
10
11
// 示例:修改PermissionManagerService.java以关闭权限校验
--- a/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -3469,6 +3469,8 @@
@NonNull PackageSetting packageSetting, @NonNull Permission permission) {
if (RoSystemProperties.CONTROL_PRIVAPP_PERMISSIONS_DISABLE) {
return true;
+ }else if (!RoSystemProperties.CONTROL_PRIVAPP_PERMISSIONS_DISABLE) {
+ return true;
}
final String packageName = pkg.getPackageName();

5. 增加Overlay App

编写自定义的Overlay App,实现广播接收器以响应谷歌LPA服务的请求,并在res/values/strings.xml中配置SIM卡槽映射关系。

  • 注册广播接收器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <receiver
    android:name=".PartnerReceiver"
    android:permission="android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS"
    android:directBootAware="true"
    android:exported="true">
    <intent-filter>
    <action android:name="com.google.android.euicc.action.PARTNER_CUSTOMIZATION" />
    </intent-filter>
    </receiver>
  • 实现广播接收器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    package com.tp.euicc.overlay;

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;

    public class PartnerReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    // 广播接收方法必须为空,实际逻辑通过资源文件配置
    }
    }
  • 配置SIM卡槽映射

    1
    2
    <string name="sim_slot_mappings_json" translatable="false">{"sim-slot-mappings":[{"devices":["custom_go"],"esim-slot-ids":[0],"psim-slot-ids":[1]}]}</string>
    <integer name="download_type">3</integer>

6. 调起LPA服务下载ESIM卡号

在系统设置中,通过特定路径调起LPA服务以下载并启用ESIM卡号。也可通过ADB命令调起。

1
adb shell am start -n "com.google.android.euicc/com.android.euicc.ui.settings.CurrentProfileListActivity"

常见问题及解决方案

1. 下载完ESIM卡号后无法启用

问题描述:在MTK8766平台上,下载完ESIM卡号后无法直接启用,需开关飞行模式后方可点击启用按钮。

解决方案:修改系统设置相关代码,强制设置屏幕状态为可用。

1
2
3
4
5
6
7
8
9
// 示例:修改MobileNetworkSettings.java以强制启用ESIM
--- a/QSSI.12/packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
+++ b/QSSI.12/packages/apps/Settings/src/com/android/settings/network/telephony/MobileNetworkSettings.java
@@ -58,6 +58,7 @@
private void setScreenState() {
int simState = mTelephonyManager.getSimState();
- boolean screenState = simState != TelephonyManager.SIM_STATE_ABSENT;
+ // boolean screenState = simState != TelephonyManager.SIM_STATE_ABSENT;
+ boolean screenState = true;

2. MTK8766平台ESIM启用按钮不可点击且显示白卡

问题描述:在MTK8766平台上,不仅ESIM启用按钮不可点击,还错误显示了白卡信息。

解决方案:修改移动网络列表控制器相关代码,确保正确处理ESIM卡状态。

1
2
3
4
5
6
7
8
9
// 示例:修改MobileNetworkListController.java以正确处理ESIM卡状态
--- a/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/MobileNetworkListController.java
+++ b/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/network/MobileNetworkListController.java
@@ -122,7 +122,7 @@
} else {
pref.setSummary(R.string.mobile_network_inactive_esim);
- pref.setEnabled(false);
+ //pref.setEnabled(false);
}

3. 下载完ESIM卡号后无法上网

问题描述:MTK8766平台下载完ESIM卡号后,虽有信号且能ping通网络,但浏览器无法上网。

解决方案:检查并修正APN配置,移除无效的代理和MMSC设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 示例:修正APN配置 -->
--- a/device/mediatek/config/apns-conf.xml
+++ b/device/mediatek/config/apns-conf.xml
@@ -25782,12 +25782,12 @@
<apn carrier="Mobile"
mcc="454"
mnc="00"
apn="mobile"
- proxy="192.168.59.51"
- port="8080"
- mmsc="http://192.168.58.171:8002"
- mmsproxy="192.168.59.51"
- mmsport="8080"
- type="default,supl,mms"
+ proxy=""
+ port=""
+ mmsc=""
+ mmsproxy=""
+ mmsport=""
+ type="default,ia,supl"
protocol="IPV4V6"
roaming_protocol="IPV4V6"
/>

通过以上步骤和解决方案,开发者可以在MT8766芯片平台上成功实现Android 12系统的ESIM功能,并解决可能遇到的常见问题。

本文链接:
http://longzhiye.top/2025/09/27/2025-09-27/