Android framework源码按键操作的完整流程
16lz
2021-01-23
我们知道按键是底层通过input系统传值上来的,这里面相关的服务是InputManagerService.java,对应的代码路径在frameworks\base\services\java\com\android\server\input\inputManagerService.java
在frameworks\base\services\java\com\android\server
目录下有很多Android源生的服务,大家有兴趣的可以去研究。
这里面提到的inputManagerService又是在哪里被启动的呢,Android系统被启动的过程中创建的第一个进程zygote,在他的fork函数里面会创建SystemServer对象,我们可以看看SystemServer这个类又做了哪些事情。SystemServer的路径在frameworks/base/services/java/com/android/server/SystemServer.java
他的main函数如下:
public static void main(String[] args) { /* * In case the runtime switched since last boot (such as when * the old runtime was removed in an OTA), set the system * property so that it is in sync. We can't do this in * libnativehelper's JniInvocation::Init code where we already * had to fallback to a different runtime because it is * running as root and we need to be the system user to set * the property. http://b/11463182 */ SystemProperties.set("persist.sys.dalvik.vm.lib", VMRuntime.getRuntime().vmLibrary()); if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { // If a device's clock is before 1970 (before 0), a lot of // APIs crash dealing with negative numbers, notably // java.io.File#setLastModified, so instead we fake it and // hope that time from cell towers or NTP fixes it // shortly. Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server", null); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // Mmmmmm... more memory! dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f); Environment.setUserRequired(true); System.loadLibrary("android_servers"); Slog.i(TAG, "Entered the Android system server!"); // Initialize native services. nativeInit(); // This used to be its own separate thread, but now it is // just the loop we run on the main thread. ServerThread thr = new ServerThread(); thr.initAndLoop(); }
这里面有个线程是执行initAndLoop方法,我们打开这个方法就会发现inputManagerService对象被new出来了。相关代码如下:
Slog.i(TAG, "Input Manager"); inputManager = new InputManagerService(context, wmHandler); Slog.i(TAG, "Window Manager"); wm = WindowManagerService.main(context, power, display, inputManager, wmHandler, factoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL, !firstBoot, onlyCore); ServiceManager.addService(Context.WINDOW_SERVICE, wm); ServiceManager.addService(Context.INPUT_SERVICE, inputManager); ActivityManagerService.self().setWindowManager(wm); inputManager.setWindowManagerCallbacks(wm.getInputMonitor()); inputManager.start(); display.setWindowManager(wm); display.setInputManager(inputManager);
更多相关文章
- Android Intent传递对象
- Android 保存文件路径方法
- Android JNI cpp文件创建 java bean 对象并返回
- Android高手进阶教程(十六)---Android中Intent传递对象的两种方
- Android上在两个Activity之间传递Bitmap对象
- [置顶] Android 调用js,传对象到js里面使用addJavascriptInterfac
- 如何在Windows上设置Android环境变量/路径