转:Android系统移植与调试之--build.prop生成过程分析

本文详细分析了Android系统中build.prop文件的生成过程,包括如何通过make系统、buildinfo.sh脚本、system.prop文件及ADDITIONAL_BUILD_PROPERTIES来定义和修改属性。
Android系统移植与调试之------->build.prop生成过程分析
本文简要分析一下build.prop是如何生成的。Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在out/target/product/<board>/system/目录下。在Android运行时刻可以通过property_get()[c/c++域] / SystemProperties_get*()[Java域]读取这些属性值。 


build.prop的生成是由make系统解析build/core/Makefile完成。


1)      Makefile中首先定义各种变量,这在下一步执行时会用到。比如:

...  
PRODUCT_DEFAULT_LANGUAGE="$(calldefault-locale-language,$(PRODUCT_LOCALES))" \  
PRODUCT_DEFAULT_REGION="$(calldefault-locale-region,$(PRODUCT_LOCALES))" \  

...  


2)      Makefile中调用build/tools/buildinfo.sh执行脚本,并输出到build.prop
Buildinfo.sh很简单,只是echo一些属性。

[html] view plain copy
  1. <span style="font-size:18px;">#!/bin/bash  
  2.   
  3. echo "# begin build properties"  
  4. echo "# autogenerated by buildinfo.sh"  
  5.   
  6. echo "ro.build.id=$BUILD_ID"  
  7. echo "ro.build.display.id=$BUILD_DISPLAY_ID"  
  8. echo "ro.build.version.incremental=$BUILD_NUMBER"  
  9. echo "ro.build.version.sdk=$PLATFORM_SDK_VERSION"  
  10. echo "ro.build.version.codename=$PLATFORM_VERSION_CODENAME"  
  11. echo "ro.build.version.release=$PLATFORM_VERSION"  
  12. echo "ro.build.date=`date`"  
  13. echo "ro.build.date.utc=`date +%s`"  
  14. echo "ro.build.type=$TARGET_BUILD_TYPE"  
  15. echo "ro.build.user=$USER"  
  16. echo "ro.build.host=`hostname`"  
  17. echo "ro.build.tags=$BUILD_VERSION_TAGS"  
  18. echo "ro.product.model=$PRODUCT_MODEL"  
  19. echo "ro.product.brand=$PRODUCT_BRAND"  
  20. echo "ro.product.name=$PRODUCT_NAME"  
  21. echo "ro.product.device=$TARGET_DEVICE"  
  22. echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"  
  23. echo "ro.product.cpu.abi=$TARGET_CPU_ABI"  
  24. if [ -n "$TARGET_CPU_ABI2" ] ; then  
  25.   echo "ro.product.cpu.abi2=$TARGET_CPU_ABI2"  
  26. fi  
  27. echo "ro.product.manufacturer=$PRODUCT_MANUFACTURER"  
  28. if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then  
  29.   echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"  
  30. fi  
  31. if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then  
  32.   echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"  
  33. fi  
  34. echo "ro.wifi.channels=$PRODUCT_DEFAULT_WIFI_CHANNELS"  
  35. echo "ro.board.platform=$TARGET_BOARD_PLATFORM"  
  36.   
  37. echo "# ro.build.product is obsolete; use ro.product.device"  
  38. echo "ro.build.product=$TARGET_DEVICE"  
  39.   
  40. echo "# Do not try to parse ro.build.description or .fingerprint"  
  41. echo "ro.build.description=$PRIVATE_BUILD_DESC"  
  42. echo "ro.build.fingerprint=$BUILD_FINGERPRINT"  
  43. echo "ro.build.characteristics=$TARGET_AAPT_CHARACTERISTICS"  
  44.   
  45. echo "# end build properties"</span>  


而,ro.product.locale.language/ ro.product.locale.region就是些属性,等号后面是值。


3)      Makefile中直接把$(TARGET_DEVICE_DIR)/system.prop的内容追加到build.prop中。


4)      收集ADDITIONAL_BUILD_PROPERTIES中的属性,追加到build.prop中。


ADDITIONAL_BUILD_PROPERTIES又会收集PRODUCT_PROPERTY_OVERRIDES中定义的属性


ADDITIONAL_BUILD_PROPERTIES:= \  
        $(ADDITIONAL_BUILD_PROPERTIES)\  

        $(PRODUCT_PROPERTY_OVERRIDES)  


通过build.prop生成过程的分析,可知哪里可以修改原有的属性或加入自己定义属性,那就是2) buildinfo.sh; 3) system.prop; 4) ADDITIONAL_BUILD_PROPERTIES或PRODUCT_PROPERTY_OVERRIDES。不过建议改在system.prop或PRODUCT_PROPERTY_OVERRIDES,这对应于具体特定平台或产品的修改。


(ps:原文地址:http://blog.youkuaiyun.com/thl789/article/details/7014300)


每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。

 

在系统初始化时,Android将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:device/system/init。“init”守护进程将启动一个属性服务。

 

属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。任何客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。 客户端应用程序可以调用libcutils中的API函数以GET/SET属性信息。libcutils的源代码位于:device/libs/cutils。API函数是:

int property_get(const char *key, char *value, const char *default_value);

int property_set(const char *key, const char *value);

 

而libcutils又调用libc中的 __system_property_xxx 函数获得共享内存中的属性。libc的源代码位于:device/system/bionic。

 

属性服务调用libc中的__system_property_init函数来初始化属性系统的共享内存。当启动属性服务时,将从以下文件中加载默认属性:

 

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

 

属性将会以上述顺序加载。后加载的属性将覆盖原先的值。这些属性加载之后,最后加载的属性会被保持在/data/property中。

 

特别属性 如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

 

如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。

 

如果属性名称以“net.”开头,当设置这个属性时,“net.change”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。 netresolve模块的使用这个属性来追踪在net.*属性上的任何变化。)

 

属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。

 

每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.<服务名>“属性中 。客户端应用程序可以轮询那个属性值,以确定结果


==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.youkuaiyun.com/ouyang_peng

==================================================================================================


<think>好的,用户想了解如何解析Android设备的ro.build属性和proc asound cards的输出信息。首先,我需要回忆一下相关的知识点。 关于ro.build属性,记得这些属性存储在系统构建配置文件中,通常可以通过adb命令获取,比如`adb shell getprop ro.build.version.release`来获取Android版本。用户可能需要知道各个属性的含义,比如ro.build.version.sdk对应API级别,ro.product.model是设备型号等。需要解释每个常用属性的作用,这样用户能理解如何查看和解析它们。 然后是proc asound cards的信息。ALSA(高级Linux声音架构)在/proc/asound目录下提供了声音设备的信息。cards文件列出了系统中的声卡,每个声卡有ID和名称。可能需要指导用户如何通过adb进入shell,然后查看/proc/asound/cards的内容,并解释输出的结构,比如声卡编号、名称和驱动模块。此外,可能还需要提到其他相关文件如pcm和devices,这些可以提供更详细的音频设备信息。 还要考虑用户的实际操作步骤。例如,用户可能需要先连接设备,开启USB调试,安装ADB工具。然后执行相应的命令来获取属性或查看proc文件。需要分步骤说明,确保用户能按步骤操作。 另外,用户提供的引用内容中有关于声卡注册和创建流程的信息,可能涉及到内核模块或驱动程序的调试。这部分可能需要提到如何通过snd_card_new创建声卡实例,以及相关数据结构,但用户的问题更偏向于查看信息而非开发驱动,所以可能不需要深入代码细节,但可以简要提及这些信息的作用,帮助用户理解输出内容。 可能用户的实际需求是调试音频问题或了解设备信息,因此需要确保回答覆盖了常用命令和关键字段的解释。同时,生成的相关问题需要考虑用户可能的后续疑问,比如如何修改属性,如何调试声卡驱动,或者如何处理音频相关问题。 需要检查是否有遗漏的步骤或常见的错误,比如权限不足无法访问/proc/asound,或者设备未正确连接导致adb命令无法执行。可能需要提醒用户确保设备已连接并授权USB调试。 最后,确保回答符合格式要求:行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,更多是命令和代码块。代码块需要用正确的语法包裹,例如使用反引号标注命令,保持结构清晰。</think>### 解析 Android 设备 ro.build 属性和 /proc/asound/cards 信息 #### 1. 查看并解析 ro.build 属性 ro.build 属性是 Android 系统构建时定义的全局属性,包含设备型号、版本号、编译信息等。通过以下步骤查看和解析: **步骤 1:连接设备并打开 ADB** ```bash $ adb devices # 确认设备已连接 ``` **步骤 2:获取所有构建属性** ```bash $ adb shell getprop | grep "ro.build" ``` 输出示例: ``` [ro.build.version.release]: [13] [ro.build.version.sdk]: [33] [ro.product.model]: [Pixel 6] [ro.build.date]: [Wed Jun 1 12:00:00 UTC 2023] ``` **关键属性解析:** - `ro.build.version.release`: Android 系统版本(如 13 对应 Android 13)[^1]。 - `ro.build.version.sdk`: 开发使用的 API 级别(如 33 对应 Android 13)。 - `ro.product.model`: 设备型号(如 Pixel 6)。 - `ro.build.date`: 系统编译时间。 --- #### 2. 解析 /proc/asound/cards 音频卡信息 `/proc/asound` 是 Linux ALSA(高级 Linux 声音架构)的虚拟文件系统目录,`cards` 文件记录了系统识别的声卡信息。 **步骤 1:进入设备 shell** ```bash $ adb shell ``` **步骤 2:查看声卡列表** ```bash $ cat /proc/asound/cards ``` 输出示例: ``` 0 [HDMI ]: HDA-Intel - HDA Intel HDMI HDA Intel HDMI at 0xefc30000 irq 16 1 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xefc28000 irq 17 ``` **字段解析:** - **声卡编号**(如 `0`、`1`): 系统分配的声卡 ID。 - **声卡名称**(如 `HDMI`、`PCH`): 声卡硬件标识。 - **驱动信息**(如 `HDA-Intel`): 声卡使用的驱动模块[^2]。 --- #### 3. 获取更详细的音频信息 可通过以下命令进一步分析: ```bash $ cat /proc/asound/devices # 查看所有音频设备节点 $ cat /proc/asound/pcm # 查看 PCM(脉冲编码调制)设备信息 ``` --- ### 相关问题 1. **如何修改 Android 设备的 ro.build 属性?** > ro.build 属性通常是只读的,需重新编译系统镜像或通过 Magisk 模块修改。 2. **如何调试 Android 声卡驱动?** > 需结合内核日志(`dmesg`)和 ALSA 工具(如 `aplay`、`arecord`)分析驱动注册和音频数据传输[^2]。 3. **`/proc/asound/cards` 未显示声卡可能是什么原因?** > 可能驱动未加载或硬件未正确识别,需检查内核配置或设备树(Device Tree)。 [^1]: 通过 ADB 获取设备信息是 Android 调试的通用方法,需确保 USB 调试已开启。 [^2]: 声卡驱动的注册流程涉及 `snd_card_new` 和芯片专用数据的初始化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值