分类: Android framework 487人阅读 评论(0) 收藏 举报 android thread server socket path jni

from: http://www.cnblogs.com/qclzdh/archive/2011/06/13/2080166.html


Android很多事件都是通过uevent跟kernel来异步通信的。其中类UEventObserver是核心。
UEventObserver接收kernel的uevent信息的抽象类。

1、server层代码
1)battery server:
frameworks/frameworks/base/services/java/com/android/server/SystemServer.java
frameworks/frameworks/base/services/java/com/android/server/BatteryService.java

2、java层代码
frameworks/base/core/java/android/os/UEventObserver.java

3、JNI层代码
frameworks/base/core/jni/android_os_UEventObserver.cpp

4、底层代码
hardware/libhardware_legacy/uevent/uevent.c
读写kernel的接口socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);

二、UEventObserver的使用


类UEventObserver提供了三个接口给子类来调用:
1、onUEvent(UEvent event)
子类必须重写这个onUEvent来处理uevent。
2、startObserving(String match)
启动进程,要提供一个字符串参数。
3、stopObserving()
停止进程。

例子:
//在BatteryService.java中
mUEventObserver.startObserving("SUBSYSTEM=power_supply");
private UEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
update();
}
};
在UEvent thread中会不停调用 update()方法,来更新电池的信息数据。
三、vold server分析

1、在system/vold/NetlinkManager.cpp中:
if ((mSock = socket(PF_NETLINK,SOCK_DGRAM,NETLINK_KOBJECT_UEVENT)) < 0) {
SLOGE("Unable to create uevent socket: %s", strerror(errno));
return -1;
}
if (setsockopt(mSock, SOL_SOCKET, SO_RCVBUFFORCE, &sz, sizeof(sz)) < 0) {
SLOGE("Unable to set uevent socket options: %s", strerror(errno));
return -1;
}
if (bind(mSock, (struct sockaddr *) &nladdr, sizeof(nladdr)) < 0) {
SLOGE("Unable to bind uevent socket: %s", strerror(errno));
return -1;
}

2、然后在system/vold/NetlinkHandler.cpp的NetlinkHandler::onEvent中处理
void NetlinkHandler::onEvent(NetlinkEvent *evt) {
VolumeManager *vm = VolumeManager::Instance();
const char *subsys = evt->getSubsystem();
if (!subsys) {
SLOGW("No subsystem found in netlink event");
return;
}
if (!strcmp(subsys, "block")) {
vm->handleBlockEvent(evt);
} else if (!strcmp(subsys, "switch")) {
vm->handleSwitchEvent(evt);
} else if (!strcmp(subsys, "battery")) {
} else if (!strcmp(subsys, "power_supply")) {
}
}

3、在system/core/libsysutils/src/NetlinkListener.cpp中监听。


四、battery server分析
java代码:
frameworks/frameworks/base/services/java/com/android/server/BatteryService.java

JNI代码:
frameworks/base/services/jni/com_android_server_BatteryService.cpp
1、BatteryService是跑在system_process当中,在系统初始化的时候启动,如下
在BatteryService.java中:
Log.i(TAG, “Starting Battery Service.”);
BatteryService battery = new BatteryService(context);
ServiceManager.addService(“battery”, battery);

2、数据来源
BatteryService通过JNI(com_android_server_BatteryService.cpp)读取数据。
BatteryService通过JNI注册的不仅有函数,还有变量。 如下:
//##############在BatteryService.java中声明的变量################
private boolean mAcOnline;
private boolean mUsbOnline;
private int mBatteryStatus;
private int mBatteryHealth;
private boolean mBatteryPresent;
private int mBatteryLevel;
private int mBatteryVoltage;
private int mBatteryTemperature;
private String mBatteryTechnology;
//在BatteryService.java中声明的变量,在com_android_server_BatteryService.cpp中共 用,即在com_android_server_BatteryService.cpp中其实操作的也是BatteryService.java中声 明的变量。
gFieldIds.mAcOnline = env->GetFieldID(clazz, “mAcOnline”, “Z”);
gFieldIds.mUsbOnline = env->GetFieldID(clazz, “mUsbOnline”, “Z”);
gFieldIds.mBatteryStatus = env->GetFieldID(clazz, “mBatteryStatus”, “I”);
gFieldIds.mBatteryHealth = env->GetFieldID(clazz, “mBatteryHealth”, “I”);
gFieldIds.mBatteryPresent = env->GetFieldID(clazz, “mBatteryPresent”, “Z”);
gFieldIds.mBatteryLevel = env->GetFieldID(clazz, “mBatteryLevel”, “I”);
gFieldIds.mBatteryTechnology = env->GetFieldID(clazz, “mBatteryTechnology”,
“Ljava/lang/String;”);
gFieldIds.mBatteryVoltage = env->GetFieldID(clazz, “mBatteryVoltage”, “I”);
gFieldIds.mBatteryTemperature = env->GetFieldID(clazz, “mBatteryTemperature”,
“I”); //上面这些变量的值,对应是从下面的文件中读取的,一只文件存储一个数值。
#define AC_ONLINE_PATH “/sys/class/power_supply/ac/online”
#define USB_ONLINE_PATH “/sys/class/power_supply/usb/online”
#define BATTERY_STATUS_PATH “/sys/class/power_supply/battery/status”
#define BATTERY_HEALTH_PATH “/sys/class/power_supply/battery/health”
#define BATTERY_PRESENT_PATH “/sys/class/power_supply/battery/present”
#define BATTERY_CAPACITY_PATH “/sys/class/power_supply/battery/capacity”
#define BATTERY_VOLTAGE_PATH “/sys/class/power_supply/battery/batt_vol”
#define BATTERY_TEMPERATURE_PATH “/sys/class/power_supply/battery/batt_temp”
#define BATTERY_TECHNOLOGY_PATH “/sys/class/power_supply/battery/technology”
3、数据传送
BatteryService主动把数据传送给所关心的应用程序,所有的电池的信息数据是通过Intent传送出去
的。
在BatteryService.java中,Code如下:
Intent intent = new Intent(Intent.ACTION_BATTERY_CHANGED);
intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
intent.putExtra(“status”, mBatteryStatus);
intent.putExtra(“health”, mBatteryHealth);
intent.putExtra(“present”, mBatteryPresent);
intent.putExtra(“level”, mBatteryLevel);
intent.putExtra(“scale”, BATTERY_SCALE);
intent.putExtra(“icon-small”, icon);
intent.putExtra(“plugged”, mPlugType);
intent.putExtra(“voltage”, mBatteryVoltage);
intent.putExtra(“temperature”, mBatteryTemperature);
intent.putExtra(“technology”, mBatteryTechnology);
ActivityManagerNative.broadcastStickyIntent(intent, null); 4、数据接收
应用如果想要接收到BatteryService发送出来的电池信息,
则需要注册一个Intent为Intent.ACTION_BATTERY_CHANGED的BroadcastReceiver。
注册方法如下:
IntentFilter mIntentFilter = new IntentFilter();
mIntentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
registerReceiver(mIntentReceiver, mIntentFilter);
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String action = intent.getAction();
if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
int nVoltage = intent.getIntExtra(“voltage”, 0);
if(nVoltage!=0){
mVoltage.setText(“V: ” + nVoltage + “mV – Success…”);
}
else{
mVoltage.setText(“V: ” + nVoltage + “mV – fail…”);
}
}
}
};
5、数据更新
电池的信息会随着时间不停变化,自然地,就需要考虑如何实时的更新电池的数据信息。在
BatteryService启动的时候,会同时通过UEventObserver启动一个onUEvent Thread。每一个 Process最多只能有一个onUEvent Thread,即使这个Process中有多个UEventObserver的实例。
当在一个Process中,第一次Call startObserving()方法后,这个UEvent thread就启动了。
而一旦这个UEvent thread启动之后,就不会停止。
//在BatteryService.java中
mUEventObserver.startObserving(“SUBSYSTEM=power_supply”);
private UEventObserver mUEventObserver = new UEventObserver() {
@Override
public void onUEvent(UEventObserver.UEvent event) {
update();
}
};

在UEvent thread中会不停调用 update()方法,来更新电池的信息数据

更多相关文章

  1. fanfou(饭否) android客户端 代码学习3
  2. Android开发实践教程
  3. Android中如何处理Sqlite查询结果中的NULL数据列?
  4. Android登录注册功能 数据库SQLite验证
  5. android SQLite数据库封装
  6. android 嵌套h5问题集锦
  7. Android(安卓)json数据解析详解及实例代码
  8. Android(安卓)数据漫游默认值的修改方法
  9. Flutter跟Android交互

随机推荐

  1. 如何在Android中启动JAVA程序
  2. android仿网易云音乐、即时通讯、bilibil
  3. Android手机操作系统中的常用术语
  4. Android相对布局实现各种梅花效果
  5. android:layout_gravity 和 android:grav
  6. 完整安卓 Android开发视频教程共10季,迅雷
  7. 有关Android手机软件详细分析
  8. iPhone和Android(安卓)UI模式比较列表
  9. 基于Android(安卓)平台简易即时通讯的研
  10. [转]android:layout_gravity 和 android: