MacBooK pro調試Android 8.1源碼

工具的選擇

1.Android Studio(能夠看,能夠調試) 2.understand (只適合看)html

macbook pro基本上只有這兩款能夠選擇,剛開始用了understand發現並不怎麼好使,也許是沒有使用習慣,咱們在看源碼的時候,有一些過程確定也是須要調試才知道某些方法執行的前後順序,因此我最終選擇了AS,原來的時候也用AS 2.3看過源碼,那時候下面一直再scan index,致使無法正常調式.最新的AS 3.5沒有這個問題.java

編譯

進到android源碼的目錄下執行:android

make idegen && development/tools/idegen/idegen.sh
複製代碼

而後通常會報錯:git

could not find jdk tools.jar at 
/System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar
複製代碼

解決方法, vi ~/.bash_profile,在bash_profile裏面添加以下代碼:github

export JAVA_HOME=$(/usr/libexec/java_home)
export PATH=$JAVA_HOME/bin:$PATH
export CLASS_PATH=$JAVA_HOME/lib
export ANDROID_JAVA_HOME=$JAVA_HOME
複製代碼

若是你的JAVA_HOME已經配置,設置最後一行便可.編譯完成以後,會生成 bash

-w641

如上圖所示的三個文件.app

導入到Android Studio

  • 點擊菜單的open-->選擇源碼目錄,接下來須要等一下子生成index
  • 點擊Configure project structure ,配置以下:
    -w809

能夠把不經常使用不看的代碼在這裏能夠先排除出去,紅色的都是沒有生成索引的 ide

-w1158

接下來就是設置Android源碼之間相互依賴關聯,而不是依賴其餘第三方的jar包.這裏面須要注意的是,先ctrl+A,選中因此,反選最後兩個,delete刪除其餘的便可.不要一個一個去刪. 工具

-w1208

最後: ui

-w1092

到這裏面基本上就設置完成了.

開啓模擬器

  1. source build/envsetup.sh
  2. lunch 選擇編譯的版本,可點擊
  3. emulator

咱們第一篇文章謝了,我這裏面編譯的是aosp_x86_64-eng,好了,模擬器就正常加載了,可是進入到模擬器裏面的時候,每次點擊設置都會FC,報一個wifi2p的一個錯誤,這個能夠在AS的logcat裏面看到,最後google到答案,說是wifi的鍋.而後修改源碼:

修改com.android.settings.wfd.WifiDisplaySettings中的isAvailable方法,返回false.

public static boolean isAvailable(Context context) {
        //加上這個會在模擬器上面報錯
// return context.getSystemService(Context.DISPLAY_SERVICE) != null
// && context.getSystemService(Context.WIFI_P2P_SERVICE) != null;
        return false;
    }
複製代碼

這樣改過以後再從新make,啓動模擬器,你會發現進到設置裏面不會FC了

開始調試

  1. 點擊Attach debugger to Android Process,你會看到以下:
    -w539

而後就能夠選擇一個進程進行調試了,可是若是你想調試系統的一些進程,這仍是不夠的,由於咱們在編譯的時候,編譯的是aosp_x86_64-eng,不是帶-userdebug參數的,因此沒辦法調試,帶-userdebug參數的都是給真機使用的,我也是在選擇了一個編譯完成之後才發現模擬器居然不能用.....,固然你也能夠自定義編譯配置,有興趣能夠網上搜一下,我這裏改了一下代碼:

在ZygoteProcess類的startViaZygote方法中,

argsForZygote.add("--enable-jni-logging");
        argsForZygote.add("--enable-safemode");
        argsForZygote.add("--enable-jdwp");
        argsForZygote.add("--enable-checkjni");
        argsForZygote.add("--generate-debug-info");
        argsForZygote.add("--always-jit");
        argsForZygote.add("--native-debuggable");
        argsForZygote.add("--java-debuggable");
        argsForZygote.add("--enable-assert");
        argsForZygote.add("--mount-external-default");
        argsForZygote.add("--mount-external-write");
// if ((debugFlags & Zygote.DEBUG_ENABLE_JNI_LOGGING) != 0) {
// argsForZygote.add("--enable-jni-logging");
// }
// if ((debugFlags & Zygote.DEBUG_ENABLE_SAFEMODE) != 0) {
// argsForZygote.add("--enable-safemode");
// }
// if ((debugFlags & Zygote.DEBUG_ENABLE_JDWP) != 0) {
// argsForZygote.add("--enable-jdwp");
// }
// if ((debugFlags & Zygote.DEBUG_ENABLE_CHECKJNI) != 0) {
// argsForZygote.add("--enable-checkjni");
// }
// if ((debugFlags & Zygote.DEBUG_GENERATE_DEBUG_INFO) != 0) {
// argsForZygote.add("--generate-debug-info");
// }
// if ((debugFlags & Zygote.DEBUG_ALWAYS_JIT) != 0) {
// argsForZygote.add("--always-jit");
// }
// if ((debugFlags & Zygote.DEBUG_NATIVE_DEBUGGABLE) != 0) {
// argsForZygote.add("--native-debuggable");
// }
// if ((debugFlags & Zygote.DEBUG_JAVA_DEBUGGABLE) != 0) {
// argsForZygote.add("--java-debuggable");
// }
// if ((debugFlags & Zygote.DEBUG_ENABLE_ASSERT) != 0) {
// argsForZygote.add("--enable-assert");
// }
// if (mountExternal == Zygote.MOUNT_EXTERNAL_DEFAULT) {
// argsForZygote.add("--mount-external-default");
// } else if (mountExternal == Zygote.MOUNT_EXTERNAL_READ) {
// argsForZygote.add("--mount-external-read");
// } else if (mountExternal == Zygote.MOUNT_EXTERNAL_WRITE) {
// argsForZygote.add("--mount-external-write");
// }
複製代碼

我把全部debug參數都給添加了上去.從新編譯運行.最後就能夠愉快的玩耍了.可是有一個問題就是,調試運行都沒問題了,可是我想調試一個app的啓動,發現這個好像有點困難,由於在進程啓動之後才能attach,可是其餘的生命週期的調試沒有任何問題.

接下來我會完整的分析App的啓動流程和Activity的啓動流程.

相關文章
相關標籤/搜索