获取设备的系统属性

1、获取设备的MAC地址

package com.skyworth.tvguideinterface.utils;

import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.Reader;

import android.bluetooth.BluetoothAdapter;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.TextUtils;

public class DeviceUtils {
	/**
	 * 获取有线mac地址
	 * @param Context
	 * @return
	 */
	public static String getMacAddr(Context ctx) {
		String macAddress = null;
		macAddress = getEthMAC();
		return macAddress;
	}

	private static String getEthMAC() {
		Reader reader = null;
		StringBuffer str = new StringBuffer();
		try {
			char[] tempchars = new char[20];
			int charread = 0;
			reader = new InputStreamReader(new FileInputStream("/sys/class/net/eth0/address"));
			while ((charread = reader.read(tempchars)) != -1) {
				if ((charread == tempchars.length)&& (tempchars[tempchars.length - 1] != '\r')) {
					System.out.print(tempchars);
				} else {
					for (int i = 0; i < charread; i++) {
						if (tempchars[i] == '\r') {
							continue;
						} else {
							str.append(tempchars[i]);
						}
					}
				}
			}
		} catch (Exception e1) {
			
		} finally {
			if (reader != null) 
				try {
					reader.close();
				} catch (Exception e1) {	}
		}

		return str.toString().trim();
	}
	
	/**
	 * 获取无线mac地址
	 * @param Context
	 * @return
	 */
	public static String getWifiMAC(Context ctx) {
		try{
			String macAddress = null;
			WifiManager wifiMgr = (WifiManager)ctx.getSystemService(Context.WIFI_SERVICE);
			WifiInfo info = (null == wifiMgr ? null : wifiMgr.getConnectionInfo());
			if (null != info) 
			    macAddress = info.getMacAddress();
			
			return macAddress;
		}catch(Exception e){
			return "";
		}
	}
	
	/**
	 * 获取蓝牙mac地址
	 * @return
	 */
	public static String getBluetoothMAC(){
		try {
			BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
			return bluetoothAdapter.getAddress();
		} catch (Exception e) {
			return "";
		}
	}
	
}

2、获取系统的一些元数据(如:内核版本、固件版本号、Android 版本)

      Build类

<span style="white-space:pre">	</span>    version[1] = Build.VERSION.RELEASE;// firmware version  
	    version[2]=Build.MODEL;//model  
	    version[3]=Build.DISPLAY;//system version  

3、persist.sys的一些信息

      连上设备,键入adb shell命令,再键入 getprop,会看到一些系统的属性。

通过SystemProperties类获取或设置
SystemProperties.set("persist.sys.country",”china”);
String seq_id = SystemProperties.get("persist.sys.hwconfig.seq_id");
String stb_id = SystemProperties.get("persist.sys.hwconfig.stb_id");



详细用法参考: http://blog.sina.com.cn/s/blog_6b936f150101jhfl.html

Android 系统属性相关ro.* & persist.*

  (2014-04-21 11:27:48)
   

1. 属性简介

Android里有很多属性(property),每个属性都有一个名称和值,他们都是字符串格式。这些属性定义了Android系统的一些公共系统属性。

[dalvik.vm.dexopt-flags]: [m=y]

[dalvik.vm.heapgrowthlimit]: [48m]

[gsm.operator.iso-country]: []

[gsm.operator.isroaming]: [false]

[gsm.operator.numeric]: []

[gsm.sim.operator.alpha]: []

[gsm.sim.operator.iso-country]: []

[gsm.sim.operator.numeric]: []

这些属性多数是开机启动时预先设定的,也有一些是动态加载的。

系统启动时以下面的次序加载预先设定属性:

/default.prop

/system/build.prop

/system/default.prop

/data/local.prop

/data/property/*

后加载的如果有重名的则覆盖前面的。

bionic/libc/include/sys/_system_properties.h
 #define PROP_PATH_RAMDISK_DEFAULT  "/default.prop"
 #define PROP_PATH_SYSTEM_BUILD     "/system/build.prop"
 #define PROP_PATH_SYSTEM_DEFAULT   "/system/default.prop"
 #define PROP_PATH_LOCAL_OVERRIDE   "/data/local.prop"

On system initialization, Android will allocates a block of shared memory for storing the properties.
 This is done in “init” daemon whose sourcecode is at: device/system/init.
 system/core/init/property_service.c 
 属性服务启动后会从系统文件中读取默认的属性,并写入共享内存中,以上4个文件为按顺序读取
 start_property_service(void)
 load_properties_from_file(PROP_PATH_SYSTEM_BUILD); 
 load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
 load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);

 

有两种属性值得一提:

(1)persist.* : persist开始的属性会在/data/property存一个副本。也就是说,如果程序调property_set设了一个以persist为前缀的属性,系统会在/data/property/*里加一个文件记录这个属性,重启以后这个属性还有。

如果property_set其它属性,因为属性是在内存里存,所以重启后这个属性就没有了。

(2)ro.* :ro为前缀的属性不能修改。

 

2. 应用程序属性使用方法

java应用里设置属性:

import android.os.SystemProperties;

SystemProperties.set("persist.sys.country",”china”);

java里取得属性:

String vmHeapSize = SystemProperties.get("dalvik.vm.heapgrowthlimit", "24m");

也可以用SystemProperties.getBooleangetInt等。

 

native C中设置属性:

#include "cutils/properties.h"

property_set("vold.decrypt", "trigger_load_persist_props");

C中取得属性:

  char encrypted_state[32];

  property_get("ro.crypto.state", encrypted_state, "");

最后一个参数是默认值。

 

3. 启动脚本中属性使用方法

一般property启动应该加在init..rc而不是直接init.rc里。下面是一个init.rc里的例子:

# adbd on at boot in emulator

on property:ro.kernel.qemu=1

start adbd

意思是如果ro.kernel.qemu=1,也就是当前是模拟器的话,则启动adb服务。

 

4. property权限

只有有权限的进程才能修改属性,要不随便写一个就改系统属性那当黑客也太容易了。

权限在system/core/init/property_service.c里定义:

property_perms[] = {

    { "net.rmnet0.",      AID_RADIO,    0 },

    { "net.gprs.",        AID_RADIO,    0 },

    { "net.ppp",          AID_RADIO,    0 },

    { "net.qmi",          AID_RADIO,    0 },

    { "ril.",             AID_RADIO,    0 },

    { "gsm.",             AID_RADIO,    0 },

    { "persist.radio",    AID_RADIO,    0 },

    { "net.dns",          AID_RADIO,    0 },

    { "net.",             AID_SYSTEM,   0 },

    { "dev.",             AID_SYSTEM,   0 },

    { "runtime.",         AID_SYSTEM,   0 },

    { "hw.",              AID_SYSTEM,   0 },

    { "sys.",             AID_SYSTEM,   0 },

    ...

其实一般应用程序都不会去修改系统属性,所以也不用太在意。


5. 属性实现原理

属性初始化的入口点是property_init ,在system/core/init/property_service.c中定义。它的主要工作是申请32k共享内存,其中前1k是属性区的头,后面31k可以存247个属性(受前1k头的限制)。property_init初始化完property以后,加载/default.prop的属性定义。

其它的系统属性(build.prop, local.prop,…)在start_property_service中加载。加载完属性服务创建一个socket和其他进程通信(设置或读取属性)。

Init进程poll属性的socket,等待和处理属性请求。如果有请求到来,则调用handle_property_set_fd来处理这个请求。在这个函数里,首先检查请求者的uid/gid看看是否有权限,如果有权限则调property_service.c中的property_set函数。

property_set函数中,它先查找就没有这个属性,如果找到,更改属性。如果找不到,则添加新属性。更改时还会判断是不是“ro”属性,如果是,则不能更改。如果是persist的话还会写到/data/property/中。

最后它会调property_changed,把事件挂到队列里,如果有人注册这个属性的话(比如init.rcon property:ro.kernel.qemu=1),最终会调它的会调函数。

property名字长度限制是32字节,值的限制是92字节。不知道是google怎么想的 — 一般都是名字比值长得多!比如[dalvik.vm.heapgrowthlimit]: [48m]




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值