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

Android 定制限制安装功能

文章目录

  • Android 定制限制安装功能
    • 一、服务端拦截:PackageManagerService 核心层
      • 文件路径
      • 1.1 依赖导入(已存在,无需新增)
      • 1.2 代码修改
      • 1.3 行号对照
      • 1.4 拦截效果
    • 二、UI 入口拦截:PackageInstaller 安装向导入口
      • 文件路径
      • 2.1 依赖导入(已存在,无需新增)
      • 2.2 代码修改
      • 2.3 行号对照
      • 2.4 拦截效果
    • 三、字符串资源
      • 文件路径
    • 四、修改清单总览
    • 五、双保险拦截流程

Android 定制限制安装功能

功能:当系统属性persist.sys.stb.is3rdNotAllowInstall = true时,禁止所有第三方 APP 安装操作。
拦截策略:UI 入口 + PMS 服务端双保险,覆盖点击 APK 安装pm installSession APIADB等所有路径。


一、服务端拦截:PackageManagerService 核心层

文件路径

frameworks/base/services/core/java/com/android/server/pm/InstallingSession.java

1.1 依赖导入(已存在,无需新增)

// InstallingSession.javaimportandroid.os.SystemProperties;// line 45importandroid.util.Slog;// line 51

1.2 代码修改

修改位置handleStartCopy(InstallRequest request)方法开头,APEX 判断之后、getMinimalPackageInfo之前。

修改前(原生 AOSP)

privatevoidhandleStartCopy(InstallRequestrequest){if((mInstallFlags&PackageManager.INSTALL_APEX)!=0){mRet=INSTALL_SUCCEEDED;return;}PackageInfoLitepkgLite=PackageManagerServiceUtils.getMinimalPackageInfo(mPm.mContext,mPackageLite,mOriginInfo.mResolvedPath,mInstallFlags,mPackageAbiOverride);

修改后(新增限制安装拦截)

privatevoidhandleStartCopy(InstallRequestrequest){if((mInstallFlags&PackageManager.INSTALL_APEX)!=0){mRet=INSTALL_SUCCEEDED;return;}// +++ add by stb: 限制安装开关,打开后禁止所有第三方 APP 安装booleannotAllowInstall=SystemProperties.getBoolean("persist.sys.stb.is3rdNotAllowInstall",false);Slog.v(TAG,"===notAllowInstall===="+notAllowInstall);if(notAllowInstall){mRet=PackageManager.INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE;return;}// +++PackageInfoLitepkgLite=PackageManagerServiceUtils.getMinimalPackageInfo(mPm.mContext,mPackageLite,mOriginInfo.mResolvedPath,mInstallFlags,mPackageAbiOverride);

1.3 行号对照

行号内容
247private void handleStartCopy(InstallRequest request) {
248-251APEX 安装豁免(原生逻辑,不受限制)
252boolean notAllowInstall = SystemProperties.getBoolean(...)
253Slog.v(TAG, "===notAllowInstall====" + notAllowInstall);
254-257if (notAllowInstall) { mRet = ...; return; }
258+原生流程继续

1.4 拦截效果

  • 读取属性persist.sys.stb.is3rdNotAllowInstall,默认false
  • true时,设置mRet = INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLEreturn,在收集 PackageInfo 之前终止安装。
  • 覆盖路径:pm install、PackageInstaller Session API、ADB install 等所有走 PMS 的安装。
  • APEX 安装不受限INSTALL_APEX分支在属性检查之前 return。

二、UI 入口拦截:PackageInstaller 安装向导入口

文件路径

frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java

2.1 依赖导入(已存在,无需新增)

// InstallStart.javaimportandroid.os.SystemProperties;// line 39importandroid.widget.Toast;// line 45

2.2 代码修改

修改位置onCreate流程末尾,startActivity(nextActivity)调用处。

修改前(原生 AOSP)

if(nextActivity!=null){try{startActivity(nextActivity);}catch(SecurityExceptione){Intentresult=newIntent();result.putExtra(Intent.EXTRA_INSTALL_RESULT,PackageManager.INSTALL_FAILED_INVALID_URI);setResult(RESULT_FIRST_USER,result);}}finish();

修改后(新增限制安装拦截)

if(nextActivity!=null){// +++ add by stb: 限制安装开关,打开后禁止外部应用手动安装if("true".equals(SystemProperties.get("persist.sys.stb.is3rdNotAllowInstall","false"))){Toast.makeText(InstallStart.this,R.string.installation_not_allowed,Toast.LENGTH_LONG).show();}else{try{startActivity(nextActivity);}catch(SecurityExceptione){Intentresult=newIntent();result.putExtra(Intent.EXTRA_INSTALL_RESULT,PackageManager.INSTALL_FAILED_INVALID_URI);setResult(RESULT_FIRST_USER,result);}}// +++}finish();

2.3 行号对照

行号内容
242if (nextActivity != null) {
243if ("true".equals(SystemProperties.get("persist.sys.skg.is3rdNotAllowInstall", "false"))) {
244Toast.makeText(...).show();
245} else {
246-253原生startActivity+ SecurityException 处理(移入 else 分支)
256finish();

2.4 拦截效果

  • 读取属性persist.sys.stb.is3rdNotAllowInstall,默认"false"
  • "true"时,弹出 Toast 提示,不调用startActivity(nextActivity),安装向导(PackageInstallerActivity/InstallStaging)不会启动。
  • 随后finish()结束当前 Activity。
  • 覆盖路径:文件管理器、浏览器等点击 APK 触发的ACTION_INSTALL_PACKAGE/ACTION_VIEWintent。

三、字符串资源

文件路径

frameworks/base/packages/PackageInstaller/res/values/strings.xml frameworks/base/packages/PackageInstaller/res/values-zh-rCN/strings.xml

values/strings.xml(line 364,英文)

<stringname="installation_not_allowed">Manual installation is not allowed for external applications!</string>

values-zh-rCN/strings.xml(line 132,中文)

<stringname="installation_not_allowed">外部应用,禁止手动安装!</string>

四、修改清单总览

#文件类型说明
1frameworks/base/services/core/java/com/android/server/pm/InstallingSession.javaJavahandleStartCopy新增属性判断,返回INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE
2frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.javaJavaonCreate末尾包裹startActivity,限制时弹 Toast 不启动向导
3frameworks/base/packages/PackageInstaller/res/values/strings.xml资源新增installation_not_allowed英文文案
4frameworks/base/packages/PackageInstaller/res/values-zh-rCN/strings.xml资源新增installation_not_allowed中文文案

五、双保险拦截流程

安装请求 │ ├──► [路径A] 点击 APK (Intent) │ │ │ ▼ │ InstallStart.java (UI 入口) │ 读取 persist.sys.stb.is3rdNotAllowInstall │ ├─ true ─► 弹 Toast "外部应用,禁止手动安装!" + finish() │ └─ false ─► startActivity(安装向导) ──► PMS │ └──► [路径B] pm install / ADB / Session API │ ▼ InstallingSession.handleStartCopy (PMS 服务端) 读取 persist.sys.stb.is3rdNotAllowInstall ├─ true ─► mRet = INSTALL_FAILED_PRE_APPROVAL_NOT_AVAILABLE + return └─ false ─► 继续原生安装流程

两处均只读persist.sys.stb.is3rdNotAllowInstall单一属性,状态由 stbSettings 的开关写入,无需额外通信。

如果对你有帮助,就一键三连呗(关注+点赞+收藏),我会持续更新更多干货~~

http://www.jsqmd.com/news/1392486/

相关文章:

  • AI的「寂灭」-龍德明宇
  • 如何用Pixelle-Video开启AI全自动短视频创作:新手一键生成视频的完整指南
  • Python循环关键字break和continue的使用
  • 代码之外09:团队离不开我,晋升名单却没有我
  • 信息发布系统定制速看:2026商业统一信息发布系统开发商推荐 - 选型|行业|价格|案例
  • 2026广东中小建企资质增项测评:6大机构实力对比,批量多资质申报认准专业服务商 - 优质品牌中立测评推荐
  • 2026广州做小程序商城的公司有哪些,广州小程序商城服务商怎么挑
  • WorkBuddy 安装指南(Windows 版):从下载到登录,一篇就够了
  • CS2 直播不想暴露辅助界面?三步配好 OBS 录屏绕过隐藏设置
  • iPhone USB 网络共享失效?这份 Windows 驱动安装与排错完整指南帮你快速搞定
  • 主力资金流向因子怎么挖掘本地化Python全流程实战
  • GetQzonehistory 备份攻略:十分钟把 QQ 空间说说完整归档到本地
  • 破解物理AI技术困局(45):TVA挑战通用表征架构
  • 魔兽争霸3优化工具WarcraftHelper使用教程:解锁帧率、宽屏与地图限制一次搞定
  • 【工程师笔记|新能源整车CAN总线ESD系统防护完整方案,解决30kV静电击穿痛点】
  • 香奈儿存在轻微磨损划痕,小心不良商家恶意压价,奢二网按照行业标准客观估价 - 每日小知识
  • 2026年注塑机供应厂家实力观察:高速薄壁/双色/出口/汽车配件/周转箱注塑机品牌深度解析与选购方向 - 卓企推荐
  • 开源地图API vs 商业地图API:选型全对比
  • 链表(牛客网编程练习)
  • Kimi LeetCode 3901. 好子序列查询 Rust实现
  • RAG 知识库交付实战(下):18 条用例与成本测算——质量证明与进化蓝图
  • Swagger UI 与文档发布:从接口注释到在线文档的完整实践
  • CRC8 循环冗余校验算法详解
  • 破解物理AI技术困局(50):TVA层级强化学习架构
  • 华为OD机试真题 新系统 2026-08-05 JavaGoC 实现【IPv4等长子网划分与自动分配系统】
  • Win11Debloat实测:半小时卸载预装软件、关闭遥测,新电脑终于不卡了
  • SV学习记录(五)
  • 告别传统流量竞价,拓氪科技如何依托GEO优化构建AI时代出海品牌信任底座?
  • 零成本让GIMP变成Photoshop界面:PhotoGIMP完整上手指南
  • 2026年地坪漆十大品牌厂家深度盘点:正规合规服务商选型指南、场景适配解析及合作避坑全维度实用FAQ - 行业观察网