开发平台基本信息
- 芯片型号: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功能,并解决可能遇到的常见问题。