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功能,并解决可能遇到的常见问题。

相关推荐
千里马学框架1 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone1 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc1 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen2 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone2 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui