Android源码阅读技巧--查找开发者选项中显示触摸操作源码

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

在源码目录下终端输入

grep -rn “显示触摸操作” ./packages/apps/Settings/
搜到如下:

./packages/apps/Settings/res/values-zh-rCN/strings.xml:2108: “显示触摸操作”
熟悉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_input_InputManagerService.cpp 文件,

复制代码
static void nativeSetShowTouches(JNIEnv* /* env /,
jclass /
clazz /, jlong ptr, jboolean enabled) {
NativeInputManager
im = reinterpret_cast<NativeInputManager*>(ptr);

im->setShowTouches(enabled);

}
复制代码
看看 setShowTouches 里面做了啥,

复制代码
void NativeInputManager::setShowTouches(bool enabled) {
{ // acquire lock
AutoMutex _l(mLock);

    if (mLocked.showTouches == enabled) {
        return;
    }

    ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");
    mLocked.showTouches = enabled;
} // release lock

mInputManager->getReader()->requestRefreshConfiguration(
        InputReaderConfiguration::CHANGE_SHOW_TOUCHES);

}
复制代码
其中 mLocked.showTouches = enabled; 中 showTouches 是关键字,还有 CHANGE_SHOW_TOUCHES 也很关键。

4. 输入

grep -rn “CHANGE_SHOW_TOUCHES” --include “*.cpp” ./frameworks/
搜到

./frameworks/native/services/inputflinger/InputReader.cpp:3177: | InputReaderConfiguration::CHANGE_SHOW_TOUCHES
打开 InputReader.cpp ,在 CHANGE_SHOW_TOUCHES 中看不出啥东西,太费力了。

这时可以在 InputReader.cpp 中搜 showTouches ,

输入

grep -rn “showTouches” --include “*.cpp” ./frameworks/
搜到

./frameworks/native/services/inputflinger/InputReader.cpp:3476: (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
./frameworks/native/services/inputflinger/InputReader.cpp:4334: && mConfig.showTouches && mPointerController != NULL) {
如何把 CHANGE_SHOW_TOUCHES 与 showTouches 关联起来呢?在 InputReader.cpp 中,

复制代码
if (!changes || (changes & (InputReaderConfiguration::CHANGE_DISPLAY_INFO
| InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT
| InputReaderConfiguration::CHANGE_SHOW_TOUCHES
| InputReaderConfiguration::CHANGE_EXTERNAL_STYLUS_PRESENCE))) {
// Configure device sources, surface dimensions, orientation and
// scaling factors.
configureSurface(when, &resetNeeded);
}
复制代码

进入configureSurface 发现以下关键代码

复制代码
// Create pointer controller if needed.
if (mDeviceMode == DEVICE_MODE_POINTER ||
(mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
if (mPointerController == NULL) {
mPointerController = getPolicy()->obtainPointerController(getDeviceId());
}
} else {
mPointerController.clear();
}
复制代码
这段注释耐人寻味 // Create pointer controller if needed.

所以可以肯定,后续就在 InputReader.cpp 里面围绕 showTouches 来搞事情,果然 showTouches 在另外一出显现它的重要,

复制代码
if (mDeviceMode == DEVICE_MODE_DIRECT
&& mConfig.showTouches && mPointerController != NULL) {
mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_SPOT);
mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL);

        mPointerController->setButtonState(mCurrentRawState.buttonState);
        mPointerController->setSpots(mCurrentCookedState.cookedPointerData.pointerCoords,
                mCurrentCookedState.cookedPointerData.idToIndex,
                mCurrentCookedState.cookedPointerData.touchingIdBits);
    }

复制代码
学了多年的英语要发挥它的作用了,可知 setSpots 中 spots的中文意思为“斑点,小圆点”,所以就是走这里了,setSpots传的参数应该就和触摸坐标数据有关了。

5. 输入

grep -rn “setSpots” --include “*.cpp” ./frameworks/
搜到

./frameworks/base/libs/input/PointerController.cpp:246:void PointerController::setSpots(const PointerCoords* spotCoords,
./frameworks/base/libs/input/PointerController.cpp:249: ALOGD(“setSpots: idBits=%08x”, spotIdBits.value);
东莞网站建设www.zg886.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值