设为首页 加入收藏

TOP

Android源码阅读技巧--查找开发者选项中显示触摸操作源码(一)
2019-09-14 00:53:03 】 浏览:126
Tags:Android 源码 阅读 技巧 查找 开发者 选项 显示 触摸 操作

    在开发者模式下,在开发者选项中,可以勾选“显示触摸操作”,然后只要点击屏幕就会在点击的位置有圈圈显示。如何找到绘制圈圈的代码部分,有什么技巧来阅读代码量这么大的android系统源码呢?以下请跟着小老弟我来一起分析吧。

 

    1. android设置功能的代码是在packages/apps/Settings/里面的,所以在Settings中搜寻关键的字符串,

在源码目录下终端输入

grep -rn "显示触摸操作" ./packages/apps/Settings/

    搜到如下:

./packages/apps/Settings/res/values-zh-rCN/strings.xml:2108: <string name="show_touches" msgid="1356420386500834339">"显示触摸操作"</string>

    熟悉android应用编程的话就应该知道代码中 show_touches 与“显示触摸操作”是相关联的。


    2. 输入 

grep -rn "show_touches" --include "*.java" ./packages/apps/Settings/

    得到

./packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java:128: private static final String SHOW_TOUCHES_KEY = "show_touches";

 

    3. 开始阅读源码,打开 DevelopmentSettings.java 按以下阅读顺序,

private static final String SHOW_TOUCHES_KEY = "show_touches";
mShowTouches = findAndInitSwitchPref(SHOW_TOUCHES_KEY);
private void writeShowTouchesOptions() {
    Settings.System.putInt(getActivity().getContentResolver(),
            Settings.System.SHOW_TOUCHES, mShowTouches.isChecked() ? 1 : 0);
}

    猜测 putInt 应该是一个数据传递的功能, 所以在framework里面搜 SHOW_TOUCHES 看看情况如何,

    输入

grep -rn "SHOW_TOUCHES" frameworks/

    搜到好多,比如以下应该和数据处理注册相关,

frameworks/base/core/java/android/provider/Settings.java:3094: public static final String SHOW_TOUCHES = "show_touches";
frameworks/base/core/java/android/provider/Settings.java:3097: public static final Validator SHOW_TOUCHES_VALIDATOR = sBooleanValidator;
frameworks/base/core/java/android/provider/Settings.java:3439: PRIVATE_SETTINGS.add(SHOW_TOUCHES);
frameworks/base/core/java/android/provider/Settings.java:3519: VALIDATORS.put(SHOW_TOUCHES, SHOW_TOUCHES_VALIDATOR);

    因为看不出有什么特殊操作,只是一些声明和 add 操作,所以忽略之。。。。。。

以下才是具体功能

frameworks/base/services/core/java/com/android/server/input/InputManagerService.java:1600: Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), true,

 

    4. 打开 InputManagerService.java 源码,

private void registerShowTouchesSettingObserver() {
    mContext.getContentResolver().registerContentObserver(
            Settings.System.getUriFor(Settings.System.SHOW_TOUCHES), true,
            new ContentObserver(mHandler) {
                @Override
                public void onChange(boolean selfChange) {
                    updateShowTouchesFromSettings();
                }
            }, UserHandle.USER_ALL);
}

    发现,关键方法 getContentResolver 刚好在DevelopmentSettings.java 中 putInt 里面的参数一致,所以可以肯定是走这里了。

    接下来跟方法 updateShowTouchesFromSettings()

public void updateShowTouchesFromSettings() {
    int setting = getShowTouchesSetting(0);
    nativeSetShowTouches(mPtr, setting != 0);
}

    看到 native 字样,说明会走到用 cpp 写的 JNI 接口里面。

 

    3. 因为已经到 JNI 了,所以后续都只需看 cpp 文件了,输入

grep -rn "nativeSetShowTouches" --include "*.cpp" ./frameworks/ 

    搜到

./frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp:1310:static void nativeSetShowTouches(JNIEnv* /* env */,

   打开这份 com_android_server_i

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入理解 ThreadLocal 下一篇将Android封装库通过gradle部署到..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目