<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          添加 Product

          共 24875字,需瀏覽 50分鐘

           ·

          2024-03-26 03:00

          1. 什么是 Product

          在 App 的開發(fā)中,我們要去打渠道包,根據(jù)不同應用市場的要求打包出不同的 apk 包。

          同樣的道理,Android 的系統(tǒng)源碼,經(jīng)過簡單的配置,可以打包出不同的系統(tǒng)鏡像,用于不同的產(chǎn)品。例如小米 12s,小米12s pro,小米12s ultra 均源于驍龍8+平臺。

          f030c374f86472e40ce34f437b533345.webp

          Android 系統(tǒng)源碼是通過配置文件來實現(xiàn) “分包” 的,配置文件將我們的源碼配置為了不同的 Product,每一個 Product 適用于特定的硬件產(chǎn)品,這一系列的配置文件我們稱為 Product

          2. AOSP 中預制的 Product

          我們在編譯源碼之前需要執(zhí)行 lunch :

                
                lunch

          You're building on Linux

          Lunch menu... pick a combo:
               1. aosp_arm-eng
               2. aosp_arm64-eng
               3. aosp_blueline-userdebug
               4. aosp_bonito-userdebug
               5. aosp_car_arm-userdebug
               6. aosp_car_arm64-userdebug
               7. aosp_car_x86-userdebug
               8. aosp_car_x86_64-userdebug
               9. aosp_cf_arm64_phone-userdebug
               10. aosp_cf_x86_64_phone-userdebug
               11. aosp_cf_x86_auto-userdebug
               12. aosp_cf_x86_phone-userdebug
               13. aosp_cf_x86_tv-userdebug
               14. aosp_coral-userdebug
               15. aosp_coral_car-userdebug
               16. aosp_crosshatch-userdebug
               17. aosp_crosshatch_car-userdebug
               18. aosp_flame-userdebug
               19. aosp_marlin-userdebug
               20. aosp_sailfish-userdebug
               21. aosp_sargo-userdebug
               22. aosp_taimen-userdebug
               23. aosp_walleye-userdebug
               24. aosp_walleye_test-userdebug
               25. aosp_x86-eng
               26. aosp_x86_64-eng
               27. beagle_x15-userdebug
               28. car_x86_64-userdebug
               29. fuchsia_arm64-eng
               30. fuchsia_x86_64-eng
               31. hikey-userdebug
               32. hikey64_only-userdebug
               33. hikey960-userdebug
               34. hikey960_tv-userdebug
               35. hikey_tv-userdebug
               36. m_e_arm-userdebug
               37. mini_emulator_arm64-userdebug
               38. mini_emulator_x86-userdebug
               39. mini_emulator_x86_64-userdebug
               40. poplar-eng
               41. poplar-user
               42. poplar-userdebug
               43. qemu_trusty_arm64-userdebug
               44. uml-userdebug

          Which would you like? [aosp_arm-eng]

          這里的每一個選項就是一個 Product, AOSP 預制了很多 Product。對應于 x86_64 模擬器,我們選擇的是 aosp_x86_64-eng。

          AOSP 中 Product 配置文件保存在以下兩個目錄:

          • build/target:aosp 提供的 product 配置文件保存在這個目錄下,我們選擇的 aosp_x86_64-eng Product 就配置在這個目錄下。
          • device:芯片及方案廠商提供的 product 配置文件保存在這個目錄下

          先使用 tree 命令查看 build/target 基本的目錄結構:

                
                tree . -L 2
          .
          ├── board
          │   ├── Android.mk
          │   ├── BoardConfigEmuCommon.mk
          │   ├── BoardConfigGsiCommon.mk
          │   ├── BoardConfigMainlineCommon.mk
          │   ├── BoardConfigModuleCommon.mk
          │   ├── BoardConfigPixelCommon.mk
          │   ├── emulator_arm
          │   ├── emulator_arm64
          │   ├── emulator_x86
          │   ├── emulator_x86_64
          │   ├── emulator_x86_64_arm64
          │   ├── emulator_x86_arm
          │   ├── generic
          │   ├── generic_64bitonly_x86_64
          │   ├── generic_arm64
          │   ├── generic_x86
          │   ├── generic_x86_64
          │   ├── generic_x86_64_arm64
          │   ├── generic_x86_arm
          │   ├── go_defaults_512.prop
          │   ├── go_defaults_common.prop
          │   ├── go_defaults.prop
          │   ├── gsi_arm64
          │   ├── gsi_system_ext.prop
          │   ├── gsi_system_ext_user.prop
          │   ├── mainline_arm64
          │   ├── mainline_sdk
          │   ├── mainline_x86
          │   ├── mainline_x86_64
          │   ├── mainline_x86_arm
          │   ├── module_arm
          │   ├── module_arm64
          │   ├── module_x86
          │   ├── module_x86_64
          │   └── ndk
          ├── OWNERS
          └── product
              ├── AndroidProducts.mk
              ├── aosp_64bitonly_x86_64.mk
              ├── aosp_arm64.mk
              ├── aosp_arm.mk
              ├── aosp_base.mk
              ├── aosp_base_telephony.mk
              ├── aosp_product.mk
              ├── aosp_x86_64.mk
              ├── aosp_x86_arm.mk
              ├── aosp_x86.mk
              ├── base.mk
              ├── base_product.mk
              ├── base_system_ext.mk
              ├── base_system.mk
              ├── base_vendor.mk
              ├── cfi-common.mk
              ├── core_64_bit.mk
              ├── core_64_bit_only.mk
              ├── core_minimal.mk
              ├── core_no_zygote.mk
              ├── default_art_config.mk
              ├── developer_gsi_keys.mk
              ├── empty-preloaded-classes
              ├── empty-profile
              ├── emulated_storage.mk
              ├── emulator.mk
              ├── emulator_system.mk
              ├── emulator_vendor.mk
              ├── full_base.mk
              ├── full_base_telephony.mk
              ├── full.mk
              ├── full_x86.mk
              ├── generic.mk
              ├── generic_no_telephony.mk
              ├── generic_ramdisk.mk
              ├── generic_system_arm64.mk
              ├── generic_system.mk
              ├── generic_system_x86_64.mk
              ├── generic_system_x86_arm.mk
              ├── generic_system_x86.mk
              ├── generic_x86.mk
              ├── go_defaults_512.mk
              ├── go_defaults_common.mk
              ├── go_defaults.mk
              ├── gsi
              ├── gsi_release.mk
              ├── handheld_product.mk
              ├── handheld_system_ext.mk
              ├── handheld_system.mk
              ├── handheld_vendor.mk
              ├── languages_default.mk
              ├── languages_full.mk
              ├── mainline_sdk.mk
              ├── mainline_system_arm64.mk
              ├── mainline_system.mk -> generic_system.mk
              ├── mainline_system_x86_64.mk
              ├── mainline_system_x86_arm.mk
              ├── mainline_system_x86.mk
              ├── media_product.mk
              ├── media_system_ext.mk
              ├── media_system.mk
              ├── media_vendor.mk
              ├── module_arm64.mk
              ├── module_arm.mk
              ├── module_common.mk
              ├── module_x86_64.mk
              ├── module_x86.mk
              ├── ndk.mk
              ├── non_ab_device.mk
              ├── OWNERS
              ├── product_launched_with_k.mk
              ├── product_launched_with_l.mk
              ├── product_launched_with_l_mr1.mk
              ├── product_launched_with_m.mk
              ├── product_launched_with_n.mk
              ├── product_launched_with_n_mr1.mk
              ├── product_launched_with_o.mk
              ├── product_launched_with_o_mr1.mk
              ├── product_launched_with_p.mk
              ├── profile_boot_common.mk
              ├── runtime_libart.mk
              ├── sdk_arm64.mk
              ├── sdk.mk
              ├── sdk_phone_arm64.mk
              ├── sdk_phone_armv7.mk
              ├── sdk_phone_x86_64.mk
              ├── sdk_phone_x86.mk
              ├── sdk_x86_64.mk
              ├── sdk_x86.mk
              ├── security
              ├── sysconfig
              ├── telephony.mk
              ├── telephony_product.mk
              ├── telephony_system_ext.mk
              ├── telephony_system.mk
              ├── telephony_vendor.mk
              ├── updatable_apex.mk
              ├── userspace_reboot.mk
              ├── vboot.mk
              ├── verity.mk
              ├── virtual_ab_ota
              ├── virtual_ab_ota.mk -> virtual_ab_ota/launch.mk
              ├── virtual_ab_ota_plus_non_ab.mk -> virtual_ab_ota/plus_non_ab.mk
              └── virtual_ab_ota_retrofit.mk -> virtual_ab_ota/retrofit.mk

          board目錄下主要是一些硬件相關的配置, product 目錄主要是產(chǎn)品相關的配置

          針對我們選擇的 aosp_x86_64-eng,我們主要關注以下幾個文件:

          • /board/generic_x86_64/BoardConfig.mk :用于硬件相關配置
          • /product/AndroidProducts.mk   /product/aosp_x86_64.mk:用于配置 Product

          接下來我們來看看這三個配置文件:

          BoardConfig.mk 用于定義和硬件相關的底層特性和變量,比如當前源碼支持的 cpu 位數(shù)(64/32位),bootloader 和 kernel, 是否支持攝像頭,GPS導航等一些板級特性。

                
                # x86_64 emulator specific definitions
          TARGET_CPU_ABI := x86_64
          TARGET_ARCH := x86_64
          TARGET_ARCH_VARIANT := x86_64

          TARGET_2ND_CPU_ABI := x86
          TARGET_2ND_ARCH := x86
          TARGET_2ND_ARCH_VARIANT := x86_64

          TARGET_PRELINK_MODULE := false
          include build/make/target/board/BoardConfigGsiCommon.mk
          include build/make/target/board/BoardConfigEmuCommon.mk

          BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800

          BOARD_SEPOLICY_DIRS += device/generic/goldfish/sepolicy/x86

          # Wifi.
          BOARD_WLAN_DEVICE           := emulator
          BOARD_HOSTAPD_DRIVER        := NL80211
          BOARD_WPA_SUPPLICANT_DRIVER := NL80211
          BOARD_HOSTAPD_PRIVATE_LIB   := lib_driver_cmd_simulated
          BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_simulated
          WPA_SUPPLICANT_VERSION      := VER_0_8_X
          WIFI_DRIVER_FW_PATH_PARAM   := "/dev/null"
          WIFI_DRIVER_FW_PATH_STA     := "/dev/null"
          WIFI_DRIVER_FW_PATH_AP      := "/dev/null"

          其中還通過 include 包含了 BoardConfigGsiCommon.mk 和 BoardConfigEmuCommon.mk 兩個配置文件,前者用于通用系統(tǒng)映像的配置,后者用于模擬器的配置

          主要和硬件相關,有一個基本的了解即可。一般很少改動。

          AndroidProducts.mk 定義我們執(zhí)行 lunch 命令時,打印的列表以及每個選項對應的配置文件

                
                # Unbundled apps will be built with the most generic product config.
          # TARGET_BUILD_APPS 編譯Android系統(tǒng)時,這個值為空,編譯單模塊時,這個值為所編譯模塊的路徑

          #編譯單模塊
          ifneq ($(TARGET_BUILD_APPS),)
          PRODUCT_MAKEFILES := \
              $(LOCAL_DIR)/aosp_arm64.mk \
              $(LOCAL_DIR)/aosp_arm.mk \
              $(LOCAL_DIR)/aosp_x86_64.mk \
              $(LOCAL_DIR)/aosp_x86.mk \
              $(LOCAL_DIR)/full.mk \
              $(LOCAL_DIR)/full_x86.mk \
          #編譯系統(tǒng)
          else
          PRODUCT_MAKEFILES := \
              $(LOCAL_DIR)/aosp_64bitonly_x86_64.mk \
              $(LOCAL_DIR)/aosp_arm64.mk \
              $(LOCAL_DIR)/aosp_arm.mk \
              $(LOCAL_DIR)/aosp_x86_64.mk \
              $(LOCAL_DIR)/aosp_x86_arm.mk \
              $(LOCAL_DIR)/aosp_x86.mk \
              $(LOCAL_DIR)/full.mk \
              $(LOCAL_DIR)/full_x86.mk \
              $(LOCAL_DIR)/generic.mk \
              $(LOCAL_DIR)/generic_system_arm64.mk \
              $(LOCAL_DIR)/generic_system_x86.mk \
              $(LOCAL_DIR)/generic_system_x86_64.mk \
              $(LOCAL_DIR)/generic_system_x86_arm.mk \
              $(LOCAL_DIR)/generic_x86.mk \
              $(LOCAL_DIR)/mainline_system_arm64.mk \
              $(LOCAL_DIR)/mainline_system_x86.mk \
              $(LOCAL_DIR)/mainline_system_x86_64.mk \
              $(LOCAL_DIR)/mainline_system_x86_arm.mk \
              $(LOCAL_DIR)/ndk.mk \
              $(LOCAL_DIR)/sdk_arm64.mk \
              $(LOCAL_DIR)/sdk.mk \
              $(LOCAL_DIR)/sdk_phone_arm64.mk \
              $(LOCAL_DIR)/sdk_phone_armv7.mk \
              $(LOCAL_DIR)/sdk_phone_x86_64.mk \
              $(LOCAL_DIR)/sdk_phone_x86.mk \
              $(LOCAL_DIR)/sdk_x86_64.mk \
              $(LOCAL_DIR)/sdk_x86.mk \

          endif

          PRODUCT_MAKEFILES += \
              $(LOCAL_DIR)/mainline_sdk.mk \
              $(LOCAL_DIR)/module_arm.mk \
              $(LOCAL_DIR)/module_arm64.mk \
              $(LOCAL_DIR)/module_x86.mk \
              $(LOCAL_DIR)/module_x86_64.mk \

          # 配置我們在 lunch 時的選項
          COMMON_LUNCH_CHOICES := \
              aosp_arm64-eng \
              aosp_arm-eng \
              aosp_x86_64-eng \
              aosp_x86-eng \

          PRODUCT_MAKEFILES 用于引入產(chǎn)品的配置文件

          COMMON_LUNCH_CHOICES 用于添加 lunch 時的選項,選項的名字由兩部分過程 產(chǎn)品名 + 構建模式

          • 產(chǎn)品名就是 PRODUCT_MAKEFILES 中引入的產(chǎn)品配置文件名去掉 .mk 后綴,例如 aosp_x86_64
          • 構建模式有三種:用戶模式 user、用戶調試模式 userdebug 和工程模式 eng

          主要區(qū)別如下:、

          用戶模式 user

          • 僅安裝標簽為 user 的模塊
          • 設定屬性 ro.secure=1,打開安全檢查功能
          • 設定屬性 ro.debuggable=0,關閉應用調試功能
          • 默認關閉 adb 功能
          • 打開 Proguard 混淆器
          • 打開 DEXPREOPT 預先編譯優(yōu)化

          用戶調試模式 userdebug

          • 安裝標簽為 user、debug 的模塊
          • 設定屬性 ro.secure=1,打開安全檢查功能
          • 設定屬性 ro.debuggable=1,啟用應用調試功能
          • 默認打開 adb 功能
          • 打開 Proguard 混淆器
          • 打開 DEXPREOPT 預先編譯優(yōu)化

          工程模式 eng

          • 安裝標簽為 user、debug、eng 的模塊
          • 設定屬性 ro.secure=0,關閉安全檢查功能
          • 設定屬性 ro.debuggable=1,啟用應用調試功能
          • 設定屬性 ro.kernel.android.checkjni=1,啟用 JNI 調用檢查
          • 默認打開 adb 功能
          • 關閉 Proguard 混淆器
          • 關閉 DEXPREOPT 預先編譯優(yōu)化

          aosp_x86_64.mk:這個文件就是我們產(chǎn)品配置的主基地。

                
                PRODUCT_USE_DYNAMIC_PARTITIONS := true

          # The system image of aosp_x86_64-userdebug is a GSI for the devices with:
          # - x86 64 bits user space
          # - 64 bits binder interface
          # - system-as-root
          # - VNDK enforcement
          # - compatible property override enabled

          # This is a build configuration for a full-featured build of the
          # Open-Source part of the tree. It's geared toward a US-centric
          # build quite specifically for the emulator, and might not be
          # entirely appropriate to inherit from for on-device configurations.

          # GSI for system/product
          $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_common.mk)

          # Emulator for vendor
          $(call inherit-product-if-exists, device/generic/goldfish/x86_64-vendor.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/product/emulator_vendor.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk)

          # Enable mainline checking for excat this product name
          ifeq (aosp_x86_64,$(TARGET_PRODUCT))
          PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
          endif

          PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
              root/init.zygote32_64.rc \
              root/init.zygote64_32.rc \

          # Copy different zygote settings for vendor.img to select by setting property
          # ro.zygote=zygote64_32 or ro.zygote=zygote32_64:
          #   1. 64-bit primary, 32-bit secondary OR
          #   2. 32-bit primary, 64-bit secondary
          # init.zygote64_32.rc is in the core_64_bit.mk below
          PRODUCT_COPY_FILES += \
              system/core/rootdir/init.zygote32_64.rc:root/init.zygote32_64.rc

          # Product 基本信息
          PRODUCT_NAME := aosp_x86_64
          PRODUCT_DEVICE := generic_x86_64
          PRODUCT_BRAND := Android
          PRODUCT_MODEL := AOSP on x86_64

          inherit-product 函數(shù)表示繼承另外一個文件

                
                $(call inherit-product, $(SRC_TARGET_DIR)/product/emulator_vendor.mk)
          $(call inherit-product-if-exists, device/generic/goldfish/x86_64-vendor.mk)

          在 Makefile 中可使用 “-include” 來代替 “include”,來忽略由于包含文件不存在或者無法創(chuàng)建時的錯誤提示(“-”的意思是告訴make,忽略此操作的錯誤。make繼續(xù)執(zhí)行),如果不加-,當 include 的文件出錯或者不存在的時候, make 會報錯并退出。

                
                -include $(TARGET_DEVICE_DIR)/AndroidBoard.mk

          include 和 inherit-product 的區(qū)別

          • 假設 PRODUCT_VAR := a 在 A.mk 中, PRODUCT_VAR := b 在 B.mk 中。
          • 如果你在 A.mk 中 include B.mk,你最終會得到 PRODUCT_VAR := b
          • 但是如果你在 A.mk inherit-product B.mk,你會得到 PRODUCT_VAR := a b。并 inherit-product 確保您不會兩次包含同一個 makefile 。

          Product 配置文件中涉及的變量可分為一下幾類:

          • 通用變量
          • 路徑變量
          • 自定義變量
          • 功能變量

          通用變量

                
                PRODUCT_BRAND := Android

          PRODUCT_NAME := sdk_phone_x86_64

          PRODUCT_DEVICE := generic_x86_64

          PRODUCT_MODEL := Android SDK built for x86_64

          常用的路徑變量

          • SRC_TARGET_DIR 其值為 build/target
          • LOCAL_DIR 代表當前目錄

          自定義變量,表示該變量如何使用, 取決于自己,如:

                
                BOARD_DDR_VAR_ENABLED := true

          功能變量:表示改變量有特殊功能

          • PRODUCT_COPY_FILES:用于完成拷貝,可以將源碼中的文件拷貝到編譯好的分區(qū)文件中
                
                PRODUCT_COPY_FILES += vendor/rockchip/common/phone/etc/spn-conf.xml:system/etc/spn-conf.xml
          • PRODUCT_PROPERTY_OVERRIDES:用于設置系統(tǒng)屬性(覆蓋)
                
                PRODUCT_PROPERTY_OVERRIDES += \
              ro.product.version = 1.0.0 \

          3. 添加自己的 Product

          這里假設我們的公司名叫果凍(Jelly),我們準備開發(fā)一款對標蘋果 14 的手機,取名叫 大米14(Rice14)。

          接下來我們在源碼中添加我們自己的產(chǎn)品(Product)

          在 device 目錄下添加如下的目錄與文件:

                
                Jelly/
          └── Rice14
              ├── AndroidProducts.mk
              ├── BoardConfig.mk
              └── Rice14.mk

          BoardConfig.mk 包含了硬件芯片架構配置,分區(qū)大小配置等信息這里我們直接使用 aosp_x86_64 的 BoardConfig.mk 就行。BoardConfig.mk 拷貝自 build/target/board/generic_x86_64/BoardConfig.mk

                
                # x86_64 emulator specific definitions
          TARGET_CPU_ABI := x86_64
          TARGET_ARCH := x86_64
          TARGET_ARCH_VARIANT := x86_64

          TARGET_2ND_CPU_ABI := x86
          TARGET_2ND_ARCH := x86
          TARGET_2ND_ARCH_VARIANT := x86_64

          TARGET_PRELINK_MODULE := false
          include build/make/target/board/BoardConfigGsiCommon.mk
          include build/make/target/board/BoardConfigEmuCommon.mk

          BOARD_USERDATAIMAGE_PARTITION_SIZE := 576716800

          BOARD_SEPOLICY_DIRS += device/generic/goldfish/sepolicy/x86

          # Wifi.
          BOARD_WLAN_DEVICE           := emulator
          BOARD_HOSTAPD_DRIVER        := NL80211
          BOARD_WPA_SUPPLICANT_DRIVER := NL80211
          BOARD_HOSTAPD_PRIVATE_LIB   := lib_driver_cmd_simulated
          BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_simulated
          WPA_SUPPLICANT_VERSION      := VER_0_8_X
          WIFI_DRIVER_FW_PATH_PARAM   := "/dev/null"
          WIFI_DRIVER_FW_PATH_STA     := "/dev/null"
          WIFI_DRIVER_FW_PATH_AP      := "/dev/null"

          Rice14.mk 拷貝自 build/target/product/aosp_x86_64.mk

          其中的 if 語句需要注釋掉,同時需要修改最后四行

                
                PRODUCT_USE_DYNAMIC_PARTITIONS := true

          # The system image of aosp_x86_64-userdebug is a GSI for the devices with:
          # - x86 64 bits user space
          # - 64 bits binder interface
          # - system-as-root
          # - VNDK enforcement
          # - compatible property override enabled

          # This is a build configuration for a full-featured build of the
          # Open-Source part of the tree. It's geared toward a US-centric
          # build quite specifically for the emulator, and might not be
          # entirely appropriate to inherit from for on-device configurations.

          # GSI for system/product
          $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_common.mk)

          # Emulator for vendor
          $(call inherit-product-if-exists, device/generic/goldfish/x86_64-vendor.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/product/emulator_vendor.mk)
          $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86_64/device.mk)

          # Enable mainline checking for excat this product name
          #ifeq (aosp_x86_64,$(TARGET_PRODUCT))
          PRODUCT_ENFORCE_ARTIFACT_PATH_REQUIREMENTS := relaxed
          #endif

          PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
              root/init.zygote32_64.rc \
              root/init.zygote64_32.rc \

          # Copy different zygote settings for vendor.img to select by setting property
          # ro.zygote=zygote64_32 or ro.zygote=zygote32_64:
          #   1. 64-bit primary, 32-bit secondary OR
          #   2. 32-bit primary, 64-bit secondary
          # init.zygote64_32.rc is in the core_64_bit.mk below
          PRODUCT_COPY_FILES += \
              system/core/rootdir/init.zygote32_64.rc:root/init.zygote32_64.rc

          # Overrides
          PRODUCT_BRAND := Jelly
          PRODUCT_NAME := Rice14
          PRODUCT_DEVICE := Rice14
          PRODUCT_MODEL := Android SDK built for x86_64 Rice14

          AndroidProducts.mk 內容如下:

                
                PRODUCT_MAKEFILES := \
              $(LOCAL_DIR)/Rice14.mk

          COMMON_LUNCH_CHOICES := \
              Rice14-eng \
              Rice14-userdebug \
              Rice14-user \

          最后驗證:

                
                source build/envsetup.sh
          lunch Rice14-eng
          make -j16
          emulator

          以上示例給出了最簡單的模擬器 Product 的添加,主要是用于我們的學習。

          關于

          我叫阿豪,2015 年本科畢業(yè)于國防科技大學指揮自動化專業(yè),畢業(yè)后,從事信息化裝備的研發(fā)工作。主要研究方向為 Android Framework 與 Linux Kernel,2023年春節(jié)后開始做 Android Framework 相關的技術分享。

          如果你對 Framework 感興趣或者正在學習 Framework,可以參考我總結的Android Framework 學習路線指南,也可關注我的微信公眾號,我會在公眾號上持續(xù)分享我的經(jīng)驗,幫助正在學習的你少走一些彎路。學習過程中如果你有疑問或者你的經(jīng)驗想要分享給大家可以添加我的微信,我拉你進技術交流群。


          瀏覽 37
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩欧美一级电影 | 开心五月天激情网 | 欧美A片在线播放 | 天天日天天日天天干 | 乱伦小说五月天 |