Androidソースの読み取りテクニック--開発者のオプションを検索してタッチ操作のソースを表示します
15165 ワード
Androidソースの読み取りテクニック--開発者のオプションを検索してタッチ操作のソースを表示します
開発者モードでは、開発者オプションで「タッチ操作を表示」をチェックし、画面をクリックするとクリックした位置にループが表示されます.どのようにコイルを描くコード部分を見つけて、コード量のこんなに大きいandroidシステムのソースコードを読むテクニックがありますか?以下は弟について私と一緒に分析してください.
1. Android設定機能のコードはpackages/apps/Settings/にあるので、Settingsでキー文字列を探して、
ソースディレクトリでの端末入力
次のように検索されます.
Androidアプリのプログラミングに詳しいならコードのshow_touchesは「表示タッチ操作」に関連付けられている.
2. 入力
に届く
3. ソースを読み始めるJAvaは以下の読み方順で、
推測putIntはデータ伝達の機能であるべきで、frameworkの中でSHOWを探しますTOUCHESは状況を見てみましょう
入力
次のようなデータ処理登録に関連するものがたくさん見つかりました.
特殊な操作は見えないので、いくつかの宣言とadd操作だけなので無視します....
以下が具体的な機能です
4. InputManagerServicesを開きます.JAvaソース、
肝心な方法getContentResolverはちょうどDevelopmentSettings.JAvaではputIntの中のパラメータが一致しているので、ここを歩いたに違いない.
次は方法について
nativeの文字を見ると、cppで書かれたJNIインタフェースの中に入ることを説明します.
3. JNIに着いたので、あとはcppファイルを見るだけで、入力
検索
このcomを開けてandroid_server_input_InputManagerService.cppファイル、
setShowTouchesで何をしたか見てみましょう
そのうちshowTouches = enabled; 中showTouchesはキーワード、そしてCHANGE_SHOW_TOUCHESも肝心です.
4. 入力
検索
InputReaderを開くcpp、CHANGEで_SHOW_TOUCHESでは何も見えないので、骨が折れる.
このときInputReader.cpp中搜showTouches,
入力
検索
どうやってCHANGEをSHOW_TOUCHESはshowTouchesと関連していますか?InputReader.cppでは、
configureSurfaceに入ると、次のキーコードが見つかります.
この注釈は味わい深い//Create pointer controller if needed.
次はInputReaderですcppではshowTouchesをめぐって仕事をしていますが、やはりshowTouchesは別の重要性を示しています.
長年英語を勉強してきたので、setSpotsのspotsの中国語の意味は「斑点、小円点」なので、ここを歩いて、setSpots伝のパラメータは座標データに触れることと関係があるはずです.
5. 入力
検索
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データはどのように伝わったのでしょうか.後で時間があればまた一緒に検討しましょう.
開発者モードでは、開発者オプションで「タッチ操作を表示」をチェックし、画面をクリックするとクリックした位置にループが表示されます.どのようにコイルを描くコード部分を見つけて、コード量のこんなに大きい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データはどのように伝わったのでしょうか.後で時間があればまた一緒に検討しましょう.