1. 程式人生 > >使用Android Studio檢視並除錯Android原始碼

使用Android Studio檢視並除錯Android原始碼

今日科技快訊


近日有訊息稱:餓了麼口碑合併成立的阿里本地生活服務公司在募集到40億美元資金後,其估值已飆升至300億美元。知情人士透露,此次新融資資金中有30多億美元來自阿里巴巴和軟銀的遠景基金,春華資本集團(Primavera Capital Group)和口碑現有投資方、阿里巴巴旗下螞蟻金服也參與了此次融資,預計將在11月底前正式完成此輪融資。


作者簡介


明天就是週六啦,提前祝大家週末愉快!

本篇轉自 cfy137000 的部落格,分享了使用Android Studio檢視原始碼,希望對大家有所幫助。

cfy137000 的部落格地址:

https://blog.csdn.net/cfy137000


基礎環境


無論是在工作中,還是我們自己學習Android,總會用到Android的原始碼,沒有趁手的開發工具,我們是無法進行除錯,編寫程式碼的,而AndroidStudio就可以做到編譯原始碼並除錯原始碼

作業系統

首先我們需要一個Linux的作業系統,直接在Windows下是沒法編譯的,在這裡,我使用的是Deepin,而Ubuntu的操作應該與我一樣,如果你只有一個Windows電腦,強烈推薦使用Docker來完成,不要使用虛擬機器.

Java

Java使用1.8即可,本文編譯的是Android-P,而根據Android版本的不同,需要的Java環境可能也略有區別

640?wx_fmt=png

Android原始碼

關於原始碼的下載,不是本文的重點,不會贅述,建議使用清華源進行下載,關於如何下載,網址寫的還是比較詳細的

清華大學開源軟體映象站

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/


編譯原始碼


在將工程匯入到AndroidStudio之前,我們最好先編譯一下整個Base程式碼,這樣一來可以保證我們的程式碼和開發環境沒有什麼問題,二來可以通過編譯來生成R檔案

初始化編譯環境

命令:

source build/envsetup.sh 

這裡需要注意一點, 確保你的終端是bash或者zsh

,因為Android的編譯指令碼只保證相容這兩個,如果是fish什麼的就要手動切換一下了,並且Android P才支援的zsh,在Android O上還支援從bash,我就在編譯Android O的時候,由於使用了zsh而遇到了一些坑

AndroidP的終端檢查原始碼

function validate_current_shell() {
    local current_sh="$(ps -o command -p $$)"
    case "$current_sh" in
        *bash*)
            function check_type() { type -t "$1"; }
            ;;
        *zsh*)
            function check_type() { type "$1"; }
            enable_zsh_completion ;;
        *)
            echo -e "WARNING: Only bash and zsh are supported.\nUse of other shell would lead to erroneous results."
            ;;
    esac
}

Android O的終端檢查原始碼

if [ "x$SHELL" != "x/bin/bash" ]; then
    case `ps -o command -p $$` in
        *bash*)
            ;;
        *)
            echo "WARNING: Only bash is supported, use of other shell would lead to erroneous results"
            ;;
    esac
fi

選擇編譯目標

在編譯之前我們還需要選擇編譯目標,所謂編譯目標就是生成的映象要執行在什麼裝置上,比如你是執行在Pixel手機,還是執行在虛擬機器上,命令:

lunch 

lunch命令會將所有當前支援的編譯型別都列出來,然後輸入序號即可選擇

640?wx_fmt=png

這裡我們選擇 28 aosp_x86_64-eng, 編譯出x86版本的,大家可以根據自己的實際情況選擇

640?wx_fmt=png

我們還可以使用 choosecombo 命令來進行一次性的選擇,例如:

choosecombo 2 aosp_x86_64 3

640?wx_fmt=png

choosecombo命令接收3個引數:

  • 第一個引數是 Build type:會設定TARGET_BUILD_TYPE環境變數為release或debug

  • 第二個引數是編譯的product,也就是aosp_x86_64

  • 第三個引數是編譯的varient,可以選擇user,userdebug或者eng版本

  • user:代表這是編譯出的系統映象是可以用來正式釋出到市場的版本,其許可權是被限制的,例如沒有root許可權,不能debug等

  • userdebug:在user版本的基礎上開放了root許可權和debug許可權

  • eng:代表engineer,也就是所謂的開發工程師的版本,擁有最大的許可權(root等),此外還附帶了許多debug工具

編譯

編譯命令比較簡單

make -j18

通過make指令進行程式碼編譯,該指令通過-j引數來設定參與編譯的執行緒數量,以提高編譯速度.比如這裡我們設定18個執行緒同時編譯,通常這個執行緒數是cpu核心數*2+2,並不是越大越好的,然後你的電腦就會編譯,根據電腦效能的不同,編譯的速度會有很大的區別,大約1個小時左右,應該就會編譯完成

驗證

編譯完成後可以執行 emulator 命令來啟動編譯好的虛擬機器,另外,關閉了終端,需要重新執行一遍上述的 source build/envsetup.sh 命令和 lunch 命令

640?wx_fmt=png

可以看到,其實這就是一個我們最常見的Android虛擬機器


匯入原始碼到Android Studio


實際上Android的原始碼中已經專門存在了文件來告訴我們如何使用IDE來編輯Android原始碼,位置是 原始碼路徑/development/tools/idegen/README

640?wx_fmt=png

因為我們現在都使用AndroidStudio了,所以只需要關心其中的IntelliJ部分就好了,Eclipse就不用看了

AndroidStudio的初期配置

文件上說,由於Android太大了,所以我們需要給IDE更多的記憶體。在Help > Edit Custom VM 中新增:

-Xms1g
-Xmx5g

640?wx_fmt=png

這兩個引數的意思是初始堆記憶體為1G,最大堆記憶體為5G,其實不設定也沒什麼問題,但是經常會在看程式碼的時候,出現記憶體不夠的錯誤資訊,所以換個大記憶體還是很有必要的~

然後是AndroidStudio的類大小配置,在Help -> Edit custom properties中新增:

idea.max.intellisense.filesize=100000

640?wx_fmt=png

這個引數是定義AS預設的類大小的,預設值是2500,會導致太大的Java檔案不能被識別,把這個數調大了之後,就可以匯入更大的Java檔案了,當然還是需要一個好電腦的~

配置完成後重啟IDE

640?wx_fmt=png

原始碼匯入

首先我們還是要執行一遍上述的source build/envsetup.sh 命令和 lunch 命令,當然,如果終端沒有關閉的話,可以省略這一步,然後執行

mmm development/tools/idegen

編譯生成idegen.jar,這裡需要注意的是,雖然google的指令碼說支援zsh,但是如果你用zsh就會出現 Couldn't locate the directory development/tools/idegen 這個錯誤,使用bash再來一遍就可以了

640?wx_fmt=png

生成完 idegen.jar 之後,就可以使用命令來掃描生成 ipr 檔案了:

sudo ./development/tools/idegen/idegen.sh

640?wx_fmt=png

這個ipr檔案就是整個專案,AndroidStudio可以直接識別開啟它,就像開啟正常的Android專案一樣

640?wx_fmt=png

之後AndroidStudio就開始開啟專案了,這個過程會比較緩慢,有時,AS會出現如下資訊:

640?wx_fmt=png

大致的意思就是由於專案過於龐大,現在AS沒有辦法很好的監視整個專案的改變了,可以通過如下方式解決:

1. 在/etc/sysctl.conf 檔案末尾中新增如下程式碼:

fs.inotify.max_user_watches = 524288

2. 然後在終端執行以下命令:

sudo sysctl -p --system

最後重啟AS

AndroidStudio的其他配置

設定ProgectSDK AndroidAPI28,java版本為Java8

640?wx_fmt=png

然後在SDK選項中僅僅保留Java1.8和Android API 28,剩下的都刪除掉

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

接下來是Modules,將所有的Jar刪除,因為基本上我們用不到jar,看原始碼就夠了,如果確實需要哪個的話,再酌情保留

640?wx_fmt=png

如果AndroidStudio一直不停 scanning files to index,可以開啟 module setting --> Modules --> 找到gen資料夾 --> 右鍵選擇Resources

640?wx_fmt=png

現在我們就可以愉快的閱讀原始碼啦~

刪除不關心的專案

我們可以在AndroidStudio將我們不關心的專案或路徑排除掉,這樣再開啟原始碼時就可以快一些了,例如我們將hardware路徑刪除

640?wx_fmt=png


Debug


我們在開發的時候,勢必要Debug,我們可以這樣來在原始碼環境下除錯我們的程式碼,以Browser2為例:

1. 新增斷點

隨便打幾個斷點:

640?wx_fmt=png

2. 點選工具欄上的Attach debugger to Android process 按鈕

640?wx_fmt=png

3. 選擇要除錯的程式->OK

這裡需要注意不要忘記勾選,Show all processes

640?wx_fmt=png

4. 正常執行專案即可除錯

640?wx_fmt=png

可以看到我們就能正常除錯我們的專案了


歡迎長按下圖 -> 識別圖中二維碼

或者 掃一掃 關注我的公眾號

640.png?

640?wx_fmt=jpeg