Seitengrößen von 16 KB werden unterstützt

Bisher wurden in Android nur Seitengrößen von 4 KB unterstützt, eine optimierte Systemspeicherleistung für die durchschnittliche In der Regel gab es Android-Geräte. Ab Android 15 unterstützt AOSP Geräte, die für die Verwendung einer Seitengröße von 16 KB (16 KB) konfiguriert sind Geräte). Wenn Ihre App NDK-Bibliotheken verwendet, können Sie entweder direkt oder indirekt über ein SDK, müssen Sie Ihre App die auf diesen 16-KB-Geräten funktionieren.

Da Gerätehersteller immer mehr Geräte entwickeln, physischen Arbeitsspeicher (RAM), verwenden viele dieser Geräte 16 KB (und größer werden), um die Leistung des Geräts zu optimieren. Wird hinzugefügt wird die Unterstützung für Geräte mit einer Seitengröße von 16 KB ermöglicht, Geräte und unterstützt Ihre App dabei, von der damit verbundenen Leistung Verbesserungen. Ohne Neukompilierung funktionieren Apps auf Geräten mit 16 KB möglicherweise nicht wenn sie in zukünftigen Android-Versionen produktionsreif sind.

Damit Sie Unterstützung für Ihre App hinzufügen können, haben wir eine Anleitung zur Überprüfung der falls Ihre App betroffen ist, Ihre App neu zu erstellen (falls zutreffend) und wie Sie Ihre App eine 16 KB-Umgebung mit Emulatoren (einschließlich Android 15) System-Images für den Android-Emulator).

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 Speicherauslastung – im Durchschnitt um 3,16 % niedriger, mit größeren Verbesserungen (bis zu 30%) für einige getestete Apps
  • 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 neu erstellen, sodass sie 16-KB-Geräte unterstützt. Wenn Sie sich nicht sicher sind, ob Ihre App nativen Code verwendet, können Sie mithilfe des APK Analyzer ermitteln, 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 Anwendung gibt.

Verwendet Ihre App nativen Code?

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

  • Ihre App verwendet beliebigen (nativen) C/C++ Code. Wenn Ihre App das Android-Betriebssystem NDK enthält, verwendet Ihre App nativen Code.
  • Ihre App ist mit nativen Bibliotheken oder Abhängigkeiten von Drittanbietern verknüpft, die verwenden können.
  • Ihre App wurde von einem Drittanbieter-App-Builder erstellt, der native Bibliotheken auf .

Native Bibliotheken mit APK Analyzer identifizieren

APK Analyzer ist ein Tool, mit dem Sie verschiedene Aspekte einer erstellten APK Wenn Sie herausfinden möchten, ob in Ihrer App nativer Code oder native Bibliotheken verwendet werden, folgen Sie diesen Schritte:

  1. Öffne Android Studio und klicke dann auf Datei > Öffnen und wählen Sie ein Projekt aus.
  2. Klicken Sie in der Menüleiste auf Build > APK analysieren...

    Menüoption zum Starten des APK in Studio-Build
Analysegerät

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

  4. Suchen Sie im Ordner lib, in dem Dateien mit gemeinsam genutzten Objekten (.so) gehostet werden (falls vorhanden). vorhanden sind. Sind gemeinsam genutzte Objektdateien vorhanden, verwendet Ihre App native Code. Wenn keine gemeinsam genutzten Objektdateien oder kein Ordner lib vorhanden ist, verwendet Ihre App keinen nativen Code.

    APK Analyzer-Ansicht, die zeigt, dass gemeinsam genutzte Objektdateien
heute

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

Zur Unterstützung von Geräten mit 16 KB müssen Apps, die nativen Code verwenden, die die in den folgenden Abschnitten beschrieben werden.

Paketerstellung geteilter Bibliotheken aktualisieren

Wir empfehlen ein Upgrade auf AGP 8.3 oder höher und die Verwendung einer unkomprimierten gemeinsam genutzten Bibliotheken.

AGP-Version 8.3 oder höher

Auf Geräten mit 16 KB sind Apps erforderlich, die mit unkomprimierten gemeinsam genutzten Bibliotheken ausgeliefert werden, sie an einer 16 KB großen Zip-Ausrichtungsgrenze ausrichten. Dazu müssen Sie ein Upgrade Android Gradle Plugin (AGP) ab Version 8.3. Weitere Informationen finden Sie in der Android-App Abschnitt „Upgrade Assistant“ für das Gradle-Plug-in.

AGP 8.2 oder niedriger

Wenn ein Upgrade von AGP nicht auf Version 8.3 oder höher möglich ist, können Sie um komprimierte gemeinsam genutzte Bibliotheken zu verwenden. Aktualisieren Sie Ihre Gradle-Konfiguration auf Lassen Sie Gradle Ihre gemeinsam genutzten Bibliotheken beim Erstellen eines App-Pakets komprimieren, um Apps zu vermeiden. Installationsprobleme bei nicht ausgerichteten gemeinsam genutzten Bibliotheken.

Cool

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

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

Kotlin

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

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

App mit 16-KB-ELF-Ausrichtung kompilieren

Auf Geräten mit 16 KB ist die ELF: Angleichende Segmente ELF mit 16 KB richtig ausgerichtet, damit Ihre App ausgeführt werden kann.

Wenn Sie Ihre App mit einem 16-KB-ELF-Abgleich kompilieren möchten, führen Sie die Schritte in einem der je nach Version des Android-NDK, die Sie verwenden, verwenden.

Android NDK r26 und niedriger

Kompilierung von 16 KB ausgerichteten gemeinsam genutzten Bibliotheken mit Android NDK Version r26 oder niedriger, müssen Sie Ihr ndk-build oder cmake aktualisieren wie folgt konfigurieren:

NK-Build

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

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

CMake

Aktualisieren Sie Ihre CMakeLists.txt, um eine 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

Kompilierung von 16 KB ausgerichteten gemeinsam genutzten Bibliotheken mit Android NDK Version r27 und höher müssen Sie Ihr ndk-build, build.gradle, build.gradle.kts- oder Verknüpfungs-Flags so:

Ndk-Build

In deinem Application.mk:

APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true

Cool

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

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 fest. -DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON:

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

Nach Codeinstanzen suchen, die auf bestimmte Seitengrößen verweisen

Selbst wenn Ihre App auf 16 KB ausgerichtet ist, können Fehler auftreten, in Ihrem Code wird davon ausgegangen, dass ein Gerät eine bestimmte Seitengröße verwendet. Um dies zu vermeiden, führen Sie die folgenden Schritte aus:

  1. Entfernen Sie alle hartcodierten Abhängigkeiten, die auf den PAGE_SIZE verweisen. oder Instanzen in Ihrer Codelogik, die davon ausgehen, dass die Seite eines Geräts beträgt 4 KB (4096).

    Verwenden Sie stattdessen getpagesize() oder sysconf(_SC_PAGESIZE).

  2. Suchen Sie nach Verwendungen von mmap() und anderen APIs, die eine seitenbasierte Ausrichtung erfordern. und ggf. durch Alternativen ersetzen.

Wenn Ihre App PAGE_SIZE als praktischen Wert verwendet, der nicht an die zugrunde liegende Seitengröße gebunden ist, funktioniert Ihre App nicht bei Verwendung im 16-KB-Modus. Wenn dieser Wert jedoch an den Kernel übergeben wird, mit mmap ohne MAP_FIXED verwendet der Kernel trotzdem eine ganze Seite, verschwendet etwas Gedächtnis. Aus diesen Gründen ist PAGE_SIZE nicht definiert, wenn 16 KB groß ist ab NDK r27 aktiviert.

Wenn deine App PAGE_SIZE auf diese Weise verwendet und diesen Wert niemals direkt an im Kernel ausführen, erstellen Sie dann statt PAGE_SIZE eine neue Variable mit einem neuen Namen, um darauf hinzuweisen, dass er für andere Zwecke verwendet wird und keinen echten Seite „Informationen merken“.

App in einer 16 KB-Umgebung testen

Nachdem Sie Ihre App für Geräte mit 16 KB erstellt haben, Ihre App in einer 16 KB-Umgebung testen, um zu sehen, ob sie Regressionen überprüfen. Gehen Sie hierzu folgendermaßen vor:

  1. Richten Sie das Android 15 SDK ein.

  2. Richten Sie eine der folgenden Testumgebungen ein:

  3. Starten Sie Ihr Testgerät und prüfen Sie mit dem folgenden Befehl, eine 16-KB-Umgebung verwendet wird:

    adb shell getconf PAGE_SIZE
    

    Der Befehl sollte den Wert 16384 zurückgeben.

  4. Prüfen Sie bei allen geteilten Fotogalerien, ob diese ELF-Segmente sind mit einer 16-KB-ELF-Ausrichtung korrekt ausgerichtet. Mit diesem Skript können Sie Hilfe bei diesem Prozess:

    #!/bin/bash
    
    # usage: alignment.sh path to search for *.so files
    
    dir="$1"
    
    RED="\e[31m"
    GREEN="\e[32m"
    ENDCOLOR="\e[0m"
    
    matches="$(find $dir -name "*.so" -type f)"
    IFS=$'\n'
    for match in $matches; do
      res="$(objdump -p ${match} | grep LOAD | awk '{ print $NF }' | head -1)"
      if [[ $res =~ "2**14" ]] || [[ $res =~ "2**16" ]]; then
        echo -e "${match}: ${GREEN}ALIGNED${ENDCOLOR} ($res)"
      else
        echo -e "${match}: ${RED}UNALIGNED${ENDCOLOR} ($res)"
      fi
    done
    
    1. Speichern Sie das Skript in einer Datei, z. B. alignment.sh.

    2. Extrahieren Sie die APK-Datei Ihrer App:

      unzip APK_NAME.apk -d /tmp/my_apk_out
      
    3. Skript für die extrahierten Dateien im /tmp/my_apk_out ausführen Verzeichnis:

      alignment.sh /tmp/my_apk_out | grep "arm64-v8a"
      

      Das Skript gibt entweder ALIGNED oder UNALIGNED für alle arm64-v8a gemeinsam genutzte Fotogalerien.

    4. Wenn es sich bei einer der arm64-v8a geteilten Fotogalerien um UNALIGNED handelt, müssen Sie Folgendes tun: aktualisieren Sie die Paketerstellung für diese Bibliotheken und kompilieren Sie Ihre App an und führen Sie den Test noch einmal durch. Folgen Sie dazu den Schritten in diesem Abschnitt.

  5. Führen Sie den folgenden zipalign-Befehl aus, um zu prüfen, ob Ihre Anwendung 16 KB ausgerichtet, wobei APK_NAME der Name der die APK-Datei Ihrer App:

    zipalign -c -P 16 -v 4 APK_NAME.apk
    
  6. Testen Sie Ihre App gründlich und konzentrieren Sie sich dabei auf alle Bereiche, die von Ändern von Codeinstanzen, die auf bestimmte Seitengrößen verweisen

Android-Emulator mit einem 16 KB-basierten Android 15-Systemimage einrichten

So richten Sie mit dem Android-Emulator eine 16-KB-Umgebung ein: Schritte:

  1. 16-KB-basierte Android 15-Emulator-System-Images sind kompatibel mit Android Studio Jellyfish | 2023.3.1 oder höher. Um das beste Ergebnis die Android 15-Betaversion bietet, laden Sie die neueste Version Vorschauversion von Android Studio.

    Du kannst deine bisherige Version von Android Studio installiert, da Sie mehrere Versionen nebeneinander installieren können.

  2. Klicken Sie in Android Studio auf Tools > SDK-Manager.

  3. Klicken Sie auf dem Tab SDK-Plattformen das Kästchen Paketdetails anzeigen an und maximieren Sie dann den Bereich. Android VanillaIceCream Preview (Vorschau von Android VanillaIceCream) und wählen Sie eine oder beide die folgenden Emulator-System-Images, abhängig von den virtuellen Geräten, die Sie erstellen möchten:

    • Google APIs Experimentelle 16k-Seitengröße ARM 64 v8a-Systembild
    • Google APIs Experimentelle 16k-Seitengröße Intel x86_64 Atom-System-Image

    16 KB Emulator-System-Images mit dem SDK Manager für Android herunterladen
Studio

  4. Klicken Sie auf Übernehmen > OK, um die ausgewählten System-Images herunterzuladen.

  5. Folgen Sie der Anleitung zum Einrichten eines virtuellen Geräts für Android 15 und geben Sie an, zur Auswahl eines System-Image aufgefordert werden, wählen Sie das 16 KB-System-Image aus, die Sie heruntergeladen haben. Falls sie nicht automatisch empfohlen wird, 16 KB Systembild auf dem Tab Andere Bilder

    Das 16-KB-Emulator-Image finden Sie unter "Andere Images".
Tabulatorzeichen