android框架开发之运行时可配置接口
来源:互联网 发布:移动oa知乎 编辑:程序博客网 时间:2024/05/01 22:11
用户态代码运行时可配置,是指不需要重新编译代码。
以前framework运行时可配只能通过读属性值,属性值可以在init.rc或system.prop里赋值, 但对于需要配置大量数据的情景不怎么合适。虽说原则是framework尽量保持不变,让hal变化来适应驱动的变化,但目前来看,hal层变化有人也嫌麻烦(竟然还要考虑以后用框架的人可能不想编译代码),干脆只有配置文件变化。
但如果每个模块都自己写解析配置文件的代码,那就太傻了, 又于是便产生了ConfManager这个东西。各模块按ConfManager的要求写配置文件,然后就可以通过ConfManager的傻瓜接口读到。
ConfManager.h接口定义, 用c++实现, 提供c和c++接口。 如果java层也有需求,后续再打通jni:
#ifndef ANDROID_CONFMANAGER_H
#define ANDROID_CONFMANAGER_H
#ifdef __cplusplus
namespace android {
class ConfManagerPriv;
class ConfManager
{
public:
ConfManager(const char* file_name);
~ConfManager();
bool getIntConf(const char* key,int* value);
bool getStringConf(const char* key,char* value,int size);
bool getArrayConf(const char* key,int value[],int size);
private:
bool loadCfg(const char* file_name);
void dump();
ConfManagerPriv *priv;
};
//----------------------------------------------------------------------------
}; // namespace android
extern "C" {
#endif
typedef void* CONF_HANDLE;
CONF_HANDLE cconf_init(const char* file_name);
void cconf_delete(CONF_HANDLE handle);
bool cconf_getIntConf(CONF_HANDLE handle, const char* key, int* value);
bool cconf_getStringConf(CONF_HANDLE handle, const char* key, char* value, int size);
bool cconf_getArrayConf(CONF_HANDLE handle, const char* key, int value[], int size);
#ifdef __cplusplus
};
#endif
#endif
用例:平台硬件稍有变化,或者用了不同的电池, 系统的电压和电量的关系都会有微妙的变化。 所以电压电量对应表想要运行时可配
Battery.xml:
<?xmlversion="1.0" encoding="utf-8"?>
<battery>
<int name="cat" value="10" />
<string name="fish" value="bird" />
<array name="battery.map_powered.v"
value="3400,3600,3700,3725,3750,3775,3800,3825,3850,3875,3900,3925,3950,3975,4000,
4025,4050,4075,4010,4125,4200"/>
<array name="battery.map_powered.c"
value="15 ,15 ,15 ,15 ,20 ,25 ,30 ,35 ,40 ,45 ,50 ,55 ,60 ,65 ,70 ,75 ,80 ,85 ,
90 ,95 ,100" />
<array name="battery.map_unpowered.v"
value="3400,3475,3550,3575,3600,3625,3650,3675,3700,3725,3750,3800,3825,3850,3875,
3900,3925,3925,3930,3940,3950" />
<arrayname="battery.map_unpowered.c"
value="0 ,5 ,10 ,15 ,20 ,25 ,30 ,35 ,40 ,45 ,50 ,55 ,60 ,65 ,70 ,75 ,80 ,85 ,
90 ,95 ,100" />
</battery>
在batteryhal层battery.c中通过ConfManager接口获取配置:
staticint open_battery(const struct hw_module_t *module, char const *name,
struct hw_device_t **device)
{
int tmp[CAPACITY_MAP_SIZE];
int i, j;
CONF_HANDLE handle = cconf_init("/etc/battery.xml");
cconf_getArrayConf(handle, "battery.map_powered.v", tmp, CAPACITY_MAP_SIZE);
for(i = 0; i < CAPACITY_MAP_SIZE; i++){
gCapacityMap_powered[i][0] = tmp[i];
}
cconf_getArrayConf(handle, "battery.map_powered.c", tmp, CAPACITY_MAP_SIZE);
for(i = 0; i < CAPACITY_MAP_SIZE; i++){
gCapacityMap_powered[i][1] = tmp[i];
}
cconf_getArrayConf(handle, "battery.map_unpowered.v", tmp, CAPACITY_MAP_SIZE);
for(i = 0; i < CAPACITY_MAP_SIZE; i++){
gCapacityMap_unpowered[i][0] = tmp[i];
}
cconf_getArrayConf(handle, "battery.map_unpowered.c", tmp, CAPACITY_MAP_SIZE);
for(i = 0; i < CAPACITY_MAP_SIZE; i++){
gCapacityMap_unpowered[i][1] = tmp[i];
}
cconf_delete(handle);
…………
}
- android框架开发之运行时可配置接口
- Android之开发框架androidannotations使用配置
- Android之数据库—— 一个可配置的简易框架
- Asp.net 面向接口可扩展框架之核心容器
- 【Android - 框架】之可悬浮列表StickyHeadersRecyclerView
- Microsoft Dynamic CRM开发可配置接口(WCF/Webservice)
- Android开发 之 运行权限
- CC:可关联生命周期的android组件化开发框架
- Android 开发之SurfaceView框架
- Android之常用开发框架
- Android之常用开发框架
- android开发步步为营之71:CoordinatorLayout+AppBarLayout+RecyclerView+ViewPager打造可上下左右滑动的App主框架
- Android框架之快速开发框架xUtil
- Android框架之网络开发框架Volley
- 开发可配置系统
- android开发之activity运行时添加fragment
- android开发之activity运行时添加fragment
- Android开发之6.0运行时权限处理
- Oracle里读取Blob/Clob 乱码的解决办法
- 推荐一种英语听力筑基训练方法
- 一个静态库框架模板: iOS Universal Framework Mk 7
- 我们为什么要关注MapReduce?
- 记下这个下载VC助手的地方
- android框架开发之运行时可配置接口
- 因本人最近手头紧,特此将本人爱车忍痛出售,请各位朋友谨慎出价。。现附照片
- C#泛型的研究
- C#的REPORTVIEW通用框架
- SQLServer游标使用
- 列出Android设备中所有启动的服务,及判断某个服务是否开启
- Oracle RAC 日志存放路径
- Android Tips
- memcached安装和启动