Android15 安装APK时监听且替换安装

有些特殊需求,需要监听安装的APK,当监听到这个APK安装的时候,替换掉它,安装已经预置的APK,修改如下:

1.在framework/base/services/core/java/com/android/server/pm/InstallingSession.java里面

修改:

复制代码
diff --git a/base/services/core/java/com/android/server/pm/InstallingSession.java b/base/services/core/java/com/android/server/pm/InstallingSession.java
index 3d8f2bbf4..5d7dfac94 100644
--- a/base/services/core/java/com/android/server/pm/InstallingSession.java
+++ b/base/services/core/java/com/android/server/pm/InstallingSession.java
@@ -64,6 +64,10 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import android.content.Intent;
+import android.os.SystemProperties;
+import java.util.HashSet;
+
 class InstallingSession {
     final OriginInfo mOriginInfo;
     final MoveInfo mMoveInfo;
@@ -251,6 +255,18 @@ class InstallingSession {
         PackageInfoLite pkgLite = PackageManagerServiceUtils.getMinimalPackageInfo(mPm.mContext,
                 mPackageLite, mOriginInfo.mResolvedPath, mInstallFlags, mPackageAbiOverride);
 
+        //patch add 新增:检查是否为GMS包,若是则直接返回失败
+        if (pkgLite != null && isGmsPackage(pkgLite.packageName)) {
+           mRet = PackageManager.INSTALL_FAILED_INTERNAL_ERROR; //标记安装被阻断
+           //request.setError(mRet, "GMS package update is not allowed: " + pkgLite.packageName);
+           Slog.w(TAG, "Blocked GMS package installation: " + pkgLite.packageName);
+           if("com.example".equals(pkgLite.packageName)){
+               mPm.mContext.sendBroadcast(new Intent("com.action.intercept.example"));
+           }
+           return; // 终止后续安装流程
+        }
+               //patch add end
+               
         // For staged session, there is a delay between its verification and install. Device
         // state can change within this delay and hence we need to re-verify certain conditions.
         boolean isStaged = (mInstallFlags & INSTALL_STAGED) != 0;
@@ -284,6 +300,21 @@ class InstallingSession {
         }
     }
 
+     // 新增方法:判断是否为GMS相关包
+    private boolean isGmsPackage(String packageName) {
+       // GMS核心包名列表,可根据实际需要扩展
+       Set<String> gmsPackageNames = new HashSet<>();
+       gmsPackageNames.add("com.google.android.gms"); // GMS核心服务
+       if ("on".equals(SystemProperties.get("persist.rp.ban.example","off"))){
+           gmsPackageNames.add("com.example");
+       }
+       //gmsPackageNames.add("com.google.android.gms.pano"); // GMS全景组件
+       //gmsPackageNames.add("com.google.android.gsf"); // Google服务框架
+       //gmsPackageNames.add("com.android.vending"); // Google Play商店(若需拦截其更新)
+       // 可添加其他GMS相关包名,如地图、YouTube等
+       return gmsPackageNames.contains(packageName);
+    }
+       
     private void handleReturnCode(InstallRequest installRequest) {
         processPendingInstall(installRequest);
     }

这里是当检测到安装GMS相关的环境检测应用的时候,终止安装,发送自定广播安装自定义应用,替换当前检测应用。

2.安装应用

收到广播后可以使用Runtime.getRuntime().exec安装预置的应用

java 复制代码
public boolean silenceInstallApk( String path){
        try {
            Runtime.getRuntime().exec("pm install -r "+path);
            return true;
        } catch (Exception e) {
           return false;
        }
    }
相关推荐
ji_shuke10 小时前
opencv-mobile 和 ncnn-android 环境配置
android·前端·javascript·人工智能·opencv
sunnyday042612 小时前
Spring Boot 项目中使用 Dynamic Datasource 实现多数据源管理
android·spring boot·后端
幽络源小助理13 小时前
下载安装AndroidStudio配置Gradle运行第一个kotlin程序
android·开发语言·kotlin
inBuilder低代码平台13 小时前
浅谈安卓Webview从初级到高级应用
android·java·webview
豌豆学姐13 小时前
Sora2 短剧视频创作中如何保持人物一致性?角色创建接口教程
android·java·aigc·php·音视频·uniapp
白熊小北极13 小时前
Android Jetpack Compose折叠屏感知与适配
android
HelloBan13 小时前
setHintTextColor不生效
android
洞窝技术16 小时前
从0到30+:智能家居配网协议融合的实战与思考
android
QING61816 小时前
SupervisorJob子协程异常处理机制 —— 新手指南
android·kotlin·android jetpack
毕设源码-朱学姐17 小时前
【开题答辩全过程】以 基于安卓的停车位管理系统与设计为例,包含答辩的问题和答案
android