Hängende teilweise Wakelocks

Teil-Wakelocks sind ein Mechanismus im PowerManager-API mit der Entwickler die CPU auch nach dem Ausschalten des Displays eines Geräts weiterlaufen lassen können z. B. aufgrund einer Zeitüberschreitung des Systems oder durch Drücken der Ein/Aus-Taste. Ihr die App einen partiellen Wakelock durch Aufruf von acquire() mit dem PARTIAL_WAKE_LOCK . Ein partieller Wakelock wird zu stecken geblieben sein, wenn die Schaltfläche während des Ausführens der App im Hintergrund (für den Nutzer ist kein Teil Ihrer App sichtbar). Diese Erkrankung entlädt sich Der Akku des Geräts wird dadurch belastet, weil es verhindert, dass das Gerät in den Stromsparmodus wechselt. Bundesländer. Teil-Wakelocks sollten nur bei Bedarf verwendet und als sobald sie nicht mehr benötigt werden.

Wenn Ihre App einen hängenden Teil-Wakelock hat, können Sie sich an der Anleitung auf dieser Seite orientieren. um das Problem zu diagnostizieren und zu beheben.

Problem erkennen

Möglicherweise wissen Sie nicht immer, dass die Teil-Wakelocks Ihrer App hängen bleiben. Wenn Sie Ihre App bereits veröffentlicht haben, Android Vitals kann dir helfen, dich auf das Problem aufmerksam zu machen.

Android Vitals

Android Vitals kann dir dabei helfen, die Leistung deiner App zu verbessern, indem du über das Play Console, wenn Ihre App hängende Teil-Wakelocks auf. Android Vitals-Berichte zu partiellen Wakelocks als hängen geblieben ist, wenn mindestens eine Stunde, im Hintergrund, teilweise wird während einer Akkusitzung gesperrt.

Die Definition von Akkusitzung hängt von der Plattformversion ab.

  • In Android 10 ist eine Akkusitzung die Zusammenfassung aller Akkuberichte. innerhalb eines bestimmten Zeitraums von 24 Stunden empfangen werden. Ein Akkubericht bezieht sich auf zwischen zwei Akkuladungen, entweder von unter 20% bis über 80% oder von jedem Akkustand bis zu 100 % halten.
  • In Android 11 gilt eine Akkusitzung als fester Zeitraum von 24 Stunden.

Die Anzahl der angezeigten Akkusitzungen ist eine Summe für alle gemessenen Nutzer der App. Informationen dazu, wie Google Play Android Vitals-Daten erhebt, findest du unter die Play Console Dokumentation.

Wenn Sie wissen, dass Ihre App übermäßig viele hängende Teil-Wakelocks hat, besteht Ihr nächster Schritt darin, das Problem anzugehen.

Problem beheben

Wakelocks wurden in den frühen Versionen der Android-Plattform eingeführt, aber über werden viele Anwendungsfälle, für die bisher Wakelocks erforderlich waren, jetzt besser bedient. durch neuere APIs wie WorkManager.

Dieser Abschnitt enthält Tipps zur Behebung von Wakelocks. Langfristig Sie sollten Ihre App migrieren, um die Empfehlungen in den bestmöglichen Best Practices.

Identifizieren und korrigieren Sie Stellen in Ihrem Code, an denen ein Wakelock abgerufen wird, z. B. Aufrufe an newWakeLock(int, String) oder WakefulBroadcastReceiver abgeleiteten Klassen. Hier einige Tipps:

  • Wir empfehlen, den Namen Ihres Pakets, Ihrer Klasse oder Ihrer Methode in den Wakelock anzugeben. Tag-Name, damit Sie die Position in der Quelle leicht identifizieren können. wo der Wakelock erstellt wurde. Hier einige zusätzliche Tipps: <ph type="x-smartling-placeholder">
      </ph>
    • Lassen Sie alle personenidentifizierbaren Informationen im Namen weg, wie eine E-Mail-Adresse. Andernfalls protokolliert das Gerät _UNKNOWN anstelle des Wakelock-Namens.
    • Rufen Sie den Klassen- oder Methodennamen nicht programmatisch ab, z. B. durch getName() wird angerufen weil es von Proguard verschleiert werden könnte. Verwenden Sie stattdessen eine hartcodierte .
    • Fügen Sie keine Zähler oder eindeutige IDs zu Wakelock-Tags hinzu. Die Wakelocks, die vom selben Nutzer erstellt wurden, da sie alle eindeutige IDs haben.
  • Achten Sie darauf, dass Ihr Code alle abgerufenen Wakelocks freigibt. Dies ist etwas komplizierter, als dafür zu sorgen, acquire() gibt es einen entsprechenden Aufruf release() Hier ist ein Beispiel für einen Wakelock, der aufgrund eines nicht abgefangenen Wakelocks nicht freigegeben wird. Ausnahme:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            acquire()
            doSomethingThatThrows()
            release()  // does not run if an exception is thrown
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            wakeLock.acquire();
            doSomethingThatThrows();
            wakeLock.release();  // does not run if an exception is thrown
        }

    Hier ist die korrekte Version des Codes:

    Kotlin

    @Throws(MyException::class)
    fun doSomethingAndRelease() {
        wakeLock.apply {
            try {
                acquire()
                doSomethingThatThrows()
            } finally {
                release()
            }
        }
    }

    Java

        void doSomethingAndRelease() throws MyException {
            try {
                wakeLock.acquire();
                doSomethingThatThrows();
            } finally {
                wakeLock.release();
            }
        }
  • Achten Sie darauf, dass Wakelocks aufgehoben werden, sobald sie nicht mehr erforderlich. Wenn Sie z. B. einen Wakelock verwenden, um einen Hintergrund abgeschlossen werden soll, stellen Sie sicher, dass der Release erfolgt, wenn diese Aufgabe abgeschlossen ist. Wenn Wakelocks länger als erwartet gehalten werden, ohne freigegeben zu werden, kann bedeuten, dass die Hintergrundaufgabe länger dauert als erwartet.

Nachdem Sie das Problem im Code behoben haben, prüfen Sie, ob Ihre App den Ruhemodus korrekt auslöst. mit den folgenden Android-Tools:

  • dumpsys – ein Tool das Informationen zum Status von Systemdiensten auf einem Gerät liefert. Um den Status des Stromversorgungsdienstes anzusehen, einschließlich einer Liste von Ruhemodus sperren, führen Sie adb shell dumpsys power aus.

  • Battery Historian – ein ein Tool, das die Ausgabe eines Android-Fehlers parst in eine visuelle Darstellung der Ereignisse im Zusammenhang mit der Macht stehen.

Best Practices

Im Allgemeinen sollte Ihre App Teil-Wakelocks vermeiden, da es zu einfach ist, den Akku des Nutzers belastet. Android bietet alternative APIs für fast alle die zuvor einen partiellen Wakelock erforderten. Ein weiterer Anwendungsfall bei Teil-Wakelocks ist es, sicherzustellen, dass eine Musik-App weiter abgespielt wird, wenn der Bildschirm ist aus. Wenn Sie Wakelocks zum Ausführen von Aufgaben verwenden, beachten Sie die Alternativen, die im Leitfaden zur Hintergrundverarbeitung beschrieben werden.

Wenn Sie partielle Wakelocks verwenden müssen, folgen Sie diesen Empfehlungen:

  • Achten Sie darauf, dass ein Teil Ihrer App im Vordergrund bleibt. Beispiel: Wenn Sie einen Dienst ausführen müssen, starten Sie einen Vordergrund . Dieses zeigt dem Nutzer visuell an, dass Ihre App noch ausgeführt wird.
  • Achten Sie darauf, dass die Logik zum Abrufen und Freigeben von Wakelocks so einfach ist wie möglich. Wenn die Wakelock-Logik an komplexen Zustandsmaschinen gebunden ist, Zeitüberschreitungen, Executor-Pools und/oder Callback-Ereignisse, können kleine Fehler in diesen kann dazu führen, dass der Wakelock länger als erwartet gehalten wird. Diese Insekten sind schwer zu diagnostizieren und zu debuggen.