Android 输入系统架构 笔记1

本文详细介绍了Android系统中Input Manager服务的启动过程。从SystemServer启动时创建WindowManagerService,再到InputManager的初始化及JNI层的具体实现,直至InputManager的完全启动。

1. 首先看下服务的启动:

    Android系统启动的时候,会启动很多服务,一般都是在SystemServer中启动的,代码如下:

   路径 Framework/base/services/java/com/android/server/SystemServer.java

                         wm = WindowManagerService.main(context, power,factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL,!firstBoot);

  这里创建了一个WindowManagerService的类,我们来看看这个类的构造函数:

  Framework/base/services/java/com/android/server/wm/WindowManagerServer.java

   private WindowManagerService(Context context, PowerManagerService pm,boolean haveInputMethods, boolean showBootMsgs) {
    ……
    mInputManager = new InputManager(context, this);
    ……
    mInputManager.start();
    ……
    }
 在WindowManagerService的构造函数中又new了一个InputManager类。InputManager类是整个android的input的上层代码最重要的类就是通过这个类繁衍出了整个复杂的Android的input子系统。作用就好像Zygote的孕育着Android的各个服务而InputManager就是负责将整个android的Input子系统。

Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
public InputManager(Context context, WindowManagerService windowManagerService) { 
……
Looper loo
per = windowManagerService.mH.getLooper();
nativeInit(mContext, mCallbacks, looper.getQueue());
……
}

在InputManger的构造函数中调用了nativeInit这个方式看到native开头或者结尾的函数一般都是JNI。在InputManager的JNI可以找到这个函数的实现。

 Framework/base/services/jni/com_android_server_InputManager.java
 
static JNINativeMethod gInputManagerMethods[] = {
{ "nativeInit", "(Landroid/content/Context;"   "Lcom/android/server/wm/InputManager$Callbacks;Landroid/os/MessageQueue;)V",
                                                              (void*) android_server_InputManager_nativeInit },
 

Framework/base/services/jni/com_android_server_InputManager.java
 
static void android_server_InputManager_nativeInit(JNIEnv* env, jclass clazz,        
            jobject contextObj, jobject callbacksObj, jobject messageQueueObj) {
……
            gNativeInputManager = new NativeInputManager(contextObj, callbacksObj, looper);
            ……
           }
 
在JNI的代码中又构造了一个重要的NativeInputManager类这是个C++的本地类。已经不在是之前了那个java的InputManager类。接下来看看NativeInputManager的构造函数。 

Framework/base/services/jni/com_android_server_InputManager.java
 
NativeInputManager::NativeInputManager(jobject contextObj,  
jobject callbacksObj, const sp<Looper>& looper) :mLooper(looper) {
……
sp<EventHub> eventHub = new EventHub();
mInputManager = new InputManager(eventHub, this, this);
……
}
 
这里new了两个类EventHub和InputManager类。EventHub就是Input子系统的HAL层了负责将linux的所有的input设备打开并负责轮询读取他们的上报的数据后面会详细介绍这里先简单介绍一下。InputManager类主要是负责管理input Event有InputReader从EventHub读取事件然后交给InputDispatcher进行分发。


Framework/base/services/input/InputManager.cpp
 
InputManager::InputManager(
const sp<InputReaderInterface>& reader,        
const sp<InputDispatcherInterface>& dispatcher) :
mReader(reader),
mDispatcher(dispatcher) {
initialize();
}
 
void InputManager::initialize() {
mReaderThread = new InputReaderThread(mReader);
mDispatcherThread = new InputDispatcherThread(mDispatcher);
}

在InputManager中的initialize的初始化了两个线程。一个是inputReaderThread负责从EventHub中读取事件另外一个是InputDispatcherThread线程主要负责分发读取的事件去处理。

Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
private WindowManagerService(Context context, PowerManagerService pm, boolean haveInputMethods, boolean showBootMsgs){
 
mInputManager.start();
……
}

在开始的时候new了一个InputManager然后在继续调用其start方法。 
Framework/base/services/java/com/android/server/wm/WindowManagerServer.java
 
public void start() {     
Slog.i(TAG, "Starting input manager");
nativeStart();
registerPointerSpeedSettingObserver();       
registerShowTouchesSettingO
bserver();
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
}   
 
NativeStart()跑到JNI的代码中去了跟上面的方式一样。






这个是完整源码 python实现 Django 【python毕业设计】基于Python的天气预报(天气预测分析)(Django+sklearn机器学习+selenium爬虫)可视化系统.zip 源码+论文+sql脚本 完整版 数据库是mysql 本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后本研究旨在开发一个基于Python的天气预报可视化系统,该系统结合了Django框架、sklearn机器学习库和Selenium爬虫技术,实现对天气数据的收集、分析和可视化。首先,我们使用Selenium爬虫技术从多个天气数据网站实时抓取气象数据,包括温度、湿度、气压、风速等多项指标。这些数据经过清洗和预处理后,将其存储在后端数据库中,以供后续分析。 其次,采用s,将其存储在后端数据库中,以供后续分析。 其次,采用sklearn机器学习库构建预测模型,通过时间序列分析和回归方法,对未来天气情况进行预测。我们利用以往的数据训练模型,以提高预测的准确性。通过交叉验证和超参数优化等技术手段,我们优化了模型性能,确保其在实际应用中的有效性和可靠性。 最后,基于Django框架开发前端展示系统,实现天气预报的可视化。用户可以通过友好的界面查询实时天气信息和未来几天内的天气预测。系统还提供多种图表类型,包括折线图和柱状图,帮助用户直观理解天气变化趋势。 本研究的成果为天气预报领域提供了一种新的技术解决方案,不仅增强了数据获取和处理的效率,还提升了用户体验。未来,该系统能够扩展至其他气象相关的应用场景,为大众提供更加准确和及时的气象服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值