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:
- Öffnen Sie Android Studio, klicken Sie auf Datei > Öffnen und wählen Sie ein Projekt aus.
Klicken Sie in der Menüleiste auf Build > Analyze (APK).
Wählen Sie das APK aus, das Sie analysieren möchten.
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 Ordnerlib
vorhanden sind, verwendet Ihre Anwendung keinen nativen Code.
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:
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()
odersysconf(_SC_PAGESIZE)
.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:
- Verwende Sepia mit einer Seitengröße von 16 KB auf ARM64
- Simulieren Sie Tintenfisch mit einer Seitengröße von 16 KB auf x86–64
- Flash-Version von Pixel 6 und Pixel 6 Pro mit Unterstützung für Seitengröße von 16 KB