¿Cómo hacer que Alarm Manager funcione cuando Android 6.0 está en modo Doze?

Soy desarrollador de dos aplicaciones de despertador en Google Play. Estoy tratando de que funcionen con Android 6.0. Sin embargo, el modo Doze hace que no suenen. Los puse en la lista blanca, puse un icono de notificación en primer plano, no estoy seguro de qué más puedo hacer: cuando estoy en modo Doze, las alarmas del Administrador de alarmas aún se ignoran. Sin embargo, la aplicación Reloj (que es una aplicación Google Play en lugar de AOSP) es diferente. Cuando la alarma está habilitada en la aplicación Reloj, "adb deviceidle step" siempre leerá "activo" y nunca "inactivo", "inactivo_pending" o cualquier otra cosa.

¿Está Android haciendo trampa aquí, dando a su propia aplicación más poder, también conocido como? "tirando de una manzana"? ¿Todas las aplicaciones de despertador en Google Play están a punto de dejar de funcionar? Un poco preocupado aquí, estas son aplicaciones de calidad que cada una tomó un año de tiempo de desarrollo a tiempo parcial, y son grandes fuentes de ingresos para mí. Cualquier pista sobre cómo podría hacer que esto funcione sería de gran ayuda.

Establecer la intención del AlarmManager:

        Intent intent = new Intent(context, ReceiverAlarm.class);
        if (android.os.Build.VERSION.SDK_INT >= 16) {
            intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        }
        amSender = PendingIntent.getBroadcast(context, 1, intent, PendingIntent.FLAG_CANCEL_CURRENT); //FLAG_CANCEL_CURRENT seems to be required to prevent a bug where the intent doesn't fire after app reinstall in KitKat
        am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, scheduleToTime+1, amSender);

y la clase ReceiverAlarm:

public class ReceiverAlarm extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
    if (wakeLock == null) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle);
        wakeLock.acquire();
    }
    X.alarmMaster.startRingingAlarm(true);
}

y las partes relevantes del método X.alarmMaster.startRingingAlarm ():

    if (wakeLock == null) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, Theme.appTitle);
        wakeLock.acquire();
    }

    if (screenWakeLock == null) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        screenWakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, Theme.appTitle+" scr");
        screenWakeLock.acquire();
    }

    Intent alarmIntent = new Intent(Intent.ACTION_VIEW);
    alarmIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    alarmIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    alarmIntent.setClass(context, ActivityAlarmAlarm.class);

    context.startActivity(alarmIntent);

Algunos de los métodos se han pegado en línea para facilitar la lectura.

Respuestas a la pregunta(2)

Su respuesta a la pregunta