1.什么是Android属性?
属性(property)系统对Android来说是一个重要的功能。他作为一个系统服务管理着系统的配置和状态,所有的这些系统配置和状态都是属性(property)。属性(property)是一对键/值(key/value)组合,键和值都是字符串类型。总体感觉属性系统非常像Windows的注册表的功能。Androd中非常多的应用程序和库直接或者间接的依赖于属性系统,并由此决定其运行期的行为。例如:adbd进程通过属性来决定是否当前运行在模拟器中。再比如:java.io.File.pathSeparator方法返回存储在属性服务中的值。
Android属性系统由有三个进程,一组属性文件和一块共享内存组成。这块共享内存保存着系统中所有的属性记录,只有Property service能写这块共享内存,并且Property service负责将属性文件中的属性记录加载到共享内存中。

2.ROM源码里的属性初始值

请参见:http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/
在/build/target/product目录下每个文件定义了一个组合,我们只要继承这些预置的定义,然后再覆盖自己想要的变量定义即可。例如:

继承 full_base.mk 文件中的定义

(callinherit−product,(callinherit−product,(SRC_TARGET_DIR)/product/full_base.mk)
# 覆盖其中已经定义的一些变量
PRODUCT_NAME := full_lt26
PRODUCT_DEVICE := lt26
PRODUCT_BRAND := Android
PRODUCT_MODEL := Full Android on LT26

产品版本定义文件中的变量及其说明
常量 说明
PRODUCT_NAME 最终用户将看到的完整产品名,会出现在“关于手机”信息中。
PRODUCT_MODEL 产品的型号,这也是最终用户将看到的。
PRODUCT_LOCALES 该产品支持的地区,以空格分格,
例如:en_GB de_DE es_ES fr_CA。
PRODUCT_PACKAGES 该产品版本中包含的 APK 应用程序,以空格分格,
例如:Calendar Contacts。
PRODUCT_DEVICE 该产品的工业设计的名称。
PRODUCT_MANUFACTURER 制造商的名称。
PRODUCT_BRAND 该产品专门定义的商标(如果有的话)。
PRODUCT_PROPERTY_OVERRIDES 对于商品属性的定义。
PRODUCT_COPY_FILES 编译该产品时需要拷贝的文件,以“源路径 : 目标路径”的形式。
PRODUCT_OTA_PUBLIC_KEYS 对于该产品的 OTA 公开 key 的列表。
PRODUCT_POLICY 产品使用的策略。
PRODUCT_PACKAGE_OVERLAYS 指出是否要使用默认的资源或添加产品特定定义来覆盖。
PRODUCT_CONTRIBUTORS_FILE HTML 文件,其中包含项目的贡献者。
PRODUCT_TAGS 该产品的标签,以空格分格。

3.Android系统里读取流程

属性读取进程(property consumer)把这块共享内存映射到自己的进程空间,然后直接读取它。属性设置进程(property setter)也加载这块共享到他的进程空间,但是他不能直接写这块共享内存。当他需要增加或者修改属性的时候,通过Unix Socket发生属性给Property service,Property service将代表设置进程写入共享内存和属性文件。
Property service运行于init进程中。init进程首先创建一块共享内存,并把他的句柄fd存放在这块内存中,init进程通过mmap带MAP_SHARE标志的系统调用,把这块内存映射到他的虚拟空间中,最终这块内存所有的更新将会被所有映射这块共享内存的进程看到。共享内存句柄fd和共享内存大小存储在系统环境变量“ANDROID_PROPERTY_WORKSPACE”中,所有的进程包括属性设置进程和属性读取进程都将通过这个系统环境变量获得共享内存的句柄fd和大小,然后把这块内存映射到他们自己的虚拟空间。
然后,init进程将会从以下文件中加载属性:

1: /default.prop
2: /system/build.prop
3: /system/default.prop
4: /data/local.prop
下一步是启动Property service。这步中,将会创建一个Unix Socket服务器,这个Socket有一个闻名的名称“/dev/socket/property_service”。最后init进入死循环,等待socket的连接请求。
在读取进程中,当它初始化libc库的时候,将会获得属性系统共享内存的句柄和大小(bionic/libc/bionic/libc_init_common.c __libc_init_common函数)。并把这块共享内存映射到自己的进程虚拟空间中(bionic/libc/bionic/system_properties.c __system_properties_init函数)。这样读取进程将会向访问普通内存一样访问属性系统的共享内存了。
当前,属性不能被删除。也就是说一旦属性被创建,将不可以被删除,但是它们可以被修改。

3.怎样获得和设置属性
在Android中有三种方式来设置和获取属性,两种方式读取:

1、Native代码
当编写Native的程序时,可以使用property_get和property_set API来获得和设置属性。使用这两个API必须要包含头文件cutils/properties.h和链接libcutil库。

2、Java代码
Android在Java库中提供System.getProperty和System.setProperty方法,我们Java程序可以通过他们来设置和获得属性。
但是请注意!虽然从语法上面看Java的代码和Native代码非常相近,但是Java版本存储把属性存在其他地方,而不是我们上面提到的属性系统中。在JVM中有一个hash表来维护Java的属性。所以Java属性和Android属性是不同的,不能用Java API(System.getProperty和System.setProperty)来设置系统属性。也不能通过Native的方法(property_get和property_set)设置Java的属性。
Andrew指出android.os.SystemProperties可以操作Android系统属性(虽然这个类倾向于内部使用)。这个类通过JNI调用Native的property_get和property_set方法来获得和设置属性。

3、Shell脚本
Android提供了命令行工具setprop和getprop来设置和获取属性,他们可以在脚本中被使用。

Shell脚本:
adb shell getprop
看到结果(所有值):
……

adb shell getprop ro.product.brand
rockchip
即可以看到brand属性。

代码里实现见Demo:

4、直接读取文件
// 获取build.prop中的指定属性
public String GetBuildProproperties(String PropertiesName) {  String name = "";try    {        InputStream is = new BufferedInputStream(new FileInputStream(new File("/system/build.prop")));
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String strTemp = "";
while ((strTemp = br.readLine()) != null)
{// 如果文件没有读完则继续           if (strTemp.indexOf(PropertiesName) != -1)  {  name = strTemp.substring(strTemp.indexOf("=") + 1);  break;}
}      br.close();
is.close();
}catch (Exception e){
if (e.getMessage() != null)  System.out.println( e.getMessage());      else           e.printStackTrace();     }
return name;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
5.使用系统方法:android.os.Build(只读)客户端在代码里如下方法即可读取,(需要注意的是,修改了文件之后,不能立即读取,需要重启设备才能起作用):public  String systembuildInfo() {return android.os.Build.BRAND;
/*String phoneInfo = "Product: " + android.os.Build.PRODUCT;phoneInfo += ", CPU_ABI: " + android.os.Build.CPU_ABI;phoneInfo += ", TAGS: " + android.os.Build.TAGS;phoneInfo += ", VERSION_CODES.BASE: " + android.os.Build.VERSION_CODES.BASE;phoneInfo += ", MODEL: " + android.os.Build.MODEL;phoneInfo += ", SDK: " + android.os.Build.VERSION.SDK;phoneInfo += ", VERSION.RELEASE: " + android.os.Build.VERSION.RELEASE;phoneInfo += ", DEVICE: " + android.os.Build.DEVICE;phoneInfo += ", DISPLAY: " + android.os.Build.DISPLAY;phoneInfo += ", BRAND: " + android.os.Build.BRAND;phoneInfo += ", BOARD: " + android.os.Build.BOARD;phoneInfo += ", FINGERPRINT: " + android.os.Build.FINGERPRINT;phoneInfo += ", ID: " + android.os.Build.ID;phoneInfo += ", MANUFACTURER: " + android.os.Build.MANUFACTURER;phoneInfo += ", USER: " + android.os.Build.USER;return phoneInfo;*/}

Android Build 获取手机信息相关推荐

  1. android 获取手机信息工具类

    package com.yqy.yqy_listviewheadview;import android.content.Context; import android.telephony.Teleph ...

  2. Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据

    获取手机信息,代码复制可用,开发工具为:Android Studio 1.手机品牌 2.手机型号 3.屏幕分辨率 4.像素密度 5.屏幕尺寸 6.Android 系统版本 7.运行内存 8.储存空间 ...

  3. android开发获取手机,通过ADB获取Android手机信息,获取手机信息

    通过ADB获取Android手机信息,获取手机信息 原文:https://blog.csdn.net/fasfaf454/article/details/51438743 1.获取手机系统信息( CP ...

  4. android 6.0获取手机imei,android获取手机信息大全,android获取大全,IMEI号,IESI号,...

    android获取手机信息大全,android获取大全,IMEI号,IESI号, IMEI号,IESI号,手机型号: [java] view plaincopyprint?private void g ...

  5. Android中获取手机中的联系人信息

    #Android中获取手机中的联系人信息 1.0.查看系统通讯录的表,表路径:data->data->com.android.providers.contacts->database ...

  6. Android之获取手机内部及sdcard存储空间

    Android之获取手机内部及sdcard存储空间 文章链接 知识点: 内部存储空间获取总大小和可用大小: sdcard存储空间获取总大小和可用大小: 新名词记录{StatFs:描述文件系统信息的类} ...

  7. [获取手机信息]-通过 ADB 命令获取手机信息

    ################################################## 目录 通过 ADB 命令获取手机信息 ADB 常用查看命令 使用 -l 查看设备详细信息 查看机型 ...

  8. android 自动获取手机验证码

    真的很奇怪大家的复制粘贴功能,一篇自动获取手机验证码的文章各大平台争相转发,我以为很牛逼,到后来发现不能用,可能我技术不够吧,复制粘贴还不到家. android 自动获取手机验证码好处 :① 用户不用 ...

  9. android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法

    android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法 1)获取运营商sim卡imsi号: String android_imsi = telephonyManager.getSub ...

最新文章

  1. 机器学习是科学还是“炼金术”?
  2. 2015年12月流量入口占比动态:仅直接访问实现上涨
  3. 多线程解决rospy.spin()语句之后,程序不再往下执行问题
  4. 深度学习在gilt应用——用图像相似性搜索引擎来商品推荐和服务属性分类
  5. js 字符串转成货币格式, js转货币
  6. 如何看待Scrum Sprint Backlog冻结和变化?
  7. 理解至上:二叉堆与优先队列详细用法
  8. 怎样成为一个好的技术领导者
  9. 私有CA的创建和证书的申请
  10. android SDK安装以及环境变量配置
  11. gitlab在push代码的时候报错
  12. 用python画图代码-【Matplotlib】利用Python进行绘图
  13. 微信小程序客服可以直接在手机回复吗,小程序客服功能怎么用手机回复,微信小程序客服手机版
  14. win10如何打开计算机窗口,处理win10中电脑任务栏不显示打开窗口的方法
  15. android打开手机自带浏览器,【Appium】打开手机自带的浏览器
  16. php时区问题,php时区问题
  17. html简繁替换,Web界面简繁体转换
  18. 基于STM32F407的测距模块HY-SRF05轮询开发
  19. 高等数学上:函数的极限(重难点)
  20. conda failed to create process

热门文章

  1. pdf转json_如何显著缩小PDF文件大小?
  2. 【算法系列】数据预处理全面介绍
  3. 【C++】加油站加油
  4. python数据类型的转化和获取
  5. 软电话HTML界面,软电话条(webRTC)对接
  6. UI设计规范-全文篇
  7. anbox 使用情况_Anbox 实现分析 2:I/O 模型
  8. 缘起和性空-佛教对自然的看法(转载整理)
  9. getch计算机错误,为什么getch()在C中抛出一个错误
  10. 如何将两个excel表格合并