1、靜默安裝和靜默卸載
?涉及代碼路徑感興趣可以去看下如下所示,這里不作重點贅述哈
Package Manger
frameworks/base/services/java/com/android/server/pm/Settings.java
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/pm/IPackageManager.aidl
frameworks/base/services/java/com/android/server/pm/PackageSignatures.java
frameworks/base/services/java/com/android/server/pm/PreferredActivity.java
frameworks/services/java/com/android/server/PreferredComponent.java
frameworks/core/java/android/content/IntentFilter.java
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/services/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/app/IMediaContainerService.aidl
frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.javaPackage Installer
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java
2、靜默安裝apk 代碼
/*** 靜默安裝應用** @param path* @return*/public boolean installApp(String path) {PackageManager packageManager = mContext.getPackageManager();PackageInfo info = packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);ApplicationInfo appInfo = null;String pkgName = "";if (info != null) {appInfo = info.applicationInfo;pkgName = appInfo.packageName;}if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {try {PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller();PackageInstaller.SessionParams params = new PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL);if (!pkgName.equals("")) {params.setAppPackageName(pkgName);Method allowDowngrade = PackageInstaller.SessionParams.class.getMethod("setAllowDowngrade", boolean.class);allowDowngrade.setAccessible(true);allowDowngrade.invoke(params, true);int sessionId = packageInstaller.createSession(params);PackageInstaller.Session session = packageInstaller.openSession(sessionId);OutputStream os = session.openWrite(pkgName, 0, -1);InputStream is = new FileInputStream(path);byte[] buffer = new byte[1024];int len;while ((len = is.read(buffer)) != -1) {os.write(buffer, 0, len);}session.fsync(os);os.close();is.close();session.commit(PendingIntent.getBroadcast(mContext, sessionId,new Intent(Intent.ACTION_MAIN), FLAG_IMMUTABLE).getIntentSender());}} catch (Exception e) {e.printStackTrace();}}return true;}
3、靜默卸載 apk代碼
/*** 靜默卸載應用** @param path* @return*/public boolean uninstallApp(String path) {class InstallResultReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {}}Intent broadcastIntent = new Intent(mContext, InstallResultReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 1,broadcastIntent, FLAG_IMMUTABLE);PackageInstaller packageInstaller = mContext.getPackageManager().getPackageInstaller();packageInstaller.uninstall(path, pendingIntent.getIntentSender());return true;}
4、記得權限問題一般data/data???system/priv-app system/app等路徑?
5、apk調用代碼示例
/*** 靜默安裝(data/data 系統應用不能放在sdcard目錄安裝 會沖突 system/app or /system/priv-app)*/installApp("data/data/xxx.apk");/*** 靜默卸載*/uninstallApp("data/data/xxx.apk");
轉載請注明出處,謝謝!
參考文章:
Android 包管理機制---PackageInstaller - 簡書