
android 应用无法直接通过普通 sdk api 安装 esim;必须基于 aosp 构建并集成系统级 local profile assistant(lpa)应用,且需设备具备 euicc 硬件支持与相应权限。
android 应用无法直接通过普通 sdk api 安装 esim;必须基于 aosp 构建并集成系统级 local profile assistant(lpa)应用,且需设备具备 euicc 硬件支持与相应权限。
在 Android 平台上实现 eSIM 的编程化安装,本质上不是“应用层调用一个方法即可完成”的操作,而是深度依赖系统能力的工程任务。Android 官方明确将 eSIM 管理划归为系统服务范畴,仅向预置的、具有 android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS 权限的系统应用(如 LPA)开放相关接口。普通第三方 App 即使声明该权限,也无法在非 root、非系统签名环境下获得授权。
核心路径:构建并集成 Local Profile Assistant(LPA)
LPA 是 Android eSIM 架构中的关键组件,负责与设备 eUICC 芯片通信、解析 SM-DP+ 下发的配置文件(如 .zip 或 EID 绑定的 profile),并执行下载、启用、删除等生命周期操作。其源码已作为 AOSP 的一部分开源:
- ✅ 官方参考实现:AOSP 中的 LPA 模块(位于
packages/apps/CarrierServices与frameworks/opt/telephony/src/java/com/android/internal/telephony/euicc/) - ✅ 可直接构建的开源 LPA 实现:openEUICC —— 一个遵循 Android eUICC 规范、支持主流厂商芯片(如 Infineon、Thales)的社区维护 LPA,兼容 Android 9–14。
实施步骤(需 AOSP 编译环境)
-
准备 AOSP 源码环境
下载对应 Android 版本(建议 ≥ Android 9)的完整源码:repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r1 repo sync -c -j$(nproc)
-
集成 LPA 应用
将 openEUICC 项目作为packages/apps/openEUICC导入 AOSP 目录,并在build/target/product/core.mk或自定义product.mk中添加:PRODUCT_PACKAGES += \ openEUICC \ TelephonyProvider \ CarrierConfigService -
编译并刷入系统镜像
执行完整编译(需 64GB+ RAM 与 200GB+ 磁盘空间):source build/envsetup.sh && lunch aosp_arm64-userdebug m -j$(nproc) && fastboot flash system system.img
⚠️ 注意:LPA 必须以
platform签名,并声明android.uid.phoneUID,否则无法绑定EuiccManager系统服务。 -
应用层调用示例(仅限 LPA 自身或同签名系统 App)
安装 profile 的典型代码片段如下:EuiccManager euiccManager = (EuiccManager) getSystemService(Context.EUICC_SERVICE); if (euiccManager != null && euiccManager.isEnabled()) { euiccManager.downloadSubscription( new DownloadableSubscription.Builder() .setActivationCode("ICCID1234567890...") .setMatchingId("ABCDEF1234567890") .build(), executor, result -> { if (result.getStatus() == EuiccManager.ESIM_STATUS_SUCCESS) { Log.i("eSIM", "Profile downloaded, awaiting confirmation"); } } ); }
关键限制与注意事项
- ❌ 非系统 App 不可行:
EuiccManager的所有写操作均校验调用者 UID 和签名,第三方 App 无法绕过。 - ✅ 替代方案(面向终端用户):若目标是引导用户安装运营商 profile,应使用
Intent.ACTION_VIEW启动标准 QR 扫描流程:Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://example.com/profile?eid=...")); startActivity(intent); // 系统 LPA 将自动接管 - ? 权限要求严格:除
WRITE_EMBEDDED_SUBSCRIPTIONS外,还需READ_PRIVILEGED_PHONE_STATE、MODIFY_PHONE_STATE等特权权限,仅授予系统分区应用。
简言之,eSIM 的编程安装不是 SDK 功能,而是系统工程。开发者若需深度定制,必须拥抱 AOSP;若面向商业应用,应聚焦于合规调用系统 LPA(如扫码跳转),而非自行实现底层协议栈。



















