Seitengrößen von 16 KB werden unterstützt

In der Vergangenheit wurden bei Android nur Seiten mit einer Größe von 4 KB unterstützt. Dadurch wurde die Systemspeicherleistung für die durchschnittliche Gesamtarbeitsspeichergröße von Android-Geräten optimiert.

Da Gerätehersteller jedoch auch weiterhin Geräte mit mehr physischem Arbeitsspeicher (RAM) entwickeln, werden viele dieser Geräte wahrscheinlich mit Seitengrößen von 16 KB (und schließlich auch mit mehr Seiten) konfiguriert, um die Geräteleistung zu optimieren. Wir gehen davon aus, dass die Gerätehersteller die Leistung auf zukünftigen 16-KB-Geräten genau wie auf 4-KB-Geräten weiter optimieren werden. Wenn Sie die Unterstützung für 16-KB-Geräte hinzufügen, kann Ihre App auf diesen Geräten ausgeführt werden und Ihre App profitiert von den damit verbundenen Leistungsverbesserungen.

Vorteile und Leistungssteigerungen

Geräte, die mit einer Seitengröße von 16 KB konfiguriert wurden, benötigen im Durchschnitt etwas mehr Arbeitsspeicher, erzielen aber auch verschiedene Leistungsverbesserungen für das System und die Anwendungen:

  • Kürzere App-Startzeiten bei unter hoher Speicherauslastung: durchschnittlich 3% weniger
  • Geringerer Stromverbrauch beim Start der App: durchschnittlich 4,56% weniger
  • Schnellerer Start der Kamera: 4,48% schnellere Heißstarts im Durchschnitt und 6,60% schnellere Kaltstarts im Durchschnitt
  • Verbesserte Systemstartzeit: durchschnittlich um 1,5% (ungefähr 0,8 Sekunden) verbessert

Diese Verbesserungen basieren auf unseren ersten Tests und die Ergebnisse auf tatsächlichen Geräten werden wahrscheinlich abweichen. Im Verlauf der Tests werden wir zusätzliche Analysen möglicher Vorteile für Apps bereitstellen.

Prüfen, ob Ihre App betroffen ist

Wenn Ihre App nativen Code verwendet, sollten Sie sie mit Unterstützung für Geräte mit 16 KB neu erstellen. Wenn Sie sich nicht sicher sind, ob Ihre App nativen Code verwendet, können Sie mit APK Analyzer feststellen, ob nativer Code vorhanden ist.

Wenn Ihre App nur Code verwendet, der in der Programmiersprache Java oder in Kotlin geschrieben ist (einschließlich aller Bibliotheken oder SDKs), unterstützt sie bereits 16-KB-Geräte. Trotzdem empfehlen wir Ihnen, Ihre Anwendung in einer 16 KB-Umgebung zu testen, um sicherzustellen, dass es keine unerwarteten Regressionen beim Verhalten der App gibt.

Verwendet Ihre App nativen Code?

Ihre App verwendet nativen Code, wenn einer der folgenden Punkte zutrifft:

  • Ihre Anwendung verwendet beliebigen (nativen) C-/C++-Code. Wenn Ihre App das Android-NDK verwendet, verwendet sie nativen Code.
  • Ihre App ist mit nativen Bibliotheken von Drittanbietern verknüpft.
  • Ihre App wurde von einem Drittanbieter-App-Builder erstellt, der native Bibliotheken auf dem Gerät verwendet.

Native Bibliotheken mit APK Analyzer identifizieren

APK Analyzer ist ein Tool, mit dem Sie verschiedene Aspekte eines erstellten APKs bewerten können. So ermitteln Sie, ob Ihre App nativen Code oder Bibliotheken verwendet:

  1. Öffnen Sie Android Studio, klicken Sie auf Datei > Öffnen und wählen Sie ein Projekt aus.
  2. Klicken Sie in der Menüleiste auf Build > Analyze (APK).

    Menüoption für Studio-Build,
um APK Analyzer zu starten

  3. Wählen Sie das APK aus, das Sie analysieren möchten.

  4. Sehen Sie im Ordner lib nach, in dem freigegebene Objektdateien (.so) gehostet werden, sofern vorhanden. Wenn freigegebene Objektdateien vorhanden sind, verwendet Ihre Anwendung nativen Code. Wenn keine gemeinsam genutzten Objektdateien oder kein Ordner lib vorhanden sind, verwendet Ihre Anwendung keinen nativen Code.

    APK Analyzer-Ansicht, die zeigt, dass Dateien mit gemeinsam genutzten Objekten vorhanden sind

App mit Unterstützung für 16-KB-Geräte erstellen

Zur Unterstützung von 16 KB-Geräten sollten Apps, die nativen Code verwenden, die in den folgenden Abschnitten beschriebenen Schritte ausführen.

Auf AGP-Version 8.3 oder höher aktualisieren

Geräte mit 16 KB erfordern Apps, die mit unkomprimierten gemeinsam genutzten Bibliotheken ausgeliefert werden, um sie an einer 16 KB zip-optimierten Grenze auszurichten. Dazu müssen Sie ein Upgrade auf Version 8.3 oder höher des Android Gradle-Plug-ins (AGP) durchführen. Weitere Informationen zum Upgradeprozess finden Sie im Abschnitt Upgrade Assistant für das Android-Gradle-Plug-in.

Wir empfehlen die Verwendung unkomprimierter gemeinsam genutzter Bibliotheken. Wenn Sie jedoch kein Upgrade von AGP auf Version 8.3 oder höher durchführen können, können Sie stattdessen zu komprimierten gemeinsam genutzten Bibliotheken wechseln. Aktualisieren Sie Ihre Gradle-Konfiguration, damit Gradle die gemeinsam genutzten Bibliotheken beim Packen Ihrer App komprimiert, um Probleme bei der App-Installation mit nicht ausgerichteten gemeinsam genutzten Bibliotheken zu vermeiden.

Groovig

Fügen Sie in der Datei build.gradle die folgende Option hinzu:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging true
      }
  }
}

Kotlin

Fügen Sie in der Datei build.gradle.kts die folgende Option hinzu:

android {
  ...
  packagingOptions {
      jniLibs {
        useLegacyPackaging = true
      }
  }
}

App mit 16 KB ELF-Ausrichtung kompilieren

Bei 16-KB-Geräten müssen die ELF-Segmente der gemeinsam genutzten Bibliothek korrekt mit einer 16-KB-ELF-Ausrichtung ausgerichtet sein, damit Ihre App ausgeführt werden kann. Wenn Sie Ihre App mit 16 KB ELF-Ausrichtung kompilieren möchten, führen Sie die Schritte in einem der folgenden Abschnitte aus, je nachdem, welche Version des verwendeten Android-NDK Sie verwenden.

Android NDK r26 und niedriger

Wenn du die Kompilierung von 16 KB-basierten freigegebenen Bibliotheken mit Android NDK Version r26 oder niedriger unterstützen möchtest, musst du deine ndk-build- oder cmake-Konfiguration so aktualisieren:

NDK-Build

Aktualisieren Sie Android.mk, um die 16-KB-ELF-Ausrichtung zu aktivieren:

LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"

CMake

Aktualisieren Sie CMakeLists.txt, um die 16-KB-ELF-Ausrichtung zu aktivieren:

target_link_options(${CMAKE_PROJECT_NAME} PRIVATE "-Wl,-z,max-page-size=16384")

Android NDK r27 und höher

NDK-Build

Im Application.mk:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Groovig

Legen Sie in der Datei build.gradle das Argument -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON fest:

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
      }
    }
  }
}

Kotlin

Legen Sie in der Datei build.gradle.kts das Argument -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON fest:

android {
  ...
  defaultConfig {
    ...
    // This block is different from the one you use to link Gradle
    // to your CMake or ndk-build script.
    externalNativeBuild {
      // For ndk-build, instead use the ndkBuild block.
      cmake {
        // Passes optional arguments to CMake.
        arguments += listOf("-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON")
      }
    }
  }
}

Andere Build-Systeme

Geben Sie die folgenden Verknüpfungs-Flags an:

-Wl,-z,max-page-size=16384

Codeinstanzen suchen, die auf bestimmte Seitengrößen verweisen

Auch wenn Ihre App auf 16 KB ausgerichtet ist, können Fehler auftreten, wenn Stellen im Code davon ausgehen, dass ein Gerät eine bestimmte Seitengröße verwendet. So vermeiden Sie dies:

  1. Entfernen Sie alle hartcodierten Abhängigkeiten, die auf die PAGE_SIZE-Konstante oder auf Instanzen in der Codelogik verweisen, die davon ausgehen, dass die Seitengröße eines Geräts 4 KB (4096) beträgt.

    Verwende stattdessen getpagesize() oder sysconf(_SC_PAGESIZE).

  2. Suchen Sie nach Verwendungen von mmap() und anderen APIs, die auf Seiten ausgerichtete Argumente erfordern, und ersetzen Sie sie bei Bedarf durch Alternativen.

App in einer 16 KB-Umgebung testen

Nachdem Sie Ihre App so erstellt haben, dass sie 16 KB-Geräte unterstützt, sollten Sie Ihre App in einer 16 KB-Umgebung testen, um festzustellen, ob in Ihrer App Regressionen auftreten. Verwenden Sie dazu eine der folgenden Testumgebungen: