新聞中心
Android源碼追蹤—android:onClick
之前對(duì)源碼的閱讀,總是用時(shí)一通亂七八糟的跳轉(zhuǎn),以學(xué)會(huì)使用為目的;過(guò)了一段時(shí)間,就忘記了,因此打算將一些源碼的閱讀經(jīng)歷記錄下來(lái),也通過(guò)敲一遍的過(guò)程,加深理解。
創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)七星關(guān)區(qū),十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來(lái)電咨詢建站服務(wù):13518219792
最開(kāi)始,用一個(gè)比較簡(jiǎn)單的例子來(lái)小試牛刀吧
對(duì)于View(Button、TextView等)的點(diǎn)擊事件,常用的寫(xiě)法是通過(guò) findViewById 獲取View的實(shí)例,然后通過(guò) setOnClickListener 設(shè)置監(jiān)聽(tīng)事件,比如我們有如下Button控件。
設(shè)置點(diǎn)擊事件(假設(shè)在Activity中)
但是還有一種寫(xiě)法是在xml布局中通過(guò)android:onClick屬性直接指定點(diǎn)擊執(zhí)行的函數(shù)。
【思考】
首先我們知道諸如 android:xxx 之類的屬性是會(huì)在某個(gè)attrs文件中定義的,此處的 android:onClick 是View的屬性,定義在如下文件中。
在View的構(gòu)造函數(shù)中,會(huì)解析出此屬性的值。
看這里, 如果變量handlerName不為空,就會(huì)為此View設(shè)置點(diǎn)擊事件了 ,這個(gè)handlerName就是onClick屬性的值doSubmit,但這個(gè)點(diǎn)擊事件,并不是我們所熟悉的OnClickListener。
進(jìn)一步看看這個(gè) DeclaredOnClickListener 類
DeclaredOnClickListener 實(shí)現(xiàn)了 OnClickListener ,其中重點(diǎn)是參數(shù) mResolvedMethod 和 mResolvedContext 。
在onClick事件中最終通過(guò)反射 mResolvedMethod.invoke(mResolvedContext, v); 執(zhí)行了doSubmit方法。
doSubmit的訪問(wèn)權(quán)限是否可以設(shè)置為private呢?
答案:不可以,因?yàn)樵创a中沒(méi)有調(diào)用 mMethod.setAccessible(true); 注入所有修飾符。
其實(shí)在onClick屬性的注釋中就已經(jīng)說(shuō)明了。
如何獲取android源代碼
當(dāng)前的Android?代碼托管在兩個(gè)方:? 和??之前在 android.git.kernel.org?上也有托管,不過(guò)現(xiàn)在重定向到了??好在都支持git訪問(wèn)。
google?提供的?repo?工具實(shí)際上是一個(gè)內(nèi)部操作git工具來(lái)簡(jiǎn)化操作Android源碼的Python腳本。經(jīng)過(guò)嘗試,直接使用git?工具在ubuntu?下可以實(shí)現(xiàn)clone?Android?源碼。下面介紹一下方法:
1.?獲取當(dāng)前的在github?上托管的Android?git?repositories:
github頁(yè)面為:??。不過(guò)這個(gè)頁(yè)面不支持通過(guò)?wget?""?或者?curl?""?的方式訪問(wèn),?錯(cuò)誤信息如下:
這樣一來(lái),獲取這個(gè)頁(yè)面內(nèi)容并解析出其中的git?repositories就需要手工完成了。好在方法也很簡(jiǎn)單:?瀏覽器中打開(kāi)這個(gè)頁(yè)面,然后"查看源文件"并保存為文本文件,比如保存為"android_git.html"。最后,通過(guò)下面的一行腳本來(lái)取出?Android?git?repositories.
grep?-o?"span?class=\"repo\".*/span"?./android_git.html?|?cut?-d?""?-f2?|?cut?-d?""?-f1??android_git.txt
2.?基于第1步獲取的Android?git?repositories?來(lái)生成clone?git的腳本:
執(zhí)行如下的一行awk腳本
awk?'BEGIN{i=1;?print?"#!/usr/bin/env?bash"?}{?print?"\n\necho?\"begin?clone?android?git?["i"]:?"?$1?"\"";?print?"git?clone?
"?$1?".git";?print?"echo?\"finish?clone?android?git?["i"]:?"?$1?"\""?;?i=i+1;?}'?./android_git.txt??
git_clone_android.sh
現(xiàn)在用于clone?android?git的腳本生成好了,一共有?103?個(gè)?git?repository.
3.?執(zhí)行g(shù)it_clone_android.sh這個(gè)腳本即可。
整體Android?源碼的代碼量是相當(dāng)龐大,完成所有的clone?任務(wù)后,大概占用了?7G?磁盤(pán)空間,歷時(shí)20多個(gè)小時(shí),這是在網(wǎng)速比較快的情況下達(dá)到的效果:
其間也有許多問(wèn)題,比如多次出現(xiàn)如下的錯(cuò)誤:
這個(gè)時(shí)候需能做的只能是"try?again"了。
需要說(shuō)明的是"不要試圖同時(shí)并發(fā)執(zhí)行多個(gè)git?clone?命令",這樣會(huì)導(dǎo)致大量出現(xiàn)上面貼圖中的錯(cuò)誤,另外,整個(gè)clone過(guò)程中耗時(shí)最多的git?repository?如下:
kernel_common.git?kernel_msm.git?platform_frameworks_base.git?platform_prebuilt.git?其中?platform_prebuilt.git?是google?提供的預(yù)編譯好的二進(jìn)制文件,包含:?各種庫(kù)文件,jar?包,可執(zhí)行程序等等,如果只是閱讀Android?源代碼,這個(gè)git?repository?可以不用clone.
怎樣查看 Android APP 源代碼
需要把反編譯的apk存放到apktools同級(jí)文件夾目錄下,然后運(yùn)行要查看的安裝包,具體操作如下:
1、首先把反編譯的apk存放到apktools同級(jí)文件夾目錄下,如下圖所示。
2、按住shift+鼠標(biāo)右鍵打開(kāi)命令窗口,運(yùn)行代碼 apktool d yd.apk(安裝包的名字)。
3、apk后綴名改成zip,解壓雙擊打開(kāi)xml格式文件如下圖所示。
4、打開(kāi)cmd命令窗口,如下圖所示依次輸入命令。
5、將classes.dex打包成jar包 需要用到dex2ja。
6、然后就可以查看需要的源代碼,如下圖所示。
如何查看Android源碼
當(dāng)我們?cè)趀clipse中開(kāi)發(fā)android程序的時(shí)候,往往需要看源代碼(可能是出于好奇,可能是讀源碼習(xí)慣),那么如何查看Android源代碼呢?
比如下面這種情況
假設(shè)我們想?yún)⒖碅ctivity類的源代碼,按著Ctrl鍵,左擊它,現(xiàn)實(shí)的結(jié)果卻看不到代碼的,提示的信息便是“找不到Activity.class文件”。
此時(shí)點(diǎn)擊下面的按鈕,“Change Attached Source…”,選擇android源代碼所在位置,便彈出圖三的對(duì)話框。
第一種是選擇工作目錄,即已經(jīng)存在的android應(yīng)用程序源代碼。
第二種分兩種方式
(1)選擇External File…按鈕,添加Jar格式文件或者zip格式文件路徑;
(2)選擇External Floder…按鈕,添加文件夾所在路徑。
下面問(wèn)題就來(lái)了,源代碼在哪里?不能憑空產(chǎn)生阿。
可以通過(guò)Android SDK Manager進(jìn)行源代碼下載;(推薦該種方法),如圖四
勾選Source for Android SDK,進(jìn)行下載即可。
此外也可通過(guò)其他途徑下載,網(wǎng)上有很多共享的資源。
這里選擇第二種方式的(2)方法,選擇源碼所在目錄(即圖四下載源代碼目錄所在路徑),如圖五
點(diǎn)擊“OK”按鈕,此時(shí),Activity文件便能夠查看源代碼了,如圖六。
這樣就大功告成了?。?!
分享標(biāo)題:源碼android,源碼資本
轉(zhuǎn)載注明:http://fisionsoft.com.cn/article/dsicecs.html