当前位置: 首页 > article >正文

[RK3568][Android12.0]--- 深入解析预置APK的三种模式与实现原理

1. RK3568 Android12预置APK的核心机制在RK3568平台上开发Android12系统时预置第三方APK是个高频需求。Rockchip官方提供了三种预置模式每种模式对应不同的使用场景和系统行为。我第一次接触这个功能时发现官方文档只有简单说明实际开发中踩了不少坑。今天我就结合源码带大家彻底搞懂这三种模式的差异。预置APK的本质是将应用程序提前集成到系统镜像中使其在设备首次开机时就自动安装。与普通安装方式相比预置APK具有两个显著优势一是避免用户手动安装的繁琐操作二是可以控制应用的卸载权限。根据业务需求不同Rockchip设计了三种预置目录preinstall不可卸载的预置应用preinstall_del可卸载但恢复出厂能自动恢复的预置应用preinstall_del_forever可卸载且恢复出厂不会恢复的预置应用这三种模式在底层实现上有本质区别。preinstall目录下的APK会被打包到system分区而preinstall_del和preinstall_del_forever则会被打包到odm分区。这种分区设计直接决定了应用的恢复特性——system分区在恢复出厂时不会被清除而odm分区则可能被重置。2. 三种预置模式的配置方法2.1 基础目录结构要在RK3568上预置APK首先需要在设备目录下创建对应的预置文件夹。以rk3568设备为例目录结构通常如下device/rockchip/rk3568/ ├── preinstall/ # 不可卸载的预置APK ├── preinstall_del/ # 可卸载可恢复的预置APK └── preinstall_del_forever/ # 可卸载不恢复的预置APK实际操作中只需要将APK文件放入对应目录即可。例如要预置一个不可卸载的系统工具APKcp MySystemTool.apk device/rockchip/rk3568/preinstall/2.2 Makefile配置原理预置功能的实现核心在device/rockchip/common/modules/preinstall.mk文件中。这个makefile会调用auto_generator.py脚本为每个预置目录生成编译规则$(shell python device/rockchip/common/auto_generator.py \ $(TARGET_DEVICE_DIR) preinstall bundled_persist-app $(TARGET_ARCH)) $(shell python device/rockchip/common/auto_generator.py \ $(TARGET_DEVICE_DIR) preinstall_del bundled_uninstall_back-app $(TARGET_ARCH)) $(shell python device/rockchip/common/auto_generator.py \ $(TARGET_DEVICE_DIR) preinstall_del_forever bundled_uninstall_gone-app $(TARGET_ARCH))脚本会根据预置目录中的APK文件自动生成Android.mk和preinstall.mk。例如对于preinstall目录下的APK生成的Android.mk会包含如下关键配置LOCAL_MODULE_PATH : $(TARGET_OUT)/preinstall LOCAL_CERTIFICATE : PRESIGNED LOCAL_DEX_PREOPT : false这些配置决定了APK的安装路径、签名方式和优化策略。值得注意的是三种预置模式生成的模块路径不同预置类型安装路径恢复特性preinstall/system/preinstall不可卸载preinstall_del/odm/bundled_uninstall_back-app可卸载恢复出厂可恢复preinstall_del_forever/odm/bundled_uninstall_gone-app可卸载恢复出厂不恢复3. 预置APK的安装流程解析3.1 系统启动时的扫描安装当Android系统启动时PackageManagerService会扫描预置目录并安装APK。关键代码在frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java中private void preinstallThirdPartyAPK(PackageParser2 packageParser, ExecutorService executorService, int scanFlags) { preinstallPrebundledpersist(packageParser, executorService, scanFlags); preinstallPrebundledUninstallBack(packageParser, executorService, scanFlags); preinstallPrebundledUninstallGone(packageParser, executorService, scanFlags); }这三个方法分别处理三种预置模式。以preinstallPrebundledpersist为例它会扫描BUNDLED_PERSIST_DIR目录private void preinstallPrebundledpersist(PackageParser2 packageParser, ExecutorService executorService, int scanFlags) { scanDirTracedLI(new File(BUNDLED_PERSIST_DIR), mDefParseFlags | ParsingPackageUtils.PARSE_IS_SYSTEM_DIR, scanFlags | SCAN_AS_PREINSTALL | SCAN_AS_SYSTEM, 0, packageParser, executorService); }扫描过程中系统会为每个APK创建Package对象并将其添加到已安装包列表。关键区别在于scanFlags参数SCAN_AS_SYSTEM标记为系统应用SCAN_AS_PREINSTALL标记为预置应用SCAN_AS_PREBUNDLED_DIR标记为可卸载的预置应用3.2 可卸载APK的特殊处理对于preinstall_del和preinstall_del_forever目录下的APK系统会有额外的处理逻辑。在scanDirLI方法中可以看到如下关键代码if (scanDir.getAbsolutePath().contains(BUNDLED_UNINSTALL_GONE_DIR)) { if (!readDeleteFile(list)) { Log.e(TAG, read data failed); return; } }这段代码会检查是否有标记为已删除的预置应用。如果是preinstall_del_forever目录下的APK且已被用户卸载系统会跳过安装。而对于preinstall_del目录下的APK即使用户卸载恢复出厂设置后仍会重新安装。4. 实战经验与常见问题4.1 签名问题处理在实际项目中最常见的坑是签名问题。如果预置的APK没有正确签名会出现如下错误W PackageManager: Failed to scan /odm/bundled_persist-app/autotest: No APK Signature Scheme v2 signature in package解决方法是在Android.mk中添加PRESIGNED标记LOCAL_CERTIFICATE : PRESIGNED如果是系统特权应用则需要使用平台签名LOCAL_CERTIFICATE : platform4.2 桌面图标不显示问题有时预置的APK已经安装成功但在桌面看不到图标。这通常是因为APK没有默认的LAUNCHER Activity。解决方法有两种修改APK的AndroidManifest.xml添加LAUNCHER入口在预置时强制显示添加如下配置LOCAL_REPLACE_PREBUILT_APK_INSTALLED : $(LOCAL_PATH)/$(LOCAL_MODULE).apk4.3 预置APK的升级策略预置APK的升级需要特别注意版本兼容性。如果用户从应用商店升级了预置应用恢复出厂设置后会出现版本回退。建议在代码中做如下判断try { PackageInfo preinstallInfo getPackageManager() .getPackageInfo(com.example.app, PackageManager.GET_META_DATA); if (preinstallInfo ! null) { // 检查是否是预置版本 ApplicationInfo appInfo preinstallInfo.applicationInfo; if ((appInfo.flags ApplicationInfo.FLAG_SYSTEM) ! 0) { // 处理预置版本的特殊逻辑 } } } catch (PackageManager.NameNotFoundException e) { // 应用未安装 }5. 三种预置模式的深度对比5.1 技术实现差异通过分析源码我整理出三种预置模式的关键技术差异特性preinstallpreinstall_delpreinstall_del_forever存储分区systemodmodm卸载权限不可卸载可卸载可卸载恢复出厂行为保留恢复不恢复安装后是否删除源文件否是是适用场景系统核心功能厂商定制应用临时推广应用5.2 性能影响评估不同预置方式对系统性能也有影响。经过实测发现preinstall模式的APK会参与系统dex优化首次开机时间较长但运行效率高preinstall_del模式的APK在恢复出厂时需要重新安装会增加恢复时间preinstall_del_forever模式的APK如果被卸载会永久释放存储空间在资源紧张的设备上建议将非核心应用放在preinstall_del目录以减小system分区占用。5.3 最佳实践建议根据项目经验我总结出以下预置原则系统必需组件如设置、相机使用preinstall模式厂商定制应用如音乐、视频使用preinstall_del模式临时预装或推广应用使用preinstall_del_forever模式单个APK体积建议控制在20MB以内过大会影响系统镜像生成速度预置前务必测试APK在低内存设备上的运行表现在RK3568平台上还需要特别注意存储分区的大小配置。如果预置应用过多可能导致system或odm分区溢出。可以通过调整BoardConfig.mk中的分区大小参数来解决BOARD_SYSTEMIMAGE_PARTITION_SIZE : 2147483648 # system分区2GB BOARD_ODMIMAGE_PARTITION_SIZE : 536870912 # odm分区512MB

相关文章:

[RK3568][Android12.0]--- 深入解析预置APK的三种模式与实现原理

1. RK3568 Android12预置APK的核心机制 在RK3568平台上开发Android12系统时,预置第三方APK是个高频需求。Rockchip官方提供了三种预置模式,每种模式对应不同的使用场景和系统行为。我第一次接触这个功能时,发现官方文档只有简单说明&#xff…...

LS-DYNA新手避坑指南:用LS-PrePost给复合材料壳单元铺层的四种方法(附BETA参数设置对比表)

LS-DYNA复合材料建模实战:壳单元铺层方向定义全解析与避坑策略 复合材料在抗冲击分析中的建模一直是LS-DYNA初学者的痛点,尤其是铺层方向的定义。第一次打开LS-PrePost时,面对四种不同的铺层定义方法,我完全懵了——*SECTION_SHE…...

ISP降噪模块False Colors处理不当导致的动态色边溢出剖析

1. 动态色边溢出问题现象解析 最近在调试高通ISP图像处理流水线时,遇到一个棘手的问题:在拍摄动态场景时,画面中移动的边缘会出现不规则的彩色溢出伪影。这种色边不像传统色差那样固定,而是随着物体移动不断变化,就像给…...

别再只盯着GPU了!手把手带你用Python模拟一个超简版NPU(附代码)

用Python模拟NPU核心原理:从矩阵乘法到存储计算一体化 在咖啡厅里打开笔记本电脑运行神经网络模型时,你是否注意过风扇突然狂转?这背后是传统处理器架构面对AI计算时的力不从心。NPU(神经网络处理器)的独特之处在于&am…...

KaiwuDB 亮相储能国际峰会!Data+AI 新基座,加速储能智能升级

在技术领域,我们常常被那些闪耀的、可见的成果所吸引。今天,这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力,让我们得以一窥未来的轮廓。然而,作为在企业一线构建、部署和维护复杂系统的实践者,我们深知…...

Pikachu靶场实战:CSRF漏洞攻防全解析

1. CSRF漏洞初探:从原理到危害 第一次听说CSRF漏洞时,我也是一头雾水。这玩意儿到底是怎么把用户给"骗"了的?简单来说,CSRF就像是一个擅长模仿的骗子,它能伪装成你在网站上执行各种操作。想象一下&#xff0…...

RADICL-seq:更高效、更精准的染色质-RNA互作研究方法,绘制更完整的染色质-RNA互作图谱

RADICL-seq[1](RNA And DNA Interacting Complexes Ligated and sequenced)是一种探索 RNA 与染色质相互作用的新技术,绘制细胞核内 RNA 与染色质的相互作用图谱,能够鉴定不同类转录本的基因组覆盖模式,以及细胞特异性…...

保姆级教程:用ArcGIS Pro的Spatial Analyst搞定学校选址分析(附完整数据与权重设置)

从零到精通:ArcGIS Pro空间分析实战——学校选址全流程拆解 当你第一次打开ArcGIS Pro面对学校选址任务时,是否曾被各种工具按钮和参数设置弄得手足无措?本文将带你完整走一遍专业GIS分析师的工作流程,不仅告诉你"点击哪里&…...

基于MATLAB的CNN和SVM苹果质量智能检测与分级系统研究

摘要:苹果作为重要的经济作物,其质量分级对于提高市场竞争力和经济效益具有重要意义。传统的人工分级方法存在效率低、主观性强、成本高等问题。为实现苹果质量的快速、准确、客观分级,本文提出了一种基于MATLAB实现的CNN-SVM苹果质量智能检测…...

龙迅LT9611芯片深度评测:MIPI转HDMI1.4的4K输出性能实测

龙迅LT9611芯片深度评测:MIPI转HDMI1.4的4K输出性能实测 在当今高分辨率视频传输需求激增的背景下,接口转换芯片的性能直接影响终端设备的显示质量。作为一款专为移动设备设计的高性能转换方案,龙迅LT9611凭借其双端口MIPI输入和4K HDMI输出能…...

批量图片处理实战:千峰办公助手图像处理功能的技术指南

在数字化内容创作和互联网应用开发中,图片是最常用也是占用资源最多的媒体类型之一。 无论是网站设计、移动应用开发、电商平台运营,还是自媒体内容制作,都离不开对图片的处理和优化。 然而,当面对成百上千张图片需要统一处理时…...

文件管理效率革命:千峰办公助手批量处理功能的技术解析与应用

文件管理是计算机使用中最基础也最频繁的操作之一。 在日常工作中,我们经常需要面对大量文件的整理、命名、转换和保护需求。 传统的单文件操作方式在面对批量任务时显得力不从心。 千峰办公助手的文件工具模块,以精准的功能定位和简洁的操作设计&…...

终极指南:如何在Photoshop中无缝集成AI绘图功能

终极指南:如何在Photoshop中无缝集成AI绘图功能 【免费下载链接】sd-ppp A Photoshop AI plugin 项目地址: https://gitcode.com/gh_mirrors/sd/sd-ppp 你是否曾经梦想过在Photoshop中直接调用AI模型进行创意绘图?是否厌倦了在不同软件间来回切换…...

Debian12系统下fcitx5中文输入法的安装与优化配置指南

1. 为什么选择fcitx5输入法? 在Linux系统上折腾中文输入法,相信是很多用户刚接触Debian时的必经之路。我自己从Debian 9一路用到现在的Debian 12,尝试过ibus、fcitx4等各种方案,最终发现fcitx5确实是最优解。相比旧版fcitx4&#…...

百度网盘直连下载终极指南:3步实现高速下载的完整教程

百度网盘直连下载终极指南:3步实现高速下载的完整教程 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 还在为百度网盘的龟速下载而烦恼吗?你是否经常面…...

从‘线与’逻辑到PCB布线:那些新手在I2C项目中最容易踩的坑

从‘线与’逻辑到PCB布线:那些新手在I2C项目中最容易踩的坑 第一次在STM32上调试I2C设备时,我盯着示波器上扭曲的波形百思不得其解——明明按照手册配置了所有参数,为什么OLED屏幕就是死活不显示?直到用热风枪吹下那个10KΩ的上拉…...

从零开始:使用Docker和vLLM快速部署Qwen2.5-VL-7B图文对话模型

从零开始:使用Docker和vLLM快速部署Qwen2.5-VL-7B图文对话模型 1. 环境准备与快速部署 1.1 系统要求 操作系统:支持Linux发行版(推荐Ubuntu 20.04或CentOS 7)GPU:NVIDIA显卡(建议显存≥16GB)…...

3步完美解决Jellyfin中文影视刮削难题:MetaShark插件配置指南

3步完美解决Jellyfin中文影视刮削难题:MetaShark插件配置指南 【免费下载链接】jellyfin-plugin-metashark jellyfin电影元数据插件 项目地址: https://gitcode.com/gh_mirrors/je/jellyfin-plugin-metashark 还在为Jellyfin无法准确识别中文电影电视剧而烦恼…...

雀魂Mod Plus:免费解锁全角色皮肤的终极指南

雀魂Mod Plus:免费解锁全角色皮肤的终极指南 【免费下载链接】majsoul_mod_plus 雀魂解锁全角色、皮肤、装扮等,支持全部服务器。 项目地址: https://gitcode.com/gh_mirrors/ma/majsoul_mod_plus 还在为无法获得心仪的雀魂角色而烦恼吗&#xff…...

生成式AI应用CI/CD流水线实战指南:从Prompt版本管理、LLM微调触发到RAG流水线回滚,一套跑通工业级部署

第一章:生成式AI应用CI/CD流水线实战指南:从Prompt版本管理、LLM微调触发到RAG流水线回滚,一套跑通工业级部署 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用的持续交付远非传统模型部署的简单延伸——它要求对非参数化资产&a…...

Youtu-Parsing部署教程:多GPU负载均衡配置,4卡A10集群并发解析吞吐达48页/秒

Youtu-Parsing部署教程:多GPU负载均衡配置,4卡A10集群并发解析吞吐达48页/秒 1. 引言 想象一下,你手头有几千份扫描的合同、报告或者发票,需要把里面的文字、表格、公式都提取出来,整理成电脑能直接处理的格式。传统…...

告别CentOS停服焦虑:手把手教你用VMware Workstation 17 Pro安装Rocky Linux 9.6 Minimal服务器

企业级CentOS替代方案:VMware Workstation 17 Pro部署Rocky Linux 9.6 Minimal全指南 当CentOS官方宣布停止维护后,许多依赖其稳定性的企业用户陷入了技术选型的困境。作为CentOS创始人Gregory Kurtzman主导的项目,Rocky Linux凭借与RHEL的二…...

Bright Data 亮数据产品使用场景更新

亲爱的用户您好,为了持续为您提供更专注、更优质的服务,我们将对部分使用场景进行调整。自 2026 年 4 月 1 日起,我们将暂停受理以下使用场景的新用户申请:社交媒体账号管理社交媒体广告账号管理电商店铺账号管理目前正在使用上述…...

如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程

如何在Windows上快速搭建虚拟游戏手柄系统:vJoy完整配置教程 【免费下载链接】vJoy Virtual Joystick 项目地址: https://gitcode.com/gh_mirrors/vj/vJoy 想要在Windows系统上模拟专业游戏控制器,却不想购买昂贵的硬件设备?vJoy虚拟摇…...

Simulink信号与参数工程化配置:从模型到代码的接口设计

1. 为什么需要工程化配置信号与参数? 第一次用Simulink生成代码时,我发现自动生成的变量全都挤在模块内部的结构体里。当时做汽车电子控制单元开发,同事指着代码问我:"你这油门踏板信号怎么和其他模块交互?难道要…...

避开付费陷阱!这些GitHub星标过千的WordPress开源主题,连老外都在用(含SEO优化实测数据)

GitHub星标过千的WordPress开源主题技术解析与SEO实战指南 在独立站长的世界里,主题选择往往决定着技术栈的深度和运维成本。当大多数人在付费主题市场徘徊时,GitHub上那些获得开发者用星标投票的开源项目,正以惊人的迭代速度重新定义WordPre…...

Elasticsearch 容量规划与性能优化完全指南

前言:什么样的规模才算"太大"? Elasticsearch 本身没有硬性存储上限——生产环境中甚至有节点处理 PB 级数据的案例。但"太大"会通过三种信号显现:查询响应突破 SLA 阈值、节点触及分片上限、存储成本因全量使用高速存储而失控。 本文将深入剖析这三个…...

LangChain Tools实战避坑:用Pydantic给你的Agent工具加上‘输入验证锁’

LangChain Tools安全加固指南:用Pydantic构建企业级参数验证体系 在构建基于LangChain的智能体系统时,开发者常常将注意力集中在核心逻辑的实现上,却忽略了工具调用的安全性问题。一个没有输入验证的Tool就像没有锁的家门,随时可能…...

3分钟掌握AKShare:用Python轻松获取免费金融数据

3分钟掌握AKShare:用Python轻松获取免费金融数据 【免费下载链接】akshare AKShare is an elegant and simple financial data interface library for Python, built for human beings! 开源财经数据接口库 项目地址: https://gitcode.com/gh_mirrors/aks/akshare…...

Cursor Pro逆向工程全解析:如何实现系统限制突破的深度技术解密

Cursor Pro逆向工程全解析:如何实现系统限制突破的深度技术解密 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached…...