termux-app

Форк
0
115 строк · 6.0 Кб
1
package com.termux.shared.android;
2

3
import android.Manifest;
4
import android.content.Context;
5

6
import androidx.annotation.NonNull;
7
import androidx.annotation.Nullable;
8

9
import com.termux.shared.logger.Logger;
10
import com.termux.shared.shell.command.environment.AndroidShellEnvironment;
11
import com.termux.shared.shell.command.ExecutionCommand;
12
import com.termux.shared.shell.command.runner.app.AppShell;
13

14
/**
15
 * Utils for phantom processes added in android 12.
16
 *
17
 * https://github.com/termux/termux-app/issues/2366
18
 * https://issuetracker.google.com/u/1/issues/205156966#comment28
19
 * https://cs.android.com/android/_/android/platform/frameworks/base/+/09dcdad5
20
 * https://github.com/agnostic-apollo/Android-Docs/tree/master/ocs/apps/processes/phantom-cached-and-empty-processes.md
21
 */
22
public class PhantomProcessUtils {
23

24
    private static final String LOG_TAG = "PhantomProcessUtils";
25

26
    /**
27
     * If feature flag set to false, then will disable trimming of phantom process and processes using
28
     * excessive CPU. Flag is available on Pixel Android 12L beta 3 and Android 13. Availability on
29
     * other devices will depend on if other vendors merged the 09dcdad5 commit or not in their releases
30
     * and if they actually want to support the flag. Check {@link FeatureFlagUtils} javadocs for
31
     * more details.
32
     */
33
    public static final String FEATURE_FLAG_SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS = "settings_enable_monitor_phantom_procs";
34

35
    /**
36
     * Maximum number of allowed phantom processes. It is also used as the label for the currently
37
     * enforced ActivityManagerConstants MAX_PHANTOM_PROCESSES value in the `dumpsys activity settings`
38
     * output.
39
     *
40
     * https://cs.android.com/android/platform/superproject/+/android-12.0.0_r4:frameworks/base/services/core/java/com/android/server/am/ActivityManagerConstants.java;l=574
41
     * https://cs.android.com/android/platform/superproject/+/android-12.0.0_r4:frameworks/base/services/core/java/com/android/server/am/ActivityManagerConstants.java;l=172
42
     */
43
    public static final String KEY_MAX_PHANTOM_PROCESSES = "max_phantom_processes";
44

45
    /**
46
     * Whether or not syncs (bulk set operations) for DeviceConfig are disabled currently. The value
47
     * is boolean (1 or 0). The value '1' means that DeviceConfig#setProperties(DeviceConfig.Properties)
48
     * will return {@code false}.
49
     *
50
     * https://cs.android.com/android/platform/superproject/+/android-12.0.0_r4:frameworks/base/core/java/android/provider/DeviceConfig.java
51
     * https://cs.android.com/android/platform/superproject/+/android-12.0.0_r4:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java;l=1186
52
     * https://cs.android.com/android/platform/superproject/+/android-12.0.0_r4:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java;l=1142
53
     */
54
    public static final String SETTINGS_GLOBAL_DEVICE_CONFIG_SYNC_DISABLED = "device_config_sync_disabled";
55

56
    /**
57
     * Get {@link #FEATURE_FLAG_SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS} feature flag value.
58
     *
59
     * @param context The {@link Context} for operations.
60
     * @return Returns {@link FeatureFlagUtils.FeatureFlagValue}.
61
     */
62
    @NonNull
63
    public static FeatureFlagUtils.FeatureFlagValue getFeatureFlagMonitorPhantomProcsValueString(@NonNull Context context) {
64
        return FeatureFlagUtils.getFeatureFlagValueString(context, FEATURE_FLAG_SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS);
65
    }
66

67
    /**
68
     * Get currently enforced ActivityManagerConstants MAX_PHANTOM_PROCESSES value, defaults to 32.
69
     * Can be changed by modifying device config activity_manager namespace "max_phantom_processes" value.
70
     *
71
     * @param context The {@link Context} for operations.
72
     * @return Returns {@link Integer}.
73
     */
74
    @Nullable
75
    public static Integer getActivityManagerMaxPhantomProcesses(@NonNull Context context) {
76
        if (!PermissionUtils.checkPermissions(context, new String[]{Manifest.permission.DUMP, Manifest.permission.PACKAGE_USAGE_STATS})) {
77
            return null;
78
        }
79

80
        // Dumpsys logs the currently enforced MAX_PHANTOM_PROCESSES value and not the device config setting.
81
        String script = "/system/bin/dumpsys activity settings | /system/bin/grep -iE '^[\t ]+" + KEY_MAX_PHANTOM_PROCESSES + "=[0-9]+$' | /system/bin/cut -d = -f2";
82
        ExecutionCommand executionCommand = new ExecutionCommand(-1, "/system/bin/sh", null,
83
            script + "\n", "/", ExecutionCommand.Runner.APP_SHELL.getName(), true);
84
        executionCommand.commandLabel = " ActivityManager " + KEY_MAX_PHANTOM_PROCESSES + " Command";
85
        executionCommand.backgroundCustomLogLevel = Logger.LOG_LEVEL_OFF;
86
        AppShell appShell = AppShell.execute(context, executionCommand, null, new AndroidShellEnvironment(), null, true);
87
        boolean stderrSet = !executionCommand.resultData.stderr.toString().isEmpty();
88
        if (appShell == null || !executionCommand.isSuccessful() || executionCommand.resultData.exitCode != 0 || stderrSet) {
89
            Logger.logErrorExtended(LOG_TAG, executionCommand.toString());
90
            return null;
91
        }
92

93
        try {
94
            return Integer.parseInt(executionCommand.resultData.stdout.toString().trim());
95
        } catch (NumberFormatException e) {
96
            Logger.logStackTraceWithMessage(LOG_TAG, "The " + executionCommand.commandLabel + " did not return a valid integer", e);
97
            Logger.logErrorExtended(LOG_TAG, executionCommand.toString());
98
        }
99

100
        return null;
101
    }
102

103
    /**
104
     * Get {@link #SETTINGS_GLOBAL_DEVICE_CONFIG_SYNC_DISABLED} settings value.
105
     *
106
     * @param context The {@link Context} for operations.
107
     * @return Returns {@link Integer}.
108
     */
109
    @Nullable
110
    public static Integer getSettingsGlobalDeviceConfigSyncDisabled(@NonNull Context context) {
111
        return (Integer) SettingsProviderUtils.getSettingsValue(context, SettingsProviderUtils.SettingNamespace.GLOBAL,
112
            SettingsProviderUtils.SettingType.INT, SETTINGS_GLOBAL_DEVICE_CONFIG_SYNC_DISABLED, null);
113
    }
114

115
}
116

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.