Android6.0关于预置三方app卸载(二) 调用接口安装

来源:互联网 发布:淘宝网牛仔女装 编辑:程序博客网 时间:2024/06/16 05:54

之前的博客也分析过如何安装三方app,是在第一次开机时将system/third-app下面的apk文件copy到data/app下。这样apk卸载后,恢复出厂设置又能安装上。但是会低概率的出现有的app安装有问题,不知道什么原因,具体是应用启动的时候加载资源出了问题,后续我们再深入资源系统研究下,这里先给出一个临时方案。

就是模仿installPackageAsUser接口来安装应用,就是先copy apk到data/app下,然后再装载到PKMS中。


我们再PKMS的systemReady方法最后添加如下代码,第一次开机调用installThirdApps方法

        if(isFirstBoot()){           Log.v(TAG, "It's first boot, install the third apps");           installThirdApps();        }

installThirdApps,就是扫描system/third_app下的apk文件,调用startInstall安装

    private void installThirdApps(){        //the source directory not exists        File storeDir = new File("/system/third_app");        if(!storeDir.exists()){            Log.e(TAG,"/system/third_app is not exist");            return;        }        //get the apk files in /system/third_app        String apkDirFilesNames[] = storeDir.list();        if(apkDirFilesNames == null){            Log.e(TAG,"apk file name is null");            return;        }        for(int i = 0; i < apkDirFilesNames.length; i++){            File srcFileDir = new File("/system/third_app", apkDirFilesNames[i]);            Log.v(TAG,"srcFile=" + srcFileDir);            String srcFileNames[] = srcFileDir.list();            for(int j = 0; j < srcFileNames.length; j++) {                File srcFile = new File(srcFileDir, srcFileNames[j]);                startInstall(srcFile);            }        }    }
startInstall函数就是模仿installPackageAsUser接口,来发送msg_copy消息,将apk复制到data/app下面,然后开始装载apk到PKMS中。

    private void startInstall(File originFile) {        //String originPath = "/system/third_app/MOffice/MOffice.apk";        VerificationParams verificationParams = new VerificationParams(null,            null, null, VerificationParams.NO_UID, null);        int callingUid = UserHandle.getCallingUserId();        verificationParams.setInstallerUid(callingUid);        UserHandle user = new UserHandle(callingUid);                                //final File originFile = new File(originPath);        final OriginInfo origin = OriginInfo.fromUntrustedFile(originFile);        final Message msg_copy = mHandler.obtainMessage(INIT_COPY);        InstallParams installParams = new InstallParams(origin, null, null, 0, null,                null, verificationParams, user, null, null);        msg_copy.obj = installParams;        mHandler.sendMessage(msg_copy);    }




1 0