Android VNDK/VSDK Snapshot-Kompilierungsframework

1. Hintergrund

Hintergrund eins:

Um das Problem der Fragmentierung der Android-Version zu lösen, wird die Treble-Architektur eingeführt, die eine stabile neue SoC-Lieferantenschnittstelle bereitstellt, und die HAL-Schnittstellendefinitionssprache (HIDL/Stable AIDL, der Technologie-Stack ist immer noch Binder), die den Anbieter angibt HAL- und System-Framework-Schnittstelle, Entkopplung von System-Framework und Vendor-HAL, System-/Vendor-Komponentenfunktionen sind unabhängig voneinander, was Vendor Freeze ermöglicht.

85df2e425520ca7cd88ccde68d3e4d26.png

Hintergrund zwei:

Nach der Untersuchung sind 30 bis 40 % der Anbieterkomponenten des AOSP-Quellcodes mit den Systemkomponenten gekoppelt. Zu den Arten gekoppelter Warehouses gehören hauptsächlich: AOSP-Framework-Framework-Warehouse, vorgefertigtes, externes, Plattform-Warehouse, selbstentwickeltes ODM-Warehouse, und Lager bauen.

Hintergrund drei:

Unmittelbar danach entwickelte Google die Treble-Architektur weiter, verbesserte die Schnittstellenfähigkeit zwischen System-/Anbieterkomponenten und entwarf die Snapshot-Lösung von VNDK und VSDK ausgehend von AndroidR.

Die Systemkomponente wird zu einem Hersteller-Snapshot vorkompiliert, der von Herstellerkomponenten verschiedener Android-Versionen verwendet werden kann. Dieser Teil ist auch ein wichtiger Link und eine grundlegende Unterstützung für die Implementierung der Treble-Lösung.

0ff1b374c98c681a4ee8e836237886ba.png

2. Grundkonzepte von VNDK

In der Treble-Architektur von Android ist die native Bibliothek in mehrere Kategorien unterteilt, um die Kopplungsbeziehung zwischen System-/Anbieterkomponenten zu standardisieren und einzuschränken. Die Steuerungssystem-/Anbieterkomponenten werden durch die Definition verschiedener Arten gegenseitiger Kopplungsgrade und Nutzungsbeschränkungen erreicht. Modulkopplung.

2.1 Kernbibliothek:

Nur im Systemabbild, nur vom Systemmodul verwendet, darf nicht von der Bibliothek von Vendor, Vendor_available, VNDK und VNDK-SP abhängig sein

Das Format in seinem BP ist

cc_library {

    Name: „libThatIsCore“,

    ...

}

Enthält keine Attribute „vendor“, „vendor_available“, „vndk“ und „vndk-sp“.

2.2 Nur-Anbieter-Bibliothek (proprietär):

Nur zur Verwendung durch den Anbieter, und der Binärspeicherort befindet sich im Anbieterspiegel

Das Format in seinem BP ist

cc_library {

    Name: „libThatIsVendorOnly“,

    proprietär: wahr,

    # oder: Vendor: true, # (für Dinge in AOSP)

    ...

}

Enthält keine VNDK-Eigenschaften

2.3 herstellerverfügbare Bibliothek:

Die vom Anbieter-Image verwendete Bibliothek hat sowohl Hersteller- als auch Kernvarianten und ist in den Anbieter- und System-Images verpackt. Das Format ihres BP ist

cc_library {

    Name: „libThatIsVendorAvailable“,

    Vendor_available: wahr,

    ...

}

Enthält keine VNDK-Eigenschaften

2.4 VNDK-Bibliothek:

Wird vom Herstellermodul verwendet, die Binärdatei wird jedoch im System gespiegelt

Das Format in seinem BP ist

cc_library {

    Name: „libThatIsVndk“,

    Vendor_available: wahr,

    vndk: {

        aktiviert: wahr,

    }

    ...

}

Es sind sowohl die Eigenschaften „vendor_available“ als auch „vnd.enable“ vorhanden

2.5 vndk-sp-Bibliothek:

Die vom Anbieter direkt und vom Systemabbild indirekt verwendete Bibliothek hat ihre Binärdatei im Systemabbild

Das Format in seinem BP ist

cc_library {

    Name: „libThatIsVndkSp“,

    Vendor_available: wahr,

    vndk: {

        aktiviert: wahr,

        support_system_process: true,

    }

    ...

}

Das Attribut support_system_process muss konfiguriert werden

2.6 llndk-Bibliothek:

Die von Google verwaltete und sowohl vom System als auch vom Anbieter verwendete Bibliothek kann doppelt geladen werden. Seine Binärdatei wird im System gespiegelt

Das Format in seinem BP ist

llndk_library {

    Name: „libThatIsLlndk“,

}

db7805936913e22f9c5a7fbedf751a2c.png

Naive Bibliotheksaufteilung und Abhängigkeiten

ceccb90f257536fe713f91e061259cea.png

Kompilierungsabhängigkeiten nach der Aktivierung von VNDK

3. Grundkonzepte von VSDK

3cd98530ebc447787fa1353f7f48e7a1.png

VSDK umfasst tatsächlich den VNDK-Teil und auch Vendor Snapshot.

Der Umfang von Vendor Snapshot ist eine Sammlung nativer Module, die für die Kompilierung oder Integration von Anbietern verwendet werden und durch den Systemquellcode verwaltet werden. Er besteht hauptsächlich aus den folgenden Produkttypen

  • Vendor: True oder Vendor_available: True dynamische/statische Bibliothek oder Header-Dateibibliothek

  • Vendor_available: echte statische VNDK-Bibliothek

  • Vendor: True oder Vendor_available: True, ausführbare Datei oder Objektdatei

Welche Module in „vendor_snapshot“ und „vndk“ verpackt sind, sehen Sie sich zunächst die Tabelle unten für die Aufteilung der Modulanbietervarianten an.

35407f06c5a64bc9f798079383dde35d.png

VNDK: True-Module sind alle in VNDK installiert, nur VNDK-Module mit Vendor_available: True können direkt von Anbietermodulen verwendet werden, VNDK ohne Private kann nur von VNDK-eigenen Modulen und indirekt von Anbietermodulen verwendet werden.

Im Allgemeinen: VSDK umfasst VNDK + Hersteller-Snapshot + RecoverySnapshot + Host-Snapshot.

4. Snapshot-Design

Die beiden obigen Kapitel geben jeweils das Grundkonzept von VNDK/VSDK, die Inhaltsaufteilung und die Konstruktionsunterstützung an. Zurück zur ursprünglichen Frage: Wie sieht der Entwicklungsprozess von VNDK/VSDK angesichts der Kombination von System und Anbieter aus, die zu unterschiedlichen Zeiten und in unterschiedlichen Versionen kompiliert wurden? Die Snapshot-Lösung besteht darin, den vom Anbieter benötigten Inhalt systemseitig vorab zu erstellen und diesen Teil anstelle des Quellcodes für den Anbieter-Build zu verwenden. Der konkrete Inhalt und die Umsetzung werden der Reihe nach vorgestellt.

4.1 Einführung in Snapshot

Der Snapshot (Snapshot) von VNDK/VSDK bezieht sich auf eine Reihe vorgefertigter Bibliotheken, die von der aktuellen Systemseite nach bestimmten Regeln generiert werden, und diese Bibliotheken werden für die spätere Kompilierung auf der Anbieterseite verwendet.

3a9d28e2750896c8744623ee3399daea.png

Die obige Abbildung zeigt die Zuordnung von System und Anbieter in den beiden Fällen des ersten Projekts und des Anbieter-Freeze-Projekts. Da der Anbieter im Hauptversions-Upgrade von Android festgelegt ist, müssen auch die entsprechenden Abhängigkeiten des Anbieters eine übereinstimmende Version haben . Im Projekt haben wir zwei Implementierungsmethoden:

1. Die Manifestdatei auf der Anbieterseite enthält System-Warehouses wie Framework/av, Framework/Base und Framework/native. Dann verwenden diese Repositories den Code der vorherigen Android-Version.

2. Mithilfe des Snapshot-Designs von Google wird die vndk/vsdk-Bibliothek der v27-Version, von der Vendor Image v27 abhängt, vorab erstellt und von der System Image v27-Version generiert. Diese Bibliotheken werden unabhängig für die herstellerseitige Kompilierung verwendet Die Anbieterseite kann die Quellcodeabhängigkeit auf der Systemseite beseitigen.

Die beiden Methoden haben ihre eigenen Vor- und Nachteile: 1. Die Methode ist einfach und direkt, aber die Menge an Anbietercode ist größer und die Kompilierungszeit des Anbieters ist länger; 2. Der Code auf der Anbieterseite ist rationalisiert und die Kompilierungszeit ist kurz , für die Implementierung im Projekt ist jedoch zur Unterstützung ein zusätzlicher Satz vorgefertigter Systeme erforderlich.

4.2 Snapshot-Generierungsprozess

Das Generieren eines Snapshots ist eigentlich ein Prozess, bei dem die VSDK-Binärdatei und ihre Kompilierungs- und Konfigurationslogik generiert und schließlich auf das Snapshot-Produkt verwiesen wird, der in drei Phasen unterteilt werden kann:

c07b9857687b7f9f75ccc3ce517f9121.png

1. Phrase generieren: Nach bestimmten Regeln wird der Prozess der Generierung der vorgefertigten Kompilierungsmodulprodukte (sogenannte vorgefertigte Snapshots), von denen die Kompilierung des Anbieter-Images abhängt, aus dem Quellcode auf der Systemseite generiert.

2. Installationssatz: Der Prozess der Installation des in der Generierungsphase generierten vorgefertigten Moduls im angegebenen Quellcodeverzeichnis über das py-Skript und der Generierung der entsprechenden Android.bp-Datei.

3. Phrase verwenden: Durch Festlegen von BOARD_VNDK_VERSION auf eine bestimmte Versionsnummer (z. B. 31) wird das Kompilierungssystem dazu veranlasst, den vorgenerierten Snapshot zu verwenden, um am Kompilierungsprozess teilzunehmen (entsprechend wird die Quellcode-Kompilierungslogik verwandter Module verwendet). verstopft).

4.3 VNDK-Snapshot-Generierungsprozess

以AOSP的设备为例,对应VNDK Snapshot包为android-vndk-arm64.zip,其内容为:

android-vndk-arm64.zip

├── arch-arm64-armv8-a

│   └── shared

│       ├── vndk-core  -> *.so files, *.json files

│       └── vndk-sp    -> *.so files, *.json files

├── arch-arm-armv8-a   -> (same as arch-arm64-armv8-a)

├── configs            -> *.libraries.txt, module_paths.txt, module_names.txt

├── include            -> exported header files (*.h, *.hh, etc.)

└── NOTICE_FILES       -> license txt files

Generate Phrase:

vndk Snapshot的生成逻辑在文件soong/cc/vndk.go通过定义VndkSnapshotSingleton来实现。

func init() {

android.RegisterSingletonType("vndk-snapshot", VndkSnapshotSingleton)

}

func VndkSnapshotSingleton() android.Singleton {

return &vndkSnapshotSingleton{}

}

type vndkSnapshotSingleton struct {

vndkLibrariesFile   android.OutputPath

vndkSnapshotZipFile android.OptionalPath

}

Dabei definiert vndkSnapshotZipFile den Pfad der Datei vndk-snapshot.zip. Generieren Sie vndkSnapshot in der GenerateBuildActions-Methode von vndkSnapshotSingleton

72a522c0d593bae0570a363f85b4337d.png

Satz installieren:

Die Installation des VNDK-Pakets erfolgt über /development/vndk/snapshot/update.py und der Prozess ist wie folgt:

17fe7eda81bd86097ec7269e728ab9fe.png

In der endgültig generierten BP-Datei

vndk_prebuilt_shared {

    Name: „android.hardware.wifi.hostapd-V1-ndk“,

    Fassung: „33“,

    target_arch: „arm64“,

    Vendor_available: wahr,

    vndk: {

        aktiviert: wahr,

    },

    Bogen: {

        Arm: {

            export_include_dirs: [

                „include/frameworks/native/libs/binder/ndk/include_cpp“,

...

            ],

            srcs: ["arch-arm-armv8-a/shared/vndk-core/android.hardware.wifi.hostapd-V1-ndk.so"],

        },

        arm64: {

            export_include_dirs: [

                „include/frameworks/native/libs/binder/ndk/include_cpp“,

...

            ],

            srcs: ["arch-arm64-armv8-a/shared/vndk-core/android.hardware.wifi.hostapd-V1-ndk.so"],

        },

    },

}

Verwenden Sie den Satz:

Setzen Sie die Variable BOARD_VNDK_VERSION auf einen bestimmten Versionswert in device.mk und kompilieren Sie dann die Herstellerseite.

4.4 VSDK-Snapshot-Generierungsprozess

Am Beispiel des AOSP-Geräts lautet der Inhalt des vsdkSnapshot-Pakets:

Vendor-$(TARGET_DEVICE).zip

├── arch-arm64-armv8-a

│ ├── binär -> Binärdateien, *.json-Dateien

│ ├── Header -> *.json-Dateien

│ ├── Objekt -> *.o-Dateien, *.json-Dateien

│ ├── geteilt -> *.so-Dateien, *.json-Dateien

│ └── statisch -> *.a-Dateien, *.json-Dateien

├── arch-arm-armv8-a -> (arch-arm64-armv8-a)

├── Konfigurationen -> *.rc-Dateien, *.xml-Dateien

├── include -> exportierte Header-Dateien (*.h, *.hh usw.)

└── NOTICE_FILES -> Lizenz-TXT-Dateien

Phrase generieren:

Die Generierungslogik von vsdkSnapshot befindet sich in GenerateBuildActions von seller_snapshot.go:

47e9774cf8510f055ed81b67ed0196a7.png

Satz installieren:

Die vsdkSnapshot-Installation verwendet die Datei /development/vendor_snapshot/update.py:

381b39d1f5cc4b001404a6eec52f4f52.png

Verwenden Sie den Satz:

Setzen Sie die Variable BOARD_VNDK_VERSION auf einen bestimmten Versionswert in device.mk und kompilieren Sie dann die Herstellerseite.

5. Zusammenfassung

Mit VNDK/VSDK Snapshot können Quellcodeabhängigkeiten und Kompilierungsabhängigkeiten zwischen System-/Anbieterkomponenten weiter reduziert werden, wodurch die Erstellung einer Treble-Baseline erleichtert wird.

Die Vorteile lassen sich in drei Punkten zusammenfassen:

  • Verbesserte Kompilierungseffizienz von Anbieterkomponenten

  • Verbessertes Code-Awareness-Management: Nach der Entkopplung des Warehouse können Sie das Coupling-Warehouse in der Anbieterkomponente löschen und nur den Quellcode in der Systemkomponente behalten

  • Es ist förderlicher für die Unterstützung der unabhängigen Entwicklung von System-/Anbieterkomponenten

Verweise

[1]https://source.android.com/devices/architecture/vndk/snapshot-vendor

[2]https://source.android.com/devices/architecture/vndk/snapshot-generate

[3] Bootcamp 2021 VSDK.pdf

[4]https://source.android.com/devices/architecture/vndk/enabling

[5]https://source.android.com/docs/core/architecture/vndk/build-system

[6]https://source.android.com/docs/core/architecture/vndk/snapshot-design

[7] Eingehende Analyse des VNDK/VSDK-Snapshot-Kompilierungsframeworks

Vergangenheit

Erwarten

drücken

empfehlen

Analyse der neuesten Prozessorarchitektur von Arm im Jahr 2023 – X4, A720 und A520

Chromium-Multiprozessarchitektur, wie viel wissen Sie?

Über die Bedeutung eines guten Namens: der Wechsel von Linux-Kernel-Seite zu Folio

90a6c031167d2af6cbd926b4acbbd708.gif

Drücken Sie lange, um Kernel Craftsman WeChat zu folgen

Linux Kernel Black Technology | Technische Artikel | Empfohlene Tutorials

Supongo que te gusta

Origin blog.csdn.net/feelabclihu/article/details/131733738
Recomendado
Clasificación