如何閱讀Android項目的源碼,快速梳理程序主線
一、為什麼要梳理程序主線
在工作中,經常會遇到從別人手裡接手一個項目的代碼,只針對其中某一個功能修修補補,或者新增一個模塊這樣的工作。如果對方不能花太多時間幫助梳理,並且代碼缺少必要的注釋時,自己拿到這樣一個源碼,往往不知從哪裡下手,找不到需要修改的模塊在什麼位置。特別是工程比較大,代碼比較多時,把代碼一行一行讀下來很不現實,事倍功半。最近讀了一份Android studio工程的源碼,總結了一些規律和套路,同大家分享。
二、先把代碼跑通
首先要先把代碼跑通,這是一切工作開展的前提。代碼從一台開發機拷貝到另一台,由於編譯器設置的不同,或是環境配置的不同,一般來說不能一次性編譯通過,會報各種各樣奇怪的錯誤。常見的錯誤有:Android studio版本太低需更新;Android studio在國內的更新伺服器被牆,需要設置合適的鏡像代理;SDK、NDK等外部依賴的軟體開發工具包路徑配置不一致;SDK版本號設置與本機環境不匹配等。這個過程要根據所報的錯誤百度解決,一般來說自己遇到的問題都有別人遇到過,可以參考。
三、開始梳理主框架
在編譯器左側區域選擇Project視圖,可以看到工程的文件結構。一般來說,app > src > main > java 目錄下,是我們需要研讀的代碼。
首先打開AndroidManifest.xml,找到一堆下面的以及裡面所包含的,如下所示:
android:name=".base.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
android:name=".show.WelcomeActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden">
android:name=".show.MainActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden"/>
android:name=".show.LoginActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden"/>
android:name=".show.LocalActivity"
android:screenOrientation="portrait"
android:windowSoftInputMode="adjustResize|stateHidden"/>
以上截取了四個。每個activity可以理解為具有相對獨立功能的一個窗口,應用程序打開後,根據程序邏輯,在各個activity之間跳轉,以完成特定的功能。根據activity的android:name,可以大概猜測出這個activity所完成的功能。在這個程序中,我們可以根據字面意思來猜測:WelcomeActivity是歡迎界面;MainActivity是應用程序主界面,相當於根窗口;LoginActivity是用戶登錄界面,以此類推。其中,WelcomeActivity中包含這樣兩行代碼:
這表示,該activity是應用程序打開後第一個啟動的activity。
接下來,對應去閱讀WelcomeActivity的java代碼。
代碼的位置在哪裡呢?可以用文件名搜索的方法,也可以根據AndroidManifest.xml里指示的位置打開。
package="com.traffic.survey">
打開文件後,可以看到java代碼,可以看到有一些諸如onCreate,init等函數。因為我們的主要目的是梳理程序主框架,所以可以不用對代碼細節研讀太細,直接在文檔中ctrl+F,搜索關鍵字「startActivity」或者「Intent」,來快速定位到activity跳轉的代碼。
因為我們知道,在Android中實現窗口跳轉需要調用如下API:
startActivity(newIntent(this,newActivity.class));
用搜索關鍵字的方法,可以提高讀代碼的效率,快速梳理各窗口之間的關係。比如,在WelcomeActivity中的搜索結果是這樣的:
public voidonAnimationEnd(Animator animator) {
if(TextUtils.isEmpty(userId)) {
startActivity(newIntent(WelcomeActivity.this,LoginActivity.class));
}else{
startActivity(newIntent(WelcomeActivity.this,MainActivity.class));
}
finish();
}
通過這一小段,可以大概知道跳轉邏輯。歡迎動畫結束時,判斷userId是不是空。如果是空,則跳轉到LoginActivity(登錄窗口);如果非空,則跳轉到MainActivity(主窗口)。
此時按住ctrl鍵不放,用滑鼠點擊LoginActivity,可以直接跳轉到LoginActivity的java代碼。再用相同的關鍵字搜索方法,搜索LoginActivity的窗口跳轉邏輯。
這樣就可以快速梳理出整個程序的窗口跳轉邏輯,快速定位到自己需要修改的代碼在哪裡。
四、精讀所需修改的代碼的業務邏輯
通過梳理主框架,已經定位到自己所需修改的代碼位置時,需要精讀此處的代碼,徹底掌握這部分的業務邏輯,才能在此基礎上修改。在這裡不具體舉例如何修改代碼,只介紹如何找到該Activity對應的布局文件。
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWidget();
initData();
}
以上代碼是MainActivity的onCreate函數。此處的紫色斜體字activity_main,就是布局文件的名稱。該布局文件的目錄位置在:app > src > main > res > layout > activity_main.xml。如下圖所示:
打開這個activity_main.xml文件,默認會打開Design視圖,能夠直觀地看到窗口的設計資源以及位置。在窗口左下角可以進行Design視圖和Text視圖的切換。
代碼中的R.id.xxx,則都是該布局文件中的資源ID,可對應查找。
五、最後
以上就是我讀代碼的心得。不對之處,請大家批評指正。或者還有什麼別的技巧方法,歡迎留言交流。
TAG:程序媛王婷婷 |