项目场景:
android10静默安装APP
apk请看 静默安装APK下载
描述
调用PackageInstaller就行,但是需要系统权限,demo请看上面的链接
PackageInstaller packageInstaller = packageManager.getPackageInstaller();
PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);
sessionParams.setSize(apkFile.length());
int sessionId = createSession(packageInstaller, sessionParams);
packageInstaller.registerSessionCallback(new InstallSessionCallback(sessionId));
if (sessionId != -1) {
boolean copySuccess = copyInstallFile(packageInstaller, sessionId, apkFilePath);
if (copySuccess) {
execInstallCommand(context, packageInstaller, sessionId);
}
}
session = packageInstaller.openSession(sessionId);
Intent intent = new Intent();
intent.setAction(INSTALL_ACTION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
session.commit(pendingIntent.getIntentSender());
安装拦截
installPackagesLI方法中
diff --git a/alps/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/alps/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index 49844d386e..d3e5e69afb 100644
--- a/alps/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/alps/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -17136,6 +17136,17 @@ public class PackageManagerService extends IPackageManager.Stub
request.installResult.installerPackageName = request.args.installerPackageName;
final String packageName = prepareResult.packageToScan.packageName;
+ Log.i("xunye", "packageName=="+packageName);
+ String appwhite = SystemProperties.get("ro.vendor.mediatek.xunye.appwhite");
+ Slog.e("xunye", "pms appwhite == " + appwhite);
+ if (!prepareResult.system && !TextUtils.isEmpty(appwhite)) {
+ if(appwhite.contains(packageName)){
+ Slog.e("xunye", "PMS app white exist continue");
+ }else{
+ Slog.e("xunye", "PMS app white no exist return");
+ //return;
+ }
+ }
prepareResults.put(packageName, prepareResult);
installResults.put(packageName, request.installResult);
installArgs.put(packageName, request.args);
权限问题
AndroidManifest.xml权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.REBOOT" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.DELETE_PACKAGES" />
<uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
<uses-permission android:name="android.permission.MANAGE_APP_OPS_MODES" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" />
编译到系统priv-app下面要修改
frameworks/base/data/etc/privapp-permissions-platform.xml
增加
+ <privapp-permissions package="xxxxxxxx">
+ <permission name="android.permission.REBOOT"/>
+ <permission name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+ <permission name="android.permission.READ_EXTERNAL_STORAGE"/>
+ <permission name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
+ <permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
+ <permission name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+ <permission name="android.permission.INSTALL_PACKAGES"/>
+ <permission name="android.permission.DELETE_PACKAGES"/>
+ <permission name="android.permission.READ_INSTALL_SESSIONS"/>
+ <permission name="android.permission.MANAGE_APP_OPS_MODES"/>
+ <permission name="android.permission.PACKAGE_USAGE_STATS"/>
+
+ </privapp-permissions>
MK文件
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Silenceinstall
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#这里是编译到priv-app下面
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)