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;
        }
    }
相关推荐
モンキー・D・小菜鸡儿3 小时前
Android 系统TTS(文字转语音)解析
android·tts
2501_915909063 小时前
iOS 反编译防护工具全景解析 从底层符号到资源层的多维安全体系
android·安全·ios·小程序·uni-app·iphone·webview
Swizard3 小时前
速度与激情:Android Python + CameraX 零拷贝实时推理指南
android·python·ai·移动开发
summerkissyou19873 小时前
Android13-Audio-AudioTrack-播放流程
android·音视频
里纽斯4 小时前
RK平台Watchdog硬件看门狗验证
android·linux·rk3588·watchdog·看门狗·rk平台·wtd
三七吃山漆4 小时前
攻防世界——comment
android·python·web安全·网络安全·ctf
用户413079810614 小时前
终于懂了-ARouter原理初探
android
fatiaozhang95275 小时前
晶晨S905L3B芯片-2+8G-安卓9.0-ATV原生设置(深度精简优化)-通刷-线刷固件包
android·电视盒子·刷机固件·机顶盒刷机·晶晨s905l3b通刷包·e900v22c-s905l3
Railshiqian5 小时前
安卓如何查看settings是被哪个进程更新的
android