淘宝网站怎么做的好看,有没有什么排版的网站,设计公司排名,深圳网站建设高端一、为什么需要Framwork?
Framework实际上是⼀个应⽤程序的框架#xff0c;提供了很多服务#xff1a;
1、丰富⽽⼜可扩展的视图#xff08;Views#xff09;#xff0c; 可以⽤来构建应⽤程序#xff0c;它包括列表#xff08;lists#xff09;#xff0c;⽹格提供了很多服务
1、丰富⽽⼜可扩展的视图Views 可以⽤来构建应⽤程序它包括列表lists⽹格grids⽂本框text boxes按钮buttons甚⾄可嵌⼊的web浏览器。 2、内容提供器Content Providers 使得应⽤程序可以访问另⼀个应⽤程序的数据如联系⼈数据库或者共享它们⾃⼰的数据 3、资源管理器Resource Manager 提供⾮代码资源的访问如本地字符串图形和布局⽂件layout files。 4、通知管理器Notification Manager 使得应⽤程序可以在状态栏中显⽰⾃定义的提⽰信息。 5、活动管理器Activity Manager ⽤来管理应⽤程序⽣命周期并提供常⽤的导航回退功能。 二、应用层访问硬件如何自定义系统Service
1、应用层如何访问硬件 1Linux 对于Linux来说的话就比较简单应用层的APP直接通过open一类的接口直接访问我们底层的驱动文件
2Android 对于Android来说的话它就会有多种方式去访问 1 APP ----- JNI ----- Kernel 这种就很直接明了上层app访问JNI再去访问kernel 2APP ----- Service ----- JNI ----- Kernel 当我们要往系统里添加一个硬件的话我们更希望把它封装为一个系统的服务就可以以这种方式去访问到底层 3APP ----- Service ----- JNI ----- HAL ----- Kernel 一些驱动厂商的一个源码呢他是不希望开放给我们的一个开发者是吧但是他们又依赖着Android的开源框架所以就有一种比较好的方法既不需要公开源码又可以实现同样的功能。就是把它封装成库这样可以让厂家去提供一个现成的库然后我们直接去使用他就不用开放这一层的源码这就是HAL层的存在意义。 为什么需要JNI 应⽤使⽤java编写驱动⼀般使⽤c/cpp编写提供⼀种Java访问c/cpp的⽅法。也就是Java代码可通过JNI接⼝调⽤C/C⽅法。 JNI开发流程的步骤 1编写JNI⽅法表并注册 2实现JNI的.c⽂件 2、自定义系统Service Framework还有一个很重要的功能就是系统server。所有的硬件呢都是通过我们的系统server去进行管理那我们怎样为我们的硬件接口去添加一个自定义的系统serve呢 1建立aidl通信接口 2在system_server中注册service到servicemanager 3实现service对应aidl中的接口函数。 4client向servicemanager请求service成功后调用aidl接口函数建立client进程和service进程的通信关系。 总结来说就是 1system_server完成注册功能 2servicemanager完成服务管理功能 3aidl完成通讯功能 1建立aidl通信接口
在frameworks/base/core/java/android/os/路径下新建对应名称的一个aidl文件
下面我们以顾凯歌的一个蓝牙模块的服务为大家举例
路径frameworks/base/core/java/android/os/IGocsdkService.aidl
因为他是Interface的一个接口所有在前面加个 I package android.os; interface IEmbededService {interface IFmService {//蓝牙状态回调注册去注销 void registerCallback(IGocsdkCallback callback);// 注销蓝牙状态void unregisterCallback(IGocsdkCallback callback);//注释后面带的为操作后相应的回调回复//蓝牙协议软复位 ---》 onInitSucceed()void restBluetooth();//获取本地蓝牙名称 ---》onCurrentDeviceName()void getLocalName();//设置本地蓝牙名称 ---》onCurrentDeviceName()void setLocalName(String name); ..................//等等一些都为接口函数会在下面实现}
编译到系统
路径frameworks/base/Android.mk diff --git a/android/frameworks/base/Android.bp b/android/frameworks/base/Android.bp
old mode 100644
new mode 100755
index d8a7f06..953759c
--- a/android/frameworks/base/Android.bpb/android/frameworks/base/Android.bp-265,6 265,11 java_defaults {core/java/android/os/IRecoverySystemProgressListener.aidl,core/java/android/os/IRemoteCallback.aidl,core/java/android/os/ISchedulingPolicyService.aidl,core/java/android/os/IGocsdkService.aidl,:statsd_aidl,core/java/android/os/ISystemUpdateManager.aidl,core/java/android/os/IThermalEventListener.aidl,2在system_server中注册EmbededServicer到servicemanager
路径frameworks/base/services/java/com/android/server/SystemServer.java
使用ServiceManager.addService添加我们自定义的server -1097,6 1097,13 public final class SystemServer {
}Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); try { Slog.i(TAG, IGocsdkService); ServiceManager.addService(gocsdkService , new GocsdkService()); } catch (Throwable e) { Slog.e(TAG, Failure starting Gocsdk Service, e); }3实现EmbededService对应aidl中的接⼝函数
路径frameworks/base/services/java/com/android/server/EmbededService.java
package com.android.server;
import android.content.Context;
import android.os.IGocsdkService;
import android.util.Slog;
public class GocsdkService extends IGocsdkService.Stub {private static final String TAG GocsdkService;GocsdkService(){Slog.i(TAG,GocsdkService init);}public void registerCallback(IGocsdkCallback callback){return xxx;}public void unregisterCallback(IGocsdkCallback callback){return xxx;}public void getLocalName(){return xxx;}.......................
}
4在app中使⽤IEmbededService的大致流程如下 很好理解吧把我们对应的一个服务导入然后去初始化一个类然后通过ServiceManager去找到我们自定义的这个server然后使用自定义服务的函数获取数据。
import android.os.IGocsdkService; //导入private IGocsdkService mGocsdkService null; //初始化类
mGocsdkService IGocsdkService .Stub.asInterface(ServiceManager.getService(gocsdkService));int version mEmbededService.getLocalName();
String text String.value(localName);
5编译service烧录
直接全sdk编译防止有遗漏
6验证
使⽤service list查看是否有EmbededService
xxx:/ $ service list | grep gocsdkServicegocsdkService: [android.os.IGocsdkService]
三、为什么需要Android HAL Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件⼚商为了保护⾃⼰硬件⽅⾯的各项参数不被外泄⽽⼀个设备的驱动程序包含了硬件的⼀些重要参数所以驱动的开源势必会使硬件⼚商蒙受损失Google为了保护硬件⼚商的利益所以在Android系统中加⼊了HAL层,在HAL层中不必遵循GPL协议所以代码可以封闭。 所以如果硬件驱动开源的写在Kernel⾥Framework直接调⽤,⽽不愿意开源的就写在HAL层⾥实现闭源。也就是说编写驱动分为两个部分⼀个是HAL层的驱动代码⼀个是Kernel层的驱动代码。 1、内核实现HAL驱动的⽅法有两种
1采⽤直接调⽤so动态链接库⽅式 采⽤共享库形式在编译时会调⽤到。由于采⽤function call形式调⽤因此可被多个进程使⽤但会被mapping到多个进程空间中造成浪费同时需要考虑代码能否安全重⼊的问题。 2采⽤Stub代理⽅式调⽤ 采⽤HAL module和HAL stub结合形式HAL stub不是⼀个share library编译时 上层只拥有访问HAL stub的函数指针并不需要HAL stub。上层通过HAL module提供的统⼀接⼝获取并操作HAL stubso⽂件只会被mapping到⼀个进程也不存在重复mapping和重⼊问题。 2、如何编写HAL层驱动 我们现在一般都是采用第二种方式基于HAL框架提供了三个结构体分别为hw_device_t、hw_module_t、hw_module_methods_t编写HAL层驱动则是依据这三个结构体作扩展我们创建⾃⼰驱动的device_tmodule_t代码并且写hw_module_methods_t这个结构体中⽅法的实现代码最后JNI层通过hw_get_module调⽤。 1在 android/hardware/libhardware/modules/xxx 路径下创建我们的HAL文件夹例如LED
mkdirhardware/libhardware/modules/ledpathhardware/libhardware/include/hardware/led_hal.h
pathhardware/libhardware/modules/embeded/led_hal.c
1led_hal.c:
#define LOG_TAG dLed
#include hardware/hardware.h
#include hardware/led_hal.h
#include fcntl.h
#include errno.h
#include cutils/log.h
#include cutils/atomic.h
#define DEVICE_NAME sys/led/embeded_blue_led
#define MODULE_NAME EmLed/*设备打开和关闭接⼝*/
static int embededled_device_open(const struct hw_module_t* module, const
char* name, struct hw_device_t** device);
static int embededled_device_close(struct hw_device_t* device);/*设备访问接⼝*/
static int embededled_set_val(struct embededled_device_t* dev, int val);
static int embededled_get_val(struct embededled_device_t* dev, int* val);
static int embededled_device_open(const struct hw_module_t* module, const
char* name, struct hw_device_t** device) {struct embededled_device_t* dev;dev (structembededled_device_t*)malloc(sizeof(struct embededled_device_t));if(!dev) {ALOGI(embededled Stub: failed to alloc space);return -EFAULT;}memset(dev, 0, sizeof(struct embededled_device_t));//初始化设备相关信息实现访问接⼝函数dev-common.tag HARDWARE_DEVICE_TAG;dev-common.version 0;dev-common.module (hw_module_t*)module;dev-common.close embededled_device_close;dev-set_val embededled_set_val;dev-get_val embededled_get_val;if((dev-fd open(DEVICE_NAME, O_RDWR)) -1) {ALOGI(embededled Stub: failed to opensys/embededled/embeded_blue_led -- %s., strerror(errno));free(dev);return -EFAULT;}int status 0;write(dev-fd, status, sizeof(status));*device (dev-common);ALOGI(embededled Stub: open sys/embededled/embeded_blue_ledsuccessfully.);return 0;
}static int embededled_device_close(struct hw_device_t* device) {struct embededled_device_t* embededled_device (structembededled_device_t*)device;if(embededled_device) {close(embededled_device-fd);free(embededled_device);}return 0;
}static int embededled_set_val(struct embededled_device_t* dev, int val) {ALOGI(embededled Stub: set value %d to device., val);write(dev-fd, val, sizeof(val));return 0;}static int embededled_get_val(struct embededled_device_t* dev, int* val) {
if(!val) {ALOGI(embededled Stub: error val pointer);return -EFAULT;
}read(dev-fd, val, sizeof(*val));ALOGI(embededled Stub: get value %d from device, *val);return 0;
}/*模块⽅法表*/
static struct hw_module_methods_t embededled_module_methods {
open: embededled_device_open
};/*模块实例变量*/
struct embededled_module_t HAL_MODULE_INFO_SYM {
common: {tag: HARDWARE_MODULE_TAG,version_major: 1,version_minor: 0,id: EMBEDEDLED_HARDWARE_MODULE_ID,name: MODULE_NAME,author: MODULE_AUTHOR,methods: embededled_module_methods,
}
};
led_hal.h: pathhardware/libhardware/include/hardware/led_hal.h
#ifndef ANDROID_LED_INTERFACE_H
#define ANDROID_LED_INTERFACE_H
#include hardware/hardware.h
__BEGIN_DECLS
/*定义模块ID*/
#define EMBEDEDLED_HARDWARE_MODULE_ID led_hal
/*硬件模块结构体*/
struct led_module_t {struct hw_module_t common;
};
/*硬件接⼝结构体*/
struct embededled_device_t {struct hw_device_t common;int fd;int (*set_val)(struct led_device_t* dev, int val);int (*get_val)(struct led_device_t* dev, int* val);
};
__END_DECLS
#endif
四、JNI层添加
JNI开发流程的步骤 第1步编写JNI⽅法表并注册 第2步实现JNI的.c⽂件 里面呢就是我们要实现的三个函数然后再把对应的方法注册到我们的server里面去 Android.mk 1 diff --git a/frameworks/base/services/core/jni/Android.mkb/frameworks/base/services/core/jni/Android.mk
2 index 0f0124bd46..305773298a 100644
3 --- a/frameworks/base/services/core/jni/Android.mk
4 b/frameworks/base/services/core/jni/Android.mk
5 -36,6 36,7 LOCAL_SRC_FILES \
6 $(LOCAL_REL_DIR)/com_android_server_UsbHostManager.cpp \
7 $(LOCAL_REL_DIR)/com_android_server_VibratorService.cpp \
8 $(LOCAL_REL_DIR)/com_android_server_PersistentDataBlockService.cpp \
9 $(LOCAL_REL_DIR)/com_android_server_EmbededLedService.cpp \
10 $(LOCAL_REL_DIR)/onload.cpp
11
12 LOCAL_SRC_FILES \ 把注册JNI⽅法函数添加到系统中 1 diff --git a/frameworks/base/services/core/jni/onload.cppb/frameworks/base/services/core/jni/onload.cpp
2 index d5861f8c41..b52f7917fd 100644
3 --- a/frameworks/base/services/core/jni/onload.cpp
4 b/frameworks/base/services/core/jni/onload.cpp
5 -47,6 47,7 intregister_android_server_PersistentDataBlockService(JNIEnv* env);
6 int register_android_server_Watchdog(JNIEnv* env);
7 int register_android_server_HardwarePropertiesManagerService(JNIEnv* env);
8 int register_com_android_server_rkdisplay_RkDisplayModes(JNIEnv* env);
9 int register_android_server_EmbededLedService(JNIEnv* env);
10 };
11
12 using namespace android;
13 -89,7 90,6 extern C jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
14 register_android_server_Watchdog(env);
15 register_android_server_HardwarePropertiesManagerService(env);
16 register_com_android_server_rkdisplay_RkDisplayModes(env);
17 -
18 -
19 register_android_server_EmbededLedService(env);
20 return JNI_VERSION_1_4;
21 } 然后按照同样的方法去建立AIDLService 1、AIDL 1 package android.os;
2
3 interface IEmbededLedService {
4 void setVal(int val);
5 int getVal();
6 } 添加下⾯mk⽂件内容后编译⽣成接⼝ 1 diff --git a/frameworks/base/Android.mk b/frameworks/base/Android.mk
2 index b9692de0e1..c426a3cd99 100755
3 --- a/frameworks/base/Android.mk
4 b/frameworks/base/Android.mk
5 -240,6 240,7 LOCAL_SRC_FILES \
6 core/java/android/os/IUpdateLock.aidl \
7 core/java/android/os/IUserManager.aidl \
8 core/java/android/os/IVibratorService.aidl \
9 core/java/android/os/IEmbededLedService.aidl \
10 core/java/android/os/IDisplayDeviceManagementService.aidl \
11 core/java/android/os/IRkDisplayDeviceManagementService.aidl \
12 core/java/android/security/IKeystoreService.aidl \ 2、Service frameworks/base/services/java/com/android/server/EmbededLedService.java 1 package com.android.server;
2 import android.content.Context;
3 import android.os.IEmbededLedService;
4 import android.util.Slog;
5 public class EmbededLedService extends IEmbededLedService.Stub {
6 private static final String TAG EmbededLedService;
7 EmbededLedService() {
8
9 boolean status init_native();
10 Slog.i(TAG,EmbededLedService Stub initstatus);
11 }
12 public void setVal(int val) {
13 setVal_native(val);
14 }
15 public int getVal() {
16 return getVal_native();
17 }
18
19 //JNI⽅法
20 private static native boolean init_native();
21 private static native void setVal_native(int val);
22 private static native int getVal_native();
23 }; 3、添加Service到System启动 1 diff --git
a/frameworks/base/services/java/com/android/server/SystemServer.java
b/frameworks/base/services/java/com/android/server/SystemServer.java
2 index cc6f1850e6..b22ecda734 100644
3 --- a/frameworks/base/services/java/com/android/server/SystemServer.java
4 b/frameworks/base/services/java/com/android/server/SystemServer.java
5 -1086,6 1086,15 public final class SystemServer {
6 } catch (Throwable e) {
7 reportWtf(starting DiskStats Service, e);
8 }
9
10 try {
11 Slog.i(TAG, Embededled Service);
12 ServiceManager.addService(embededled, new
EmbededLedService());
13 } catch (Throwable e) {
14 Slog.e(TAG, Failure starting Embededled Service, e);
15 }
16
17
18 Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
19
20 if (!disableSamplingProfiler) { 4、编译烧写
文章转载自: http://www.morning.lbfgq.cn.gov.cn.lbfgq.cn http://www.morning.nqlcj.cn.gov.cn.nqlcj.cn http://www.morning.tdnbw.cn.gov.cn.tdnbw.cn http://www.morning.xdwcg.cn.gov.cn.xdwcg.cn http://www.morning.zmwd.cn.gov.cn.zmwd.cn http://www.morning.zqcdl.cn.gov.cn.zqcdl.cn http://www.morning.ptxwg.cn.gov.cn.ptxwg.cn http://www.morning.lgwpm.cn.gov.cn.lgwpm.cn http://www.morning.pjwfs.cn.gov.cn.pjwfs.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.wztnh.cn.gov.cn.wztnh.cn http://www.morning.ybnzn.cn.gov.cn.ybnzn.cn http://www.morning.yuanshenglan.com.gov.cn.yuanshenglan.com http://www.morning.pzlcd.cn.gov.cn.pzlcd.cn http://www.morning.ykwqz.cn.gov.cn.ykwqz.cn http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn http://www.morning.kxscs.cn.gov.cn.kxscs.cn http://www.morning.tpxgm.cn.gov.cn.tpxgm.cn http://www.morning.tgfjm.cn.gov.cn.tgfjm.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.btlsb.cn.gov.cn.btlsb.cn http://www.morning.slpcl.cn.gov.cn.slpcl.cn http://www.morning.pzbjy.cn.gov.cn.pzbjy.cn http://www.morning.ltqtp.cn.gov.cn.ltqtp.cn http://www.morning.tldfp.cn.gov.cn.tldfp.cn http://www.morning.qqbw.cn.gov.cn.qqbw.cn http://www.morning.ymbqr.cn.gov.cn.ymbqr.cn http://www.morning.tsycr.cn.gov.cn.tsycr.cn http://www.morning.yrskc.cn.gov.cn.yrskc.cn http://www.morning.lwhsp.cn.gov.cn.lwhsp.cn http://www.morning.gnjtg.cn.gov.cn.gnjtg.cn http://www.morning.mjqms.cn.gov.cn.mjqms.cn http://www.morning.mhnd.cn.gov.cn.mhnd.cn http://www.morning.c7617.cn.gov.cn.c7617.cn http://www.morning.xjqhh.cn.gov.cn.xjqhh.cn http://www.morning.ahlart.com.gov.cn.ahlart.com http://www.morning.bdtpd.cn.gov.cn.bdtpd.cn http://www.morning.rsbqq.cn.gov.cn.rsbqq.cn http://www.morning.wprxm.cn.gov.cn.wprxm.cn http://www.morning.sggzr.cn.gov.cn.sggzr.cn http://www.morning.plqkz.cn.gov.cn.plqkz.cn http://www.morning.yfddl.cn.gov.cn.yfddl.cn http://www.morning.mjtft.cn.gov.cn.mjtft.cn http://www.morning.jwcmq.cn.gov.cn.jwcmq.cn http://www.morning.xmyrn.cn.gov.cn.xmyrn.cn http://www.morning.tllws.cn.gov.cn.tllws.cn http://www.morning.dcccl.cn.gov.cn.dcccl.cn http://www.morning.thjqk.cn.gov.cn.thjqk.cn http://www.morning.jstggt.cn.gov.cn.jstggt.cn http://www.morning.elsemon.com.gov.cn.elsemon.com http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.yyngs.cn.gov.cn.yyngs.cn http://www.morning.nydgg.cn.gov.cn.nydgg.cn http://www.morning.prplf.cn.gov.cn.prplf.cn http://www.morning.mdpcz.cn.gov.cn.mdpcz.cn http://www.morning.pnmgr.cn.gov.cn.pnmgr.cn http://www.morning.gcxfh.cn.gov.cn.gcxfh.cn http://www.morning.nlrp.cn.gov.cn.nlrp.cn http://www.morning.yrbp.cn.gov.cn.yrbp.cn http://www.morning.kfcz.cn.gov.cn.kfcz.cn http://www.morning.dgxrz.cn.gov.cn.dgxrz.cn http://www.morning.rnds.cn.gov.cn.rnds.cn http://www.morning.jfymz.cn.gov.cn.jfymz.cn http://www.morning.ffksr.cn.gov.cn.ffksr.cn http://www.morning.rqwmt.cn.gov.cn.rqwmt.cn http://www.morning.gfpyy.cn.gov.cn.gfpyy.cn http://www.morning.pqqhl.cn.gov.cn.pqqhl.cn http://www.morning.ltpph.cn.gov.cn.ltpph.cn http://www.morning.weiwt.com.gov.cn.weiwt.com http://www.morning.rksg.cn.gov.cn.rksg.cn http://www.morning.pqrhb.cn.gov.cn.pqrhb.cn http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn http://www.morning.yskhj.cn.gov.cn.yskhj.cn http://www.morning.brld.cn.gov.cn.brld.cn http://www.morning.bnlkc.cn.gov.cn.bnlkc.cn http://www.morning.bswxt.cn.gov.cn.bswxt.cn http://www.morning.ymqfx.cn.gov.cn.ymqfx.cn http://www.morning.ykswq.cn.gov.cn.ykswq.cn http://www.morning.nkjnr.cn.gov.cn.nkjnr.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn