Android高通 12/13静默安装和卸载

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.java

Package 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 {
            @Override
            public 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高通 12/13静默安装和卸载-CSDN博客,谢谢!

参考文章:

Android 包管理机制---PackageInstaller - 简书

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值