MT8766平台Android 12系统ESIM功能实现指南

开发平台基本信息

  • 芯片型号: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文件拷贝到设备指定目录。

makefile 复制代码
# 示例:将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/目录下,并赋予其必要的权限。

makefile 复制代码
# 示例:将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权限或关闭权限校验。本文选择关闭权限校验以简化流程。

java 复制代码
// 示例:修改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卡槽映射关系。

  • 注册广播接收器
xml 复制代码
<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>
  • 实现广播接收器
java 复制代码
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卡槽映射
xml 复制代码
<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命令调起。

bash 复制代码
adb shell am start -n "com.google.android.euicc/com.android.euicc.ui.settings.CurrentProfileListActivity"

常见问题及解决方案

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

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

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

java 复制代码
// 示例:修改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卡状态。

java 复制代码
// 示例:修改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设置。

xml 复制代码
<!-- 示例:修正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功能,并解决可能遇到的常见问题。

相关推荐
有位神秘人18 小时前
Android中Notification的使用详解
android·java·javascript
·云扬·18 小时前
MySQL Binlog落盘机制深度解析:性能与安全性的平衡艺术
android·mysql·adb
独自破碎E19 小时前
【BISHI9】田忌赛马
android·java·开发语言
代码s贝多芬的音符20 小时前
android 两个人脸对比 mlkit
android
darkb1rd1 天前
五、PHP类型转换与类型安全
android·安全·php
gjxDaniel1 天前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
csj501 天前
安卓基础之《(22)—高级控件(4)碎片Fragment》
android
峥嵘life1 天前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习
stevenzqzq1 天前
Compose 中的状态可变性体系
android·compose
似霰1 天前
Linux timerfd 的基本使用
android·linux·c++