android11禁止安装apk

应客户需求,需要设备禁止安装其它apk。

由于一套代码中有多个产品,所以想到用设置属性的方式来决定是否可安装apk,详见以下补丁

1、相关文件

复制代码
frameworks/base/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
frameworks/base/services/core/java/com/android/server/pm/PackageInstallerSession.java
frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

2、禁止机器中识别到的apk文件的安装 ,修改如下:

复制代码
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/Pa
ckageInstaller/src/com/android/packageinstaller/InstallStart.java
index 0b8de6c7d4f1..0db15ddf050d 100644
--- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
+++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java
@@ -38,6 +38,8 @@ import android.os.RemoteException;
 import android.os.UserManager;
 import android.permission.IPermissionManager;
 import android.util.Log;
+import android.widget.Toast;
+import android.os.SystemProperties;
 
 import java.util.List;
 
@@ -53,6 +55,7 @@ public class InstallStart extends Activity {
     private IPermissionManager mIPermissionManager;
     private UserManager mUserManager;
     private boolean mAbortInstall = false;
+    private boolean APK_INSTALL_FINISH = SystemProperties.getBoolean("persist.sys.third.apk.install", false);
 
     @Override
     protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -150,7 +153,16 @@ public class InstallStart extends Activity {
         }
 
         if (nextActivity != null) {
-            startActivity(nextActivity);
+               if(!APK_INSTALL_FINISH) {
+                       //startActivity(nextActivity);
+                       Toast.makeText(InstallStart.this, "Installation prohibited", Toast.LENGTH_LONG).show();
+                       Intent result = new Intent();
+                               result.putExtra(Intent.EXTRA_INSTALL_RESULT,
+                           PackageManager.INSTALL_FAILED_INVALID_URI);
+                       setResult(RESULT_FIRST_USER, result);
+               } else{
+                   startActivity(nextActivity);
+               }
         }
         finish();
     }

3、禁止adb命令安装apk,修改如下:

复制代码
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index d35f0b28d299..82d70af87648 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -496,6 +496,8 @@ public class PackageManagerService extends IPackageManager.Stub
     public static final boolean DEBUG_PERMISSIONS = false;
     private static final boolean DEBUG_SHARED_LIBRARIES = false;
     public static final boolean DEBUG_COMPRESSION = Build.IS_DEBUGGABLE;
+    
+    private boolean APK_INSTALL_FINISH = SystemProperties.getBoolean("persist.sys.third.apk.install", false);
 
     // Debug output for dexopting. This is shared between PackageManagerService, OtaDexoptService
     // and PackageDexOptimizer. All these classes have their own flag to allow switching a single
@@ -1692,6 +1694,10 @@ public class PackageManagerService extends IPackageManager.Stub
         void doHandleMessage(Message msg) {
             switch (msg.what) {
                 case INIT_COPY: {
+                   if(!APK_INSTALL_FINISH){
+                             SystemProperties.set("persist.sys.third.apk.install", "true");
+                       return;
+                   }
                     HandlerParams params = (HandlerParams) msg.obj;
                     if (params != null) {
                         if (DEBUG_INSTALL) Slog.i(TAG, "init_copy: " + params);
@@ -3445,7 +3451,8 @@ public class PackageManagerService extends IPackageManager.Stub
             Slog.i(TAG, "Time to scan packages: "
                     + ((SystemClock.uptimeMillis()-startTime)/1000f)
                     + " seconds");
-
+       
+           APK_INSTALL_FINISH = true;
             // If the platform SDK has changed since the last time we booted,
             // we need to re-grant app permission to catch any new ones that
             // appear.  This is really a hack, and means that apps can in some

4、让adb安装命令跟着设置的属性走

复制代码
diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java
old mode 100644
new mode 100755
index d690ae9e70f1..f7566858a95f
--- a/services/core/java/com/android/server/pm/PackageInstallerSession.java
+++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java
@@ -969,6 +969,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
         // Quick sanity check of state, and allocate a pipe for ourselves. We
         // then do heavy disk allocation outside the lock, but this open pipe
         // will block any attempted install transitions.
+               
+               
+               boolean installFlag= SystemProperties.getBoolean("persist.sys.third.apk.install", false);
+               if(!installFlag){
+                        return null;
+               }
+               
         final RevocableFileDescriptor fd;
         final FileBridge bridge;
         synchronized (mLock) {
相关推荐
geovindu6 分钟前
java: Backtracking Algorithm
java·开发语言·windows·后端·算法·回溯算法
NWU_LK10 分钟前
【WebFlux】第六篇 —— 全链路响应式与数据库交互
java·数据库
一只小菜鸡..11 分钟前
南京大学 操作系统 (JYY) 学习笔记:Hello, OS World! (程序的机器视角)
java·笔记·学习
叶总没有会17 分钟前
3.2 构建AI智能体项目扩展知识
java·数据库·人工智能·spring·ai
Lakers-2418 分钟前
1987年6月10日晚上23-24点出生性格、运势和命运
java
唐青枫21 分钟前
Java Jetty 实战详解:从嵌入式 HTTP 服务到 Spring Boot 容器替换
java
腻害兔9 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社10 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖11 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎