ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PI 的 InstallService 安装全流程完整解析:前台服务、进度通知与 DexOpt 优化实现

PI 的 InstallService 安装全流程完整解析:前台服务、进度通知与 DexOpt 优化实现 PI 的 InstallService 安装全流程完整解析前台服务、进度通知与 DexOpt 优化实现【免费下载链接】PIPackageInstaller项目地址: https://gitcode.com/gh_mirrors/pi1/PIPIPackageInstaller是一款基于 Android 系统PackageInstaller会话机制的第三方 APK 安装器。本文带你完整解析 PI 中InstallService的安装全流程它如何以前台服务稳定执行安装、如何用节流策略更新进度通知、又如何在安装后做 DexOpt 优化让应用首启更快。一分钟认识 PI 的安装架构PI 的安装能力建立在三层之上权限层通过 Shizuku、Dhizuku、libsu 等授权通道见su/src/main/kotlin/dev/sanmer/su/获取系统服务的Binder代理委托层core/src/main/kotlin/dev/sanmer/pi/core/delegate/PackageInstallerDelegate.kt封装会话创建、打开、提交等系统调用服务层app/src/main/kotlin/dev/sanmer/pi/service/InstallService.kt负责真正执行安装并维护通知 为什么用服务而不是普通线程安装一个几十 MB 的 APK 可能要几十秒用户随时可能切走界面。把它放到前台服务里执行进程优先级更高、不易被系统回收用户也能在状态栏全程看到安装进度。安装全流程一次安装的 6 个步骤界面发起MainViewModel解析 APK/APKS/ZIP 后调用InstallService.start()见app/src/main/kotlin/dev/sanmer/pi/ui/main/MainViewModel.kt权限检查Android 14T及以上会先请求POST_NOTIFICATIONS通知权限授权后才启动服务前台化服务onCreate中调用ServiceCompat.startForeground进入前台类型为dataSync写入 APK通过PackageInstaller会话把文件内容写入会话提交安装commit()等待系统完成安装并校验返回状态收尾优化执行 DexOpt最后把通知改为可点击启动 App前台服务安装过程不被打断服务在 AndroidManifest 中声明为不导出、前台类型dataSyncservice android:name.service.InstallService android:exportedfalse android:foregroundServiceTypedataSync /服务内部用Mutex加任务列表做并发互斥同一个应用同一时间只允许一个安装任务所有任务结束后延迟 5 秒自动stopSelf()退出前台避免占用状态栏过久。进度通知1 秒节流流畅又不刷屏APK 写入是逐缓冲区的原始进度回调会非常密集。PI 用单调时钟TimeSource.Monotonic做了1 秒节流距离上次通知不足 1 秒的回调直接丢弃。通知设计也很讲究多条安装任务通过setGroup归入同一通知组状态栏只显示组摘要安装中setOngoing(true) 进度条不可滑动清除安装成功解除 ongoing、取消静音点击通知直接打开刚装好的 App通过getLaunchIntentForPackage构造 PendingIntent安装失败展示错误信息可手动关闭通知渠道INSTALL在App.onCreate中创建app/src/main/kotlin/dev/sanmer/pi/App.kt重要级别为HIGH。写入 APKwriteFd 与 writeZip 两种策略InstallService根据任务里的fileNames列表选择写入方式实现见PackageInstallerDelegate.kt的扩展函数场景方式说明单 APKwriteFd打开文件输入流边拷贝边回调进度最后fsync分体包APKS/ZIPwriteZip用 Apache Commons Compress 按条目名精确抽取 base.apk 及推荐 split 包写入前还会通过SessionParams设置应用图标、名称和包名让系统确认对话框直接显示正确信息。会话参数支持降级、测试包与跨版本安装createSessionParams统一设置了几个安装标志INSTALL_REPLACE_EXISTING覆盖已有版本INSTALL_ALLOW_TEST允许测试版INSTALL_REQUEST_DOWNGRADE允许版本降级Android 14 追加INSTALL_BYPASS_LOW_TARGET_SDK_BLOCK与INSTALL_REQUEST_UPDATE_OWNERSHIP另外若任务携带ownerPackageName如来自 Play 商店的包会将其作为会话所有者此时跳过后续的手动 DexOpt——因为 Play 安装路径由系统自行完成优化。DexOpt 优化装完就跑得快安装成功后optimize()会依次调用clearApplicationProfileData清除应用画像数据performDexOpt手动触发字节码优化这一步让新装 App 在首次启动前就完成优化避免用户第一次打开时卡顿等待。整个过程被runCatching包裹失败只记日志不影响安装结果。关键文件速查安装服务主体app/src/main/kotlin/dev/sanmer/pi/service/InstallService.kt安装委托与写入扩展core/src/main/kotlin/dev/sanmer/pi/core/delegate/PackageInstallerDelegate.kt系统接口桩隐藏 APIstub/src/main/java/android/content/pm/PackageInstallerHidden.java授权仓库实现app/src/main/kotlin/dev/sanmer/pi/repository/SuRepositoryImpl.kt服务声明app/src/main/AndroidManifest.xml小结 PI 的InstallService用一套简洁的组合拳解决了第三方安装器的核心难题前台服务保证安装全程稳定、可观测分组 节流通知让进度反馈流畅不骚扰writeFd / writeZip双策略覆盖单包与分体包手动 DexOpt让新装应用开箱即流畅理解这条链路你也就掌握了 Android 上基于PackageInstaller会话机制做静默安装的核心思路。【免费下载链接】PIPackageInstaller项目地址: https://gitcode.com/gh_mirrors/pi1/PI创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表