Androidソースの読み取りテクニック--開発者のオプションを検索してタッチ操作のソースを表示します

15165 ワード

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. ソースを読み始める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. InputManagerServicesを開きます.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の中のパラメータが一致しているので、ここを歩いたに違いない.
次は方法について
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(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);
}

そのうち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);

PointerControllerを開きます.cpp、関数void PointerController::setSpots(const PointerCoords*spotCoords,const uint 32_t*spotIdToIndex,BitSet 32 spotIdBits)ではspot->updateSprite(&icon,x,y);表示コイルに関連して,iconは表示された図形,xとyは表示された座標であると大胆に予測した.ALOGI印刷を追加し、コンパイルしてインポートすると、コイルが表示されるたびに、ここを歩いていることがわかります.推測が真理になる!
    6.考えてみると、iconデータはどこから来たのか、androidに表示できるのか.x,yデータはどのように伝わったのでしょうか.後で時間があればまた一緒に検討しましょう.