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

android 15.0 app应用安装黑名单

1.概述

在15.0系统rom定制化开发中,客户需求要实现应用安装黑名单功能,在白名单之中的应用可以安装,其他的app不准安装,实现一个
控制app安装的功能,这需要从app安装流程入手就可以实现功能
PMS就是负责管理app安装的,功能就添加在这里就可以了,接下来看具体实现这个功能

2.app应用安装黑名单核心代码

        frameworks/base/core/java/android/content/pm/IPackageManager.aidlframeworks/base/services/core/java/com/android/server/pm/InstallPackageHelper.javaframeworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

3.app应用安装黑名单核心功能分析

PackageManager是用于获取Android系统中应用程序的信息,查询Application相关信息(application,activity,receiver,service,provider及相应属性等)、查询已安装应用、
增加或删除permission、清除用户数据、缓存,代码段等
IPackageManager接口类中定义了服务端和客户端通信的业务函数,还定义了内部类Stub,该类从Binder派生并实现了IPackageManager接口。
PackageManagerService继承自IPackageManager.Stub类,由于Stub类从Binder派生,因此PackageManagerService将作为服务端参与Binder通信。
PackageManagerService(简称PKMS),是Android系统中核心服务之一,管理着所有与package相关的工作,常见的比如安装、卸载应用, 信息查询等工作, 主要完成以下核心功能
1. 解析AndroidManifest.xml清单文件,解析清单文件中的所有节点信息
2. 扫描本地文件,主要针对apk,主要是系统应用、本地安装应用等。
实现功能需求:
首选需要在IPackageManager.aidl这个pms的aidl中增加白名单接口,实现设置白名单和获取白名单的
接口,接下来在PMS中的安装app的方法中判断是否是白名单的app,然后确定是否让安装从而实现功能

3.1 IPackageManager.aidl添加接口供app调用

在实现app应用安装黑名单核心功能中,通过分析得知,IPackageManager接口类定义了关于PackageManagerService的
相关接口,在这里私信对apk的扫描安装接口,所以关于设置安装黑名单的接口,也需要在这里定义,然后在PackageManagerService中
进行实现相关的接口定义
首先需要在增加pms的aidl中IPackageManager.aidl增加设置黑名单和获取黑名单接口

diff --git a/frameworks/base/core/java/android/content/pm/IPackageManager.aidl b/frameworks/base/core/java/android/content/pm/IPackageManager.aidlold mode 100644new mode 100755index a369cc89a3..90fafe5a8f--- a/frameworks/base/core/java/android/content/pm/IPackageManager.aidl+++ b/frameworks/base/core/java/android/content/pm/IPackageManager.aidl@@ -798,4 +798,7 @@ interface IPackageManager {*/int restoreAppData(String sourceDir, String pkgName);/* @} */+   +       void setInstallPackageBlackList(in List<String> packageNames);+       List<String> getInstallPackageBlackList();}public abstract class IPackageManagerBase extends IPackageManager.Stub {
@Override
+  public     void setInstallPackageBlackList(in List<String> packageNames){
}@Override
+ public      List<String> getInstallPackageBlackList(){
}
}

通过上述在 IPackageManager.aidl的代码中,
通过添加setInstallPackageBlackList(in List<String> packageNames)和getInstallPackageBlackList()作为安装黑名单的接口

3.2 在PMS中实现设置和获取黑名单的接口

在实现app应用安装黑名单核心功能中,通过分析得知,需要在PackageManagerService.java中
实现IPackageManager.aidl增加设置黑名单和获取黑名单接口功能,接下来具体实现相关的
安装黑名单功能

diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.javaindex 45289f2e39..6727b10e35 100755--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java@@ -111,7 +111,13 @@ import static com.android.server.pm.PackageManagerServiceUtils.getCompressedFileimport static com.android.server.pm.PackageManagerServiceUtils.getLastModifiedTime;import static com.android.server.pm.PackageManagerServiceUtils.logCriticalInfo;import static com.android.server.pm.PackageManagerServiceUtils.verifySignatures;-+import java.io.BufferedReader;+import java.io.File;+import java.io.FileInputStream;+import java.io.FileOutputStream;+import java.io.InputStreamReader;+import java.io.LineNumberReader;+import java.io.PrintWriter;import android.Manifest;import android.annotation.IntDef;import android.annotation.NonNull;@@ -2141,7 +2147,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService}}}-+       private List<String> installBlackpackageNames;+           @Override+    public void setInstallPackageBlackList( List<String> packageNames) {+               this.installBlackpackageNames=packageNames;+    }+       +       @Override+    public List<String> getInstallPackageBlackList(){+               return this.installBlackpackageNames;+    }

在实现app应用安装黑名单核心功能中,通过分析得知,
通过上述在PackageManagerService.java的代码中,增加实现安装app黑名单的接口
来实现自定义服务中,通过调用接口来实现对安装黑名单数据的传递,来实现控制app
黑名单内的app安装

3.3 InstallPackageHelper关于安装app黑名单功能实现分析

在实现app应用安装黑名单核心功能中,通过分析得知,在 PackageManagerService.java的相关源码分析得知,
PMS安装app的流程中,都会调用InstallPackageHelper.preparePackageLI()负责对app的安装功能做相关的管理,可以先看相关代码
然后在这里进行安装app的时候判断app是否在黑名单列表中决定是否安装

       @GuardedBy("mInstallLock")private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res)throws PrepareFailure {final int installFlags = args.mInstallFlags;final File tmpPackageFile = new File(args.getCodePath());final boolean onExternal = args.mVolumeUuid != null;final boolean instantApp = ((installFlags & PackageManager.INSTALL_INSTANT_APP) != 0);final boolean fullApp = ((installFlags & PackageManager.INSTALL_FULL_APP) != 0);final boolean virtualPreload =((installFlags & PackageManager.INSTALL_VIRTUAL_PRELOAD) != 0);final boolean isRollback = args.mInstallReason == PackageManager.INSTALL_REASON_ROLLBACK;@PackageManagerService.ScanFlags int scanFlags = SCAN_NEW_INSTALL | SCAN_UPDATE_SIGNATURE;if (args.mMoveInfo != null) {// moving a complete application; perform an initial scan on the new install locationscanFlags |= SCAN_INITIAL;}if ((installFlags & PackageManager.INSTALL_DONT_KILL_APP) != 0) {scanFlags |= SCAN_DONT_KILL_APP;}if (instantApp) {scanFlags |= SCAN_AS_INSTANT_APP;}if (fullApp) {scanFlags |= SCAN_AS_FULL_APP;}if (virtualPreload) {scanFlags |= SCAN_AS_VIRTUAL_PRELOAD;}if (DEBUG_INSTALL) Slog.d(TAG, "installPackageLI: path=" + tmpPackageFile);// Validity checkif (instantApp && onExternal) {Slog.i(TAG, "Incompatible ephemeral install; external=" + onExternal);throw new PrepareFailure(PackageManager.INSTALL_FAILED_SESSION_INVALID);}.....}

在实现app应用安装黑名单核心功能中,通过分析得知,在 InstallPackageHelper.java的相关源码分析得知,
通过对PMS的安装流程分析,可以得知在app静默安装,手动安装,等等,
无论是pm安装或者是 代码安装 都会走InstallPackageHelper.preparePackageLI 所以在这里添加判断包名是否在黑名单即可
然后在黑名单内的app可以安装,不在黑名单内的app就不能安装,具体实现如下:

      @@ -17482,7 +17497,13 final class InstallPackageHelper {@GuardedBy("mInstallLock")private PrepareResult preparePackageLI(InstallArgs args, PackageInstalledInfo res)throws PrepareFailure {     try (PackageParser2 pp = new PackageParser2(mSeparateProcesses, false, mMetrics, null,mPackageParserCallback)) {parsedPackage = pp.parsePackage(tmpPackageFile, parseFlags, false);AndroidPackageUtils.validatePackageDexMetadata(parsedPackage);} catch (PackageParserException e) {throw new PrepareFailure("Failed parse during installPackageLI", e);} finally {Trace.traceEnd(TRACE_TAG_PACKAGE_MANAGER);}-+               if(isBlackListApp(parsedPackage.getPackageName())){+            Log.d("TAG","--isBlackListApp--");+                       +                       throw new PrepareFailure(INSTALL_FAILED_INSTANT_APP_INVALID,+                    "app is not in the Blacklist. packageName");+           +        }if (instantApp && pkg.mSigningDetails.signatureSchemeVersion< SignatureSchemeVersion.SIGNING_BLOCK_V2) {Slog.w(TAG, "Instant app package " + pkg.packageName@@ -18039,7 +18060,21 @@ public class PackageManagerService extends PackageManagerServiceExAbs}}}+    private boolean isBlackListApp(String packagename){+               if(this.installBlackpackageNames ==null || this.installBlackpackageNames.size()==0){+                       return false;+               }+               +        Iterator<String> it = this.installBlackpackageNames.iterator();+        while (it.hasNext()) {+            String blacklistItem = it.next();+            if (blacklistItem.equals(packagename)) {+                return true;+            }+        }+        return false;+    }

在实现app应用安装黑名单核心功能中,通过分析得知,在 InstallPackageHelper.java的相关源码分析得知,
在preparePackageLI(InstallArgs args, PackageInstalledInfo res)方法中,通过判断当前parsedPackage.getPackageName()
包名是否在黑名单中,如果在黑名单中,就返回throw new PrepareFailure(INSTALL_FAILED_INSTANT_APP_INVALID,
"app is not in the Blacklist. packageName");然后就可以禁止安装app就可以了

http://www.dtcms.com/a/557154.html

相关文章:

  • N-158基于微信小程序学生社团管理系统
  • LeetCode算法日记 - Day 89: 最长递增子序列
  • 两学一做 网站帮别人建网站赚钱吗
  • 2025江苏省职业院校技能大赛网络系统管理赛项模块A:网络构建卷I(未公开)
  • 鸿蒙工程结构、开发指南
  • Python为什么能成为Ubuntu官方支持的脚本语言?
  • Studio Drummer 深度指南:从采样逻辑到风格化创作的实战手册
  • 一个专门做试题的网站商品seo关键词优化
  • 汽车ECU测试中边界值方法
  • 微信小程序开发工具软件网络优化策划书
  • 【GSR】皮肤电反应 数据分析全流程教程
  • 现代Python开发环境搭建(VSCode + Dev Containers)
  • 网站模版如何使用个人网站经营性备案查询
  • 理解计算机系统_程序计数器PC的实现
  • 在Unity中运行Yolo推理
  • php+redis基本操作及操作说明
  • 神经网络补充知识
  • 怎么在网站后台删除图片vps搭建网站教程
  • MySQL主从数据一致性校验工具:pt-table-checksum 详解
  • 源码分享:AI照片风格化小程序
  • 哪些行业做网站的多如何做二级域名子目录网站
  • jQuery Mobile 面板
  • Vulfocus---shiro反序列化漏洞
  • 搭建以Node-RED为基础的“小快灵”智能工厂OT底座的实现框架
  • 三防平板三防是指哪三防?适合应用在什么场景?
  • <数据集>yolo织物缺陷识别数据集<目标检测>
  • ubuntu中安装多版本esp-idf环境
  • 网站建设与管理相关工作岗位智慧团建在线登录
  • 从依赖地狱到仓库中枢:Nexus让包管理像逛超市一样简单
  • 用pw后缀的网站今天广西紧急通知最新