Android编译系统产品线(基于友善之臂tin4412 android5.0系统)

简介: 1.Android源码中的产品线解析通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品。这就引入了产品线的概念。Android系统源码中,产品相关的文件通常保存在 device/company/product目录下其目录的组织结构为在tiny4412 android 5.

1.Android源码中的产品线解析

通常产品厂商在拿到Android源码后会在Android源码基础上进行定制修改,以匹配适应自己的产品。这就引入了产品线的概念。Android系统源码中,产品相关的文件通常保存在 device/company/product目录下其目录的组织结构为

技术分享

在tiny4412 android 5.0中如下图所示:

技术分享

 (1)vendorsetup.sh中的内容如下

#调用add_lunch_combo函数将full_tiny4412-userdebug
#和full_tiny4412-eng添加到系统相关变量中,后续
#lunch提供的菜单就是根据这些变量产生的
#envsetup.sh末尾通过一个for循环来扫描工程中
#所有可用的vendorsetup.sh并执行它们
#默认会扫面/vendor和/device目录
add_lunch_combo full_tiny4412-userdebug
add_lunch_combo full_tiny4412-eng

(2)AndroidProducts.mk中内容为

#当运行了lunch函数选择了编译的产品后
#编译系统会在产品所在的目录下寻找
#AndroidProducts.mk文件,这里记录
#着该产品的一些具体的属性,但是
#通常我们在这个文件中做一个转向
PRODUCT_MAKEFILES :=     $(LOCAL_DIR)/aosp_tiny4412.mk     $(LOCAL_DIR)/full_tiny4412.mk

其中full_tiny4412.mk种的内容为

 

# Launcher, Camera and Gallery
ifeq ($(BOARD_USES_LAUNCHER3),true)
PRODUCT_PACKAGES +=     Launcher3
endif
#系统要预装的一系列程序
PRODUCT_PACKAGES +=     Gallery2
# Live Wallpapers
PRODUCT_PACKAGES +=     HoloSpiralWallpaper     LiveWallpapers     LiveWallpapersPicker     MagicSmokeWallpapers     VisualizationWallpapers     librs_jni
#用于重载系统属性
#格式:key=value
#这些属性最终会被存储在设备的
#/system/build.prop文件中
PRODUCT_PROPERTY_OVERRIDES :=     net.dns1=8.8.8.8     net.dns2=8.8.4.4
# Inherit from those products. Most specific first.
#继承 aosp_base_telephony.mk 和device/friendly-arm/tiny4412/device.mk
#文件中的定义
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk)
$(call inherit-product, device/friendly-arm/tiny4412/device.mk)
#覆盖继承上面两个文件定义的如下几个变量
# Discard inherited values and use our own instead.
#产品名称,最终会显示在系统设置中的
#"关于设备的选项中"
PRODUCT_NAME := full_tiny4412
#设备名称
PRODUCT_DEVICE := tiny4412
产品生产商
PRODUCT_MANUFACTURER := FriendlyARM (www.arm9.net)
#产品所属品牌
PRODUCT_BRAND := Android
#产品型号
PRODUCT_MODEL := Full Android on TINY4412

 

(3)BoardConfig.mk文件解析

# BoardConfig.mk
#
# Product-specific compile-time definitions.
#
# Use the non-open-source parts, if theyre present
-include vendor/friendly-arm/tiny4412/BoardConfigVendor.mk
#引入BoardConfigCommon.mk
# Use the parts that are common between all Exynos4412s
include device/friendly-arm/tiny4412/BoardConfigCommon.mk
#用来配置SELINUX,SELINUX是android上面的一种安全机制
#我们可以通过配置SELINUX的相关policy,来定制自己的手
#机的一些权限,比如,我们可以完全让root用户没有任何的
#权限和user一样
#配置SELINUX,需要linux内核首先是支持selinux的,
#另外需要android的selinux的配置文件sepolicy里面的内容
#然后就是修改BoardConfig.mk
#首先会包含厂商定制的sepolicy的文件夹:BOARD_SEPOLICY_DIRS
#然后将规则添加到了sepolicy中:BOARD_SEPOLICY_DIRS
BOARD_SEPOLICY_DIRS :=     device/friendly-arm/tiny4412/sepolicy
#配置SELINUX
BOARD_SEPOLICY_UNION :=     file_contexts     service_contexts     app.te     boardinit.te     bluetooth.te     device.te     domain.te     drmserver.te     gpsd.te     mediaserver.te     system_server.te

接下来分析引入的BoardConfigCommon.mk

# BoardConfigCommon.mk
#
# Product-specific compile-time definitions.
#芯片平台
TARGET_BOARD_PLATFORM := exynos4
#芯片类型
TARGET_SOC := exynos4x12
#CPU配置选项
# CPU options
TARGET_CPU_ABI := armeabi-v7a
TARGET_CPU_ABI2 := armeabi
TARGET_CPU_SMP := true
TARGET_ARCH := arm
TARGET_ARCH_VARIANT := armv7-a-neon
TARGET_ARCH_VARIANT_CPU := cortex-a9
TARGET_CPU_VARIANT := cortex-a9
ARCH_ARM_HAVE_NEON := true
ARCH_ARM_HAVE_TLS_REGISTER := true
TARGET_GLOBAL_CFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_GLOBAL_CPPFLAGS += -mtune=cortex-a9 -mfpu=neon -mfloat-abi=softfp
TARGET_NO_BOOTLOADER := true
TARGET_NO_KERNEL := true
TARGET_NO_RADIOIMAGE := true
TARGET_BOOTLOADER_BOARD_NAME := tiny4412
TARGET_PROVIDES_INIT_RC := true
TARGET_PROVIDES_INIT_TARGET_RC := true
# Exynos4 support
EXYNOS4X12_ENHANCEMENTS := true
EXYNOS4_ENHANCEMENTS := true
ifeq ($(EXYNOS4X12_ENHANCEMENTS),true)
COMMON_GLOBAL_CFLAGS += -DEXYNOS4_ENHANCEMENTS=1
COMMON_GLOBAL_CFLAGS += -DEXYNOS4X12_ENHANCEMENTS=1
endif
# Launcher
BOARD_USES_LAUNCHER3 := true
# Audio
BOARD_USES_GENERIC_AUDIO := false
BOARD_USES_I2S_AUDIO := true
BOARD_USES_PCM_AUDIO := false
BOARD_USES_SPDIF_AUDIO := false
# ULP, ALP 
BOARD_USE_ULP_AUDIO := false
BOARD_USE_ALP_AUDIO := true
#背光配置
# Backlight
BOARD_USES_PWMLIGHTS := false
#蓝牙配置
# Bluetooth
BOARD_HAVE_BLUETOOTH := true
BOARD_HAVE_BLUETOOTH_CSR := true
BOARD_HAVE_BLUETOOTH_BCM := false
BOARD_HAVE_SAMSUNG_BLUETOOTH := false
BOARD_BLUETOOTH_BDROID_BUILDCFG_INCLUDE_DIR := device/friendly-arm/tiny4412/bluetooth
#Wi-Fi配置
# Connectivity - Wi-Fi
WPA_SUPPLICANT_VERSION := VER_0_8_X
BOARD_WPA_SUPPLICANT_DRIVER := WEXT
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_fawext
BOARD_WLAN_DEVICE := fawext
#文件系统配置
# Filesystem
TARGET_USERIMAGES_USE_EXT4 := true
BOARD_SYSTEMIMAGE_PARTITION_SIZE   := 629145600  # 600MB
BOARD_USERDATAIMAGE_PARTITION_SIZE := 830472192  # 792MB
BOARD_CACHEIMAGE_PARTITION_SIZE    := 536870912  # 512MB
BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE := ext4
BOARD_FLASH_BLOCK_SIZE := 4096
#图形配置
# Graphics
BOARD_USES_HGL := true
BOARD_EGL_CFG := device/friendly-arm/tiny4412/conf/egl.cfg
USE_OPENGL_RENDERER := true
IGN_EGL_BUFFERCOUNT := true
NUM_FRAMEBUFFER_SURFACE_BUFFERS := 3
SCREEN_WIDTH := 800
SCREEN_HEIGHT := 1280
DEFAULT_FB_NUM := 2
# FIMG Acceleration
BOARD_USES_FIMGAPI := true
BOARD_USES_SKIA_FIMGAPI := true
BOARD_USES_SKIAHWJPEG := true
COMMON_GLOBAL_CFLAGS += -DSEC_HWJPEG_G2D -DFORCE_SCREENSHOT_CPU_PATH
# HWComposer
BOARD_USES_HWCOMPOSER := true
BOARD_USE_SYSFS_VSYNC_NOTIFICATION := true
# TVOut & HDMI
# BOARD_USE_SECTVOUT := true
# BOARD_USES_SKTEXTBOX := true
BOARD_USES_HDMI_SUBTITLES := false
BOARD_USES_HDMI := true
BOARD_HDMI_STD := STD_1080P
BOARD_HDMI_DDC_CH := DDC_CH_I2C_7
BOARD_HDMI_ROTATE := false
#Camera配置
# Camera
BOARD_CAMERA_HAVE_ISO := true
COMMON_GLOBAL_CFLAGS += -DHAVE_ISO
COMMON_GLOBAL_CFLAGS += -DSAMSUNG_CAMERA_HARDWARE
COMMON_GLOBAL_CFLAGS += -DSAMSUNG_DVFS
BOARD_USES_PROPRIETARY_LIBFIMC := true
# SEC Camera
USE_SEC_CAMERA := false
CAMERA_USE_DIGITALZOOM := true
# BOARD_USE_S5K3H2 := true
#OMX配置
# OMX
BOARD_USE_SAMSUNG_COLORFORMAT := true
BOARD_NONBLOCK_MODE_PROCESS := true
BOARD_USE_STOREMETADATA := true
BOARD_USE_METADATABUFFERTYPE := true
BOARD_USE_S3D_SUPPORT := true
BOARD_USE_DRM := true
BOARD_USE_CSC_FIMC := false
BOARD_USES_MFC_FPS := true
BOARD_USES_FFMPEG := false
#V4L2配置
# V4L2 & ION
BOARD_USE_V4L2 := false
BOARD_USE_V4L2_ION := false
BOARD_NO_OVERLAY := false
#中兴无线模块配置
# ZTE WIRELESS MODEM
BOARD_HAVE_MODEM :=true
BOARD_MODEM_VENDOR :=ZTE
BOARD_MODEM_ID :=MF210
BOARD_MODEM_HAVE_DATA_DEVICE :=true
BOARD_WITH_CALL_FUNCTION:=false
(4)system.prop 
用来配置手机的属性
# system.prop for tiny4412
#rild.libpath=/system/lib/libreference-ril.so
#rild.libargs=-d /dev/ttyS1
ro.sf.auto_lcd_density=yes
# hdmi support
persist.demo.hdmirotationlock=1
# disable strict mode
persist.sys.strictmode.disable=1
# captive portal server
ro.net.captive_server=112.124.9.243
# WCDMA Preferred
ro.telephony.default_network=0
telephony.lteOnCdmaDevice=0
ro.product.locale.language=zh
ro.product.locale.region=CN
# ro.use_data_netmgrd=true
# persist.data_netmgrd_nint=8
# ro.ril.def.agps.mode=0
# keyguard.no_require_sim=true 
(5)tiny4412-key.kl文件
android kl(key layout)文件是一个映射文件,是标准linux与anroid的键值映射文件
key 158   BACK
key 230   SOFT_RIGHT
key 60    SOFT_RIGHT
key 107   ENDCALL
key 62    ENDCALL
key 229   MENU
key 139   MENU
key 59    MENU
key 127   SEARCH
key 217   SEARCH
key 228   POUND
key 227   STAR
key 231   CALL
key 61    CALL
key 232   DPAD_CENTER
key 108   DPAD_DOWN
key 103   DPAD_UP
key 102   HOME
key 105   DPAD_LEFT
key 106   DPAD_RIGHT
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 116   POWER
key 212   CAMERA
key 353   DPAD_CENTER

2.Android源码中添加产品线

(1)在device目录下添加一个以公司名命名的文件夹,然后再在这个文件夹下为各产品分别建立对应的子文件夹。和此产品相关的所有特定文件都应该优先放置在这里。

(2)在产品目录下建立一个vendorsetup.sh脚本通常为

add_lunch_combo full_xxx_userdebug(或eng)

使得产品可以正确的被添加到编译系统中

(3)在产品目录下添加AndroidProducts.mk文件,用来做产品具体属性配置文件的一个转向。例如

PRODUCT_MAKEFILES :=         $(LOCAL_DIR)/aosp_tiny4412.mk         $(LOCAL_DIR)/full_tiny4412.mk
(4)实现上一步跳转的文件,用来配置产品的一些具体的属性。可以充分利用编译系统已有的全局变量或者函数,来完成任何需要的功能。
例如,指定编译结束后需要复制到设备系统中的各种文件、设置系统属性(系统属性最终会写入到/system/build/prop文件中)等。
#将bcmdhd.cal复制到产品系统的system/etc/wifi目录下
PRODUCT_COPY_FILES =+     device/samsung/toro/bcmdhd.cal:system/etc/wifi/bcmdhd.cal
变量 描述
PRODUCT_NAME 产品名称,最终会显示在系统设置中的"关于设备"选项中
PRODUCT_DEVICE 设备名称
PRODUCT_BRAND 产品所属品牌
PRODUCT_MANUFACTURER 产品生产商
PRODUCT_MODULE 产品型号
PRODUCT_PACKAGES 产品需要预装的一系列程序,如APKs
PRODUCT_LOCALES 所支持的国家语言。格式如下
[两个字节语言码]-[两个字节国家码]
如en_GB de_DE
各语言间以空格分隔
PRODUCT_POLICY 本产品遵循的"策略",如
android.policy_phone
android.policy_mid
PRODUCT_TAGS 一系列以空格分隔的产品描述标签
PRODUCT_PROPERTY_OVERRIDES 用于重载系统属性
格式:key=value
示例:ro.product.firmware=v0.4rc1
这些属性最终会保存在设备系统/system/build.prop文件中
PRODUCT_COPY_FILES 复制文件到设备系统的指定目录

 

(5)在产品目录下添加BoardConfig.mk,用于描述目标架构、硬件设备属性、编译器的条件标志、分区布局、boot地址、ramdisk大小等一系列参数
我们可以先复制一份(最好选择架构、主芯片相同的然后再根据产品的具体需求进行修改
(6添加Android.mk文件
LOCAL_PATH := $(call my-dir)
# if some modules are built directly from this directory (not subdirectories),
# their rules should be written here.
include $(call all-makefiles-under,$(LOCAL_PATH)) 
目录
相关文章
|
2月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
170 1
|
2月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
134 2
|
2月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
59 0
|
4天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
24 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
15天前
|
IDE Android开发 iOS开发
探索安卓与iOS系统的技术差异:开发者的视角
本文深入分析了安卓(Android)与苹果iOS两大移动操作系统在技术架构、开发环境、用户体验和市场策略方面的主要差异。通过对比这两种系统的不同特点,旨在为移动应用开发者提供有价值的见解,帮助他们在不同平台上做出更明智的开发决策。
|
15天前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
15天前
|
Ubuntu Shell API
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
Ubuntu 64系统编译android arm64-v8a 的openssl静态库libssl.a和libcrypto.a
|
1月前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
60 6
|
1月前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
1月前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
140 1