Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

优化需求:更安全的卸载系统应用的方式,动态的设置应用的安装状态 #8

Open
neoblackxt opened this issue Jul 20, 2019 · 0 comments
Labels
enhancement New feature or request

Comments

@neoblackxt
Copy link
Owner

动态设置的好处在于,模块本身故障时,其对系统的修改也随之消失或是自动还原,是一种失效安全机制。

在MIUI系统的services.jar中:

package com.android.server.pm;
public class PackageManagerServiceInjector {
//...
    public static void checkPackageInstallerStatus(PackageManagerService pms, Settings curPkgSettings) {
        if (VERSION.SDK_INT >= 23 && !Build.IS_INTERNATIONAL_BUILD && !Build.IS_TABLET) {
            PackageSetting miuiInstaller = (PackageSetting) curPkgSettings.mPackages.get(MIUI_INSTALLER_PACKAGE);
            PackageSetting googleInstaller = (PackageSetting) curPkgSettings.mPackages.get(PACKAGE_INSTALLER_NAME);
            PackageSetting androidInstaller = (PackageSetting) curPkgSettings.mPackages.get("com.android.packageinstaller");
            boolean isCtsBuild = AppOpsUtils.isXOptMode();
            if (isCtsBuild) {
                if (miuiInstaller != null) {
                    miuiInstaller.setInstalled(!isCtsBuild, 0);
                }
                mMiuiInstallerPackageSetting = (PackageSetting) curPkgSettings.mPackages.get(MIUI_INSTALLER_PACKAGE);
                mMiuiInstallerPackage = (Package) pms.mPackages.get(MIUI_INSTALLER_PACKAGE);
                curPkgSettings.mPackages.remove(MIUI_INSTALLER_PACKAGE);
                if (curPkgSettings.isDisabledSystemPackageLPr(MIUI_INSTALLER_PACKAGE)) {
                    curPkgSettings.removeDisabledSystemPackageLPw(MIUI_INSTALLER_PACKAGE);
                }
                pms.mPackages.remove(MIUI_INSTALLER_PACKAGE);
            } else {
                if (mMiuiInstallerPackageSetting != null) {
                    mMiuiInstallerPackageSetting.setInstalled(!isCtsBuild, 0);
                    curPkgSettings.mPackages.put(MIUI_INSTALLER_PACKAGE, mMiuiInstallerPackageSetting);
                    if ((mMiuiInstallerPackageSetting.pkgFlags & 128) != 0) {
                        curPkgSettings.disableSystemPackageLPw(MIUI_INSTALLER_PACKAGE, true);
                    }
                }
                if (mMiuiInstallerPackage != null) {
                    pms.mPackages.put(MIUI_INSTALLER_PACKAGE, mMiuiInstallerPackage);
                }
            }
            if (googleInstaller != null) {
                googleInstaller.setInstalled(isCtsBuild, 0);
            }
            if (androidInstaller != null) {
                androidInstaller.setInstalled(isCtsBuild, 0);
            }
        }
    }
//...
}

可以仿照这个思路动态的设置一个包的安装状态,上面代码伴随持久化过程,不可直接利用。
可以考虑拦截掉相关持久化过程。在读取包安装状态时注入自定义包安装配置。
做这些之前必须详细弄清楚包安装状态的完整处理流程。

@neoblackxt neoblackxt added the enhancement New feature or request label Jul 20, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

1 participant