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

相关推荐
诸神黄昏EX2 小时前
Android Qualcomm Diag
android
hy15687862 小时前
Flink 延时数据处理
android·java·flink
TeleostNaCl2 小时前
Android TV | 一种不跳出应用指定页面的类 Monkey 的 Android TV 压测脚本
android·经验分享·压力测试
k***08292 小时前
mysql中general_log日志详解
android·数据库·mysql
2501_937154932 小时前
酷秒神马 9.0 版源码系统实测
android·源码·源代码管理·机顶盒
r***11333 小时前
【MySQL】MySQL库的操作
android·数据库·mysql
ljt27249606613 小时前
Compose笔记(五十九)--BadgedBox
android·笔记·android jetpack
用户41659673693553 小时前
ExoPlayer 播放花屏与跳跃?我们如何像 QuickTime 一样优雅处理音频时间戳错误
android
Y***h1873 小时前
MySQL不使用子查询的原因
android·数据库·mysql