一.概述
一直有read the fucking source code的計劃,但是實行起來都是斷斷續續的.到現在也沒有真正得讀過多少Android的源碼(主要是懶的).現在回想起來實在是很慚愧,再加上好久沒有寫博客了,經過幾天的琢磨準備在CSDN博客開兩個長時間更新的系列博客(Android 源碼和Android設計模式),每週更新最少一篇.以此來督促自己,並且跟其他小夥伴一起分享這個過程.
之前是直接讀的framework層的源碼,讀起來比較枯燥和生澀,碰巧上週寫了一篇MVP在Android中應用的博客,就萌生了想要了解Android原生應用會用哪種設計風格的想法.經過考慮後就決定Android源碼系列就先從Android原生應用源碼開始最後到framework層.這一篇就從DeskClock程序開始.
二.移植出DeskClock
1.環境平臺
博主目前的環境配置
系統:Ubuntu 14.04 LTS
IDE:Android Studio 1.2.1.1
JDK:1.8
SDK:所有版本 (有百度雲資源)
Android源碼:Android kitkat 4.4 & Android lollipop 5.0(有百度雲資源)
2.準備源碼
這個系列分析的是Android kitkat(4.4)版本的DeskClock程序.用4.4版本來分析主要原因是博主的手機是4.4的,之前有移植lollipop的DeskClock程序到手機上,結果不兼容,後來就用kitkat的DeskClock程序了.
既然分析參考DeskClock的內容,當然需要有源碼才行,還必須得原汁原味的.大家可以去官方直接git clone代碼下來(當然需要翻牆)https://android.googlesource.com/platform/packages/apps/DeskClock,懶得翻牆的童鞋也可以從博主這裏下載,博主是從官網clone的代碼,然後摘的kitkat-release分支,從下圖可以看到這個節點上打了所有4.4版本的tag.所以只要是Android 4.4版本的原生鐘錶程序都是這個源碼.CSDN下載
3.導入工程
將DeskClock源碼導入到Android studio中,編譯發現有很多錯誤,可以發現是缺少一些依賴庫,主要是support v4 和 v13,在File -> Project Structure -> app -> Dependencies -> + 選擇support-v4 和 support-v13. 然後rebuild
rebuild完之後發現錯誤少了一批,主要還剩下一個 package com.android.datetimepicker.time does not exist,在剛在的依賴選擇那裏根本沒有這個庫,分析主要原因就是DeskClock在源碼環境中是系統級app,他的編譯環境也是在源碼環境下,所以他依賴的其他的庫都在源碼路徑下,我們也可以從DeskClock源碼下的Android.mk文件中看出結果.
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# include res directory from timepicker
datetimepicker_dir := ../../../frameworks/opt/datetimepicker/res
res_dirs := $(datetimepicker_dir) res
LOCAL_RESOURCE_DIR := $(addprefix $(LOCAL_PATH)/, $(res_dirs))
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v13
LOCAL_STATIC_JAVA_LIBRARIES += android-support-v4
LOCAL_STATIC_JAVA_LIBRARIES += android-opt-datetimepicker
從Android.mk文件中可以看到DeskClock依賴了三個庫,分別是android-support-v13,android-support-v4和android-opt-datetimpicker.之前v13和v4的依賴已經加進去了,選擇就差datetimpicker這個庫,而這個庫的位置也是知道的,在上面有加載一個路徑到環境裏面:/frameworks/opt/datetimepicker.這個文件別的地方就找不到了,只能去Android源碼裏面去找了,幸好有Android
4.4的系統源碼,在opt路徑下找到這個datetimepicker庫源碼.
把datetimepicker以module的形式導入到DeskClock的項目中去,並且添加項目依賴.沒有系統源碼的童鞋可以點擊下載:datetimepicker CSDN
這個時候項目的結構是這樣的.
再rebuild----一個錯誤都沒有了,然後可以直接把程序跑到手機裏面了.以下是運行效果圖.