Оптимизация батареи (wakelocks) на Huawei EMUI 4.0+

Добрый день, ситуация:

Я разрабатываю приложение для Android, которое служит спортивным трекером / навигационным приложением, поэтому для него требуется постоянное подключение к GPS, а также постоянное бодрствующее устройство. Запись ведется каждую секунду.

Текущее решение, работающее годами, благодаря wakelocks тому, что устройство не спит.

Режим Doze в Android 6.0+ усложняет ситуацию, но это не так.

На аппарате Huawei наверное другой тип оптимизации.

Вот часть журнала:

10-10 10:33:18.462 1014-384 D/PFW.HwPFWAppWakeLockPolicy: getUidWakeLock uid: 10097 wakelock >= 10 mins 10-10 10:33:18.543 1014-384 D/PFW.HwPFWAppWakeLockPolicy: force stop abnormal wakelock app uid: 10097 10-10 10:33:18.558 1014-384 I/ActivityManager: Force stopping menion.android.locus appid=10097 user=0: from pid 1014

Так что после прибл. 30+ минут, система просто решает, что приложение использует слишком много wakelocks, и полностью завершает его со всеми службами, историей, просто kill.

Любой опыт с таким поведением и любые предложения, как лучше решить эту простую задачу (постоянная запись местоположения GPS при выключенном экране)?

Как я писал при запуске, на всех остальных устройствах, кроме нового Huawei, такая система исправно работает много лет.

РЕДАКТИРОВАТЬ: примечание после комментария одного пользователя (удалено?), приложение «белого списка» в диспетчере батарей Huawei (помечено как «защищенное приложение») не влияет на эту проблему.


person Menion Asamm    schedule 10.10.2016    source источник


Ответы (2)


Есть два системных приложения Huawei, которые могут убивать пользовательские приложения для экономии заряда батареи:

  • SystemManager (com.huawei.systemmanager) удаляет все приложения, которые все еще работают после выключения экрана, если они не находятся в списке «Защищенных приложений».
  • PowerGenie (com.huawei.powergenie) убивает все приложения, которые длительное время удерживают блокировку пробуждения.

Похоже, ваше приложение убивает PowerGenie. Вы можете избежать этого, воспользовавшись жестко запрограммированным белым списком тегов блокировки пробуждения PowerGenie. Например, если тег блокировки пробуждения - «LocationManagerService», он будет проигнорирован PowerGenie, потому что системная служба содержит блокировку пробуждения с тем же тегом, и PowerGenie внесла ее в белый список.

person akwizgran    schedule 01.11.2017
comment
Я немного исследовал и пробовал использовать свое приложение, используя эту логику. Я работал над решением для бесконечного приложения службы определения местоположения. У меня есть все, чтобы приложение работало, но единственная проблема - устройства Huawei и Xiaomi (и только версия 6.0 для Android). Я попробовал, и бинго. Принудительное закрытие Power Engine, и мое приложение работает на устройствах Huawei 6.0. Таким образом, обходной путь состоит в том, чтобы каким-то образом сделать приложение Power Engine в белом списке (не знаю, как в настоящее время, но, по крайней мере, проблема теперь ясна) Большое спасибо @akwizgran - person Jose Jet; 20.03.2018
comment
Оно работает! Я указал тег блокировки пробуждения как LocationManagerService - person Oleg A; 06.09.2018
comment
Могу я спросить, что вы подразумеваете под указанием тега блокировки пробуждения? - person rosu alin; 04.04.2019
comment
@OlegA И вы используете PARTIAL_WAKE_LOCK в качестве флага пробуждения? - person rosu alin; 04.04.2019
comment
@rosualin Ага, я использую PowerManager.PARTIAL_WAKE_LOCK - person Oleg A; 05.04.2019
comment
это все еще убивает мой gps через некоторое время на mate 10 pro :( - person rosu alin; 05.04.2019
comment
@rosualin тег является вторым аргументом для newWakeLock (). - person akwizgran; 05.04.2019
comment
@rosualin некоторые менеджеры питания специально ищут приложения, использующие GPS. В качестве эксперимента вы можете попробовать отключить функцию GPS в своем приложении, но сохранить блокировку пробуждения, а затем запустить ее в ночное время на тестовом устройстве. Если его не убивают, то диспетчер питания возражает против GPS, а не от блокировки включения. - person akwizgran; 06.04.2019

Вы пробовали установить будильник, который регулярно запускает WakeLock, а затем повторно активирует его через пару секунд? Если проблема в том, что Android Huawei не любит злоупотребление Wakelocks, может быть, они в порядке, если вы время от времени выпускаете его? Например: я полагаю, у вас будет фоновый процесс, работающий на переднем плане. Если это так, вставьте в onStartCommand:

setupWakeupAlarm(context);

где метод определяется как:

private static void setupWakeupAlarm(Context context) {
    AlarmManager mWakeUpAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent mWakeUpAlarmIntent;
    Intent serviceIntent;
    serviceIntent = new Intent(context, SSAlarmReceiver.class);
    mWakeUpAlarmIntent = PendingIntent.getBroadcast(context, 0, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    // every 5 minutes 
    mWakeUpAlarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            SystemClock.elapsedRealtime() + WAKEUP_ALARM_FREQUENCY, mWakeUpAlarmIntent);
    Log.d("TAG", "wakup alarm set up or reset!");
}

и где получатель - это локальный класс:

static public class SSAlarmReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(final Context context, Intent intent) {
        setupWakeupAlarm(context);
        mBackgroundService.stopForeground(true);
        if (mWakeLock.isHeld())
            mWakeLock.release();
        new Timer().schedule(
                new TimerTask() {
                    @Override
                    public void run() {
                        mWakeLock.acquire();
                        mBackgroundService.startForeground(mNotificationId, mNotification.getNotification());
                        }
                },
                3000
        );
    }
}

Обратите внимание, что в моем случае у меня также была фоновая служба, работающая на переднем плане, и я решил остановить ее. Не уверен, что это необходимо.

Риск, конечно, заключается в том, что через 3 секунды Wakelock не активен, ваш процесс может быть убит.

person FabioC    schedule 11.02.2017