Как программно удалить системные приложения после Android O? - PullRequest
1 голос
/ 05 мая 2019

Я создаю приложение, которое может удалять системные приложения.Пройдя все ответы от StackOverFlow, я могу сказать, что 99% из них - через ADB, и тот, который я нашел полезным https://stackoverflow.com/a/34399068/9953518, теперь изменился с Android O.

СогласноВ этой статье https://medium.com/@quaful/the-changes-of-apk-install-location-since-android-oreo-e646d1b53c4d теперь невозможно перейти к определенной папке приложения, и мы обязаны использовать .sourceDir.Проблема, с которой я столкнулся, заключается в том, что после запроса рута и получения sourceDir файл .apk не удаляется, и в этом случае полные файлы в этом случае не удаляются и не удаляются.Я использую код ниже:

//appsSelected is the array with all the package names of the system apps selected to be uninstalled
        case "uninstall":
            for (int i = 0; i < appsSelected.size(); ++i) {
                final int finalI = i;
                Thread worker = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        RootManager.getInstance().obtainPermission();
                        System.out.println("Public directory is  "+ yup(appsSelected.get(finalI)));
                        runCommand("rm -rf "+ yup(appsSelected.get(finalI)) );

                    }
                });
                worker.start();
            }

            break;

Это функция, которая возвращает filePath:

String yup(String pack){
    PackageManager m = getPackageManager();
    PackageInfo p = null;
    try {
        p = m.getPackageInfo(pack, 0);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    return p.applicationInfo.sourceDir;
}

Наконец функция, которая выполняет команды:

  public static void runCommand(String command) {
    try {
        Process chmod = Runtime.getRuntime().exec(command);

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(chmod.getInputStream()));
        int read;
        char[] buffer = new char[4096];
        StringBuffer output = new StringBuffer();
        while ((read = reader.read(buffer)) > 0) {
            output.append(buffer, 0, read);
        }
        reader.close();
        chmod.waitFor();
        String outputString = output.toString();
    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}

У меня есть разрешение root (команда "su") и все необходимые разрешения.

...