真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

android源碼閱讀,Android 閱讀

大牛們是怎么閱讀 Android 系統(tǒng)源碼的

由于工作需要大量修改framework代碼, 在AOSP(Android Open Source Project)源碼上花費了不少功夫, Application端和Services端都看和改了不少.

成都創(chuàng)新互聯(lián)公司主營通州網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app開發(fā)定制,通州h5成都微信小程序搭建,通州網(wǎng)站營銷推廣歡迎通州等地區(qū)企業(yè)咨詢

如果只是想看看一些常用類的實現(xiàn), 在Android包管理器里把源碼下載下來, 隨便一個IDE配好Source Code的path看就行.

但如果想深入的了解Android系統(tǒng), 那么可以看下我的一些簡單的總結(jié).

知識

Java

Java是AOSP的主要語言之一. 沒得說, 必需熟練掌握.

熟練的Android App開發(fā)

Linux

Android基于Linux的, 并且AOSP的推薦編譯環(huán)境是Ubuntu 12.04. 所以熟練的使用并了解Linux這個系統(tǒng)是必不可少的. 如果你想了解偏底層的代碼, 那么必需了解基本的Linux環(huán)境下的程序開發(fā). 如果再深入到驅(qū)動層, 那么Kernel相關(guān)的知識也要具備.

Make

AOSP使用Make系統(tǒng)進行編譯. 了解基本的Makefile編寫會讓你更清晰了解AOSP這個龐大的項目是如何構(gòu)建起來的.

Git

AOSP使用git+repo進行源碼管理. 這應(yīng)該是程序員必備技能吧.

C++

Android系統(tǒng)的一些性能敏感模塊及第三方庫是用C++實現(xiàn)的, 比如: Input系統(tǒng), Chromium項目(WebView的底層實現(xiàn)).

硬件

流暢的國際網(wǎng)絡(luò)

AOSP代碼下載需要你擁有一個流暢的國際網(wǎng)絡(luò). 如果在下載代碼這一步就失去耐心的話, 那你肯定沒有耐心去看那亂糟糟的AOSP代碼. 另外, 好程序員應(yīng)該都會需要一個流暢的Google.

一臺運行Ubuntu 12.04的PC.

如果只是閱讀源碼而不做太多修改的話, 其實不需要太高的配置.

一臺Nexus設(shè)備

AOSP項目默認只支持Nexus系列設(shè)備. 沒有也沒關(guān)系, 你依然可以讀代碼. 但如果你想在大牛之路走的更遠, 還是改改代碼, 然后刷機調(diào)試看看吧.

高品質(zhì)USB線

要刷機時線壞了, 沒有更窩心的事兒了.

軟件

Ubuntu 12.04

官方推薦, 沒得選.

Oracle Java 1.6

注意不要用OpenJDK. 這是個坑, 官方文檔雖然有寫, 但還是單獨提一下.

安裝:

sudo apt-get install python-software-properties

sudo add-apt-repository ppa:webupd8team/java

sudo apt-get update

sudo apt-get install oracle-java6-installer

sudo apt-get install oracle-java6-set-default

Eclipse

估計會有不少人吐槽, 為什么要用這個老古董. 其實原因很簡單, 合適. 剛開始搞AOSP時, 為了找到效率最優(yōu)的工具, 我嘗試過Eclipse, IntelliJ IDEA, Vim+Ctags, Sublime Text+Ctags. 最終結(jié)果還是Eclipse. 主要優(yōu)點有:

有語法分析 (快速準(zhǔn)確的類, 方法跳轉(zhuǎn)).

支持C++ (IntelliJ的C++支持做的太慢了).

嵌入了DDMS, View Hierarchy等調(diào)試工具.

為了提高效率, 花5分鐘背下常用快捷鍵非常非常值得.

調(diào)整好你的classpath, 不要導(dǎo)入無用的代碼. 因為AOSP項目代碼實在是太多了. 當(dāng)你還不需要看C++代碼時, 不要為項目添加C++支持, 建索引過程會讓你崩潰.

Intellij IDEA

開發(fā)App必備. 當(dāng)你要調(diào)試系統(tǒng)的某個功能是, 常常需要迅速寫出一個調(diào)試用App, 這個時候老舊的Eclipse就不好用了. Itellij IDEA的xml自動補全非常給力.

巨人的肩膀

這個一定要先讀. 項目介紹, 代碼下載, 環(huán)境搭建, 刷機方法, Eclipse配置都在這里. 這是一切的基礎(chǔ).

這個其實是給App開發(fā)者看的. 但是里面也有不少關(guān)于系統(tǒng)機制的介紹, 值得細讀.

此老羅非彼老羅. 羅升陽老師的博客非常有營養(yǎng), 基本可以作為指引你開始閱讀AOSP源碼的教程. 你可以按照博客的時間順序一篇篇挑需要的看.但這個系列的博客有些問題:

早期的博客是基于舊版本的Android;

大量的代碼流程追蹤. 讀文章時你一定要清楚你在看的東西在整個系統(tǒng)處于什么樣的位置.

鄧凡平老師也是為Android大牛, 博客同樣很有營養(yǎng). 但是不像羅升陽老師的那么系統(tǒng). 更多的是一些技術(shù)點的深入探討.

Android官方Issue列表. 我在開發(fā)過程中發(fā)現(xiàn)過一些奇怪的bug, 最后發(fā)現(xiàn)這里基本都有記錄. 當(dāng)然你可以提一些新的, 有沒有人改就是另外一回事了.

一定要能流暢的使用這個工具. 大量的相關(guān)知識是沒有人系統(tǒng)的總結(jié)的, 你需要自己搞定.

其它

代碼組織

AOSP的編譯單元不是和git項目一一對應(yīng)的, 而是和Android.mk文件一一對應(yīng)的. 善用mmm命令進行模塊編譯將節(jié)省你大量的時間.

Binder

這是Android最基礎(chǔ)的進程間通訊. 在Application和System services之間大量使用. 你不僅要知道AIDL如何使用, 也要知道如何手寫B(tài)inder接口. 這對你理解Android的Application和System services如何交互有非常重要的作用. Binder如何實現(xiàn)的倒不必著急看.

HAL

除非你對硬件特別感興趣或者想去方案公司上班, 否則別花太多時間在這一層.

CyanogenMod

這是一個基于AOSP的第三方Rom. 從這個項目的wiki里你能學(xué)到很多AOSP官方?jīng)]有告訴你的東西. 比如如何支持Nexus以外的設(shè)備.

DIA

這是一個Linux下畫UML的工具, 能夠幫你梳理看過的代碼.

XDA

這里有最新資訊和最有趣的論壇.

想到了再補充.

[Android源碼分析] - 異步通信Handler機制

一、問題:在Android啟動后會在新進程里創(chuàng)建一個主線程,也叫UI線程( 非線程安全 )這個線程主要負責(zé)監(jiān)聽屏幕點擊事件與界面繪制。當(dāng)Application需要進行耗時操作如網(wǎng)絡(luò)請求等,如直接在主線程進行容易發(fā)生ANR錯誤。所以會創(chuàng)建子線程來執(zhí)行耗時任務(wù),當(dāng)子線程執(zhí)行完畢需要通知UI線程并修改界面時,不可以直接在子線程修改UI,怎么辦?

解決方法:Message Queue機制可以實現(xiàn)子線程與UI線程的通信。

該機制包括Handler、Message Queue、Looper。Handler可以把消息/ Runnable對象 發(fā)給Looper,由它把消息放入所屬線程的消息隊列中,然后Looper又會自動把消息隊列里的消息/Runnable對象 廣播 到所屬線程里的Handler,由Handler處理接收到的消息或Runnable對象。

1、Handler

每次創(chuàng)建Handler對象時,它會自動綁定到創(chuàng)建它的線程上。如果是主線程則默認包含一個Message Queue,否則需要自己創(chuàng)建一個消息隊列來存儲。

Handler是多個線程通信的信使。比如在線程A中創(chuàng)建AHandler,給它綁定一個ALooper,同時創(chuàng)建屬于A的消息隊列AMessageQueue。然后在線程B中使用AHandler發(fā)送消息給ALooper,ALooper會把消息存入到AMessageQueue,然后再把AMessageQueue廣播給A線程里的AHandler,它接收到消息會進行處理。從而實現(xiàn)通信。

2、Message Queue

在主線程里默認包含了一個消息隊列不需要手動創(chuàng)建。在子線程里,使用Looper.prepare()方法后,會先檢查子線程是否已有一個looper對象,如果有則無法創(chuàng)建,因為每個線程只能擁有一個消息隊列。沒有的話就為子線程創(chuàng)建一個消息隊列。

Handler類包含Looper指針和MessageQueue指針,而Looper里包含實際MessageQueue與當(dāng)前線程指針。

下面分別就UI線程和worker線程講解handler創(chuàng)建過程:

首先,創(chuàng)建handler時,會自動檢查當(dāng)前線程是否包含looper對象,如果包含,則將handler內(nèi)的消息隊列指向looper內(nèi)部的消息隊列,否則,拋出異常請求執(zhí)行l(wèi)ooper.prepare()方法。

- 在 UI線程 中,系統(tǒng)自動創(chuàng)建了Looper 對象,所以,直接new一個handler即可使用該機制;

- 在 worker線程 中,如果直接創(chuàng)建handler會拋出運行時異常-即通過查‘線程-value’映射表發(fā)現(xiàn)當(dāng)前線程無looper對象。所以需要先調(diào)用Looper.prepare()方法。在prepare方法里,利用ThreadLocalLooper對象為當(dāng)前線程創(chuàng)建一個Looper(利用了一個Values類,即一個Map映射表,專為thread存儲value,此處為當(dāng)前thread存儲一個looper對象)。然后繼續(xù)創(chuàng)建handler, 讓handler內(nèi)部的消息隊列指向該looper的消息隊列(這個很重要,讓handler指向looper里的消息隊列,即二者共享同一個消息隊列,然后handler向這個消息隊列發(fā)送消息,looper從這個消息隊列獲取消息) 。然后looper循環(huán)消息隊列即可。當(dāng)獲取到message消息,會找出message對象里的target,即原始發(fā)送handler,從而回調(diào)handler的handleMessage() 方法進行處理。

- handler與looper共享消息隊列 ,所以handler發(fā)送消息只要入列,looper直接取消息即可。

- 線程與looper映射表 :一個線程最多可以映射一個looper對象。通過查表可知當(dāng)前線程是否包含looper,如果已經(jīng)包含則不再創(chuàng)建新looper。

5、基于這樣的機制是怎樣實現(xiàn)線程隔離的,即在線程中通信呢。?

核心在于 每一個線程擁有自己的handler、message queue、looper體系 。而 每個線程的Handler是公開 的。B線程可以調(diào)用A線程的handler發(fā)送消息到A的共享消息隊列去,然后A的looper會自動從共享消息隊列取出消息進行處理。反之一樣。

二、上面是基于子線程中利用主線程提供的Handler發(fā)送消息出去,然后主線程的Looper從消息隊列中獲取并處理。那么還有另外兩種情況:

1、主線程發(fā)送消息到子線程中;

采用的方法和前面類似。要在子線程中實例化AHandler并設(shè)定處理消息的方法,同時由于子線程沒有消息隊列和Looper的輪詢,所以要加上Looper.prepare(),Looper.loop()分別創(chuàng)建消息隊列和開啟輪詢。然后在主線程中使用該AHandler去發(fā)送消息即可。

2、子線程A與子線程B之間的通信。

1、 Handler為什么能夠?qū)崿F(xiàn)不同線程的通信?核心點在哪?

不同線程之間,每個線程擁有自己的Handler、消息隊列和Looper。Handler是公共的,線程可以通過使用目標(biāo)線程的Handler對象來發(fā)送消息,這個消息會自動發(fā)送到所屬線程的消息隊列中去,線程自帶的Looper對象會不斷循環(huán)從里面取出消息并把消息發(fā)送給Handler,回調(diào)自身Handler的handlerMessage方法,從而實現(xiàn)了消息的線程間傳遞。

2、 Handler的核心是一種事件激活式(類似傳遞一個中斷)的還是主要是用于傳遞大量數(shù)據(jù)的?重點在Message的內(nèi)容,偏向于數(shù)據(jù)傳輸還是事件傳輸。

目前的理解,它所依賴的是消息隊列,發(fā)送的自然是消息,即類似事件中斷。

0、 Android消息處理機制(Handler、Looper、MessageQueue與Message)

1、 Handler、Looper源碼閱讀

2、 Android異步消息處理機制完全解析,帶你從源碼的角度徹底理解

謝謝!

wingjay

![](;s=460)

怎樣查看 Android APP源代碼?

將apk文件拷貝至sdcard上。

命令順序如下:

進入Android sdk文件夾/tools目錄下

輸入adb shell

輸入su

輸入cd data

輸入cd app

這時就可以看到你安裝的所有的apk文件。輸入cp 空格 對應(yīng)的apk 空格 /sdcard/

這樣就將apk文件拷貝出來了。

將apk文件后綴直接變成rar格式,可以看到熟悉的目錄結(jié)構(gòu)了,

其中xml文件打開后都是二進制的,無法查看。

這時就用到了一個android4me的AXMLPrinter2工具。(請自行百度搜索)

輸入以下命令,將xml文件解析出來

java -jar AXMLPrinter2.jar showtimes_list.xml

此命令是在命令行中查看此showtimes_list.xml

將showtimes_list.xml生成xml文件,則輸入以下命令:

java -jar AXMLPrinter2.jar showtimes_list.xml h.xml

目前進行到這一步,只能看到xml文件的內(nèi)容,其工程中的java源文件還是看不到,看目錄結(jié)構(gòu)下有一個classes.dex文件,我們需要將dex文件變?yōu)閖ar文件。

這里用到了另一個工具dex2jar。(自行搜索下載)

在Windows下解壓之后的目錄如下圖所示:

在命令行中,進入到此目錄下:

在Windows下,輸入以下命令:

dex2jar.bat c:\classes.dex

運行完之后,在C盤會多一個classes.dex.dex2jar.jar文件,此文件就是我們需要的jar文件。

利用jd-gui,將jar文件反向工程為java代碼。(請自行搜索下載)

它分為Windows、Linux、和max三個版本,這里我下載的是Windows版本的。

解壓之后,雙擊運行exe文件,選擇classes.dex.dex2jar.jar文件,相應(yīng)的jar文件中的Java文件就被反向工程顯示出來了!

Android是一種基于Linux的自由及開放源代碼的操作系統(tǒng),主要使用于移動設(shè)備,如智能手機和平板電腦,由Google公司和開放手機聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。尚未有統(tǒng)一中文名稱,中國大陸地區(qū)較多人使用“安卓”或“安致”。Android操作系統(tǒng)最初由Andy Rubin開發(fā),主要支持手機。2005年8月由Google收購注資。2007年11月,Google與84家硬件制造商、軟件開發(fā)商及電信營運商組建開放手機聯(lián)盟共同研發(fā)改良Android系統(tǒng)。隨后Google以Apache開源許可證的授權(quán)方式,發(fā)布了Android的源代碼。第一部Android智能手機發(fā)布于2008年10月。Android逐漸擴展到平板電腦及其他領(lǐng)域上,如電視、數(shù)碼相機、游戲機等。2011年第一季度,Android在全球的市場份額首次超過塞班系統(tǒng),躍居全球第一。 2013年的第四季度,Android平臺手機的全球市場份額已經(jīng)達到78.1%。?[1]??2013年09月24日谷歌開發(fā)的操作系統(tǒng)Android在迎來了5歲生日,全世界采用這款系統(tǒng)的設(shè)備數(shù)量已經(jīng)達到10億臺。

Android一詞最早出現(xiàn)于法國作家利爾亞當(dāng)(Auguste Villiers de l'Isle-Adam)在1886年發(fā)表的科幻小說《未來夏娃》(L'ève future)中。他將外表像人的機器起名為Android。

Android的Logo是由Ascender公司設(shè)計的,誕生于2010年,其設(shè)計靈感源于男女廁所門上的圖形符號, [1]? 于是布洛克繪制了一個簡單的機器人,它的軀干就像錫罐的形狀,頭上還有兩根天線,Android小機器人便誕生了。其中的文字使用了Ascender公司專門制作的稱之為“Droid ” 的字體。Android是一個全身綠色的機器人,綠色也是Android的標(biāo)志。顏色采用了PMS 376C和RGB中十六進制的#A4C639來繪制,這是Android操作系統(tǒng)的品牌象徵。有時候,它們還會使用純文字的Logo。

Android源碼追蹤—android:onClick

之前對源碼的閱讀,總是用時一通亂七八糟的跳轉(zhuǎn),以學(xué)會使用為目的;過了一段時間,就忘記了,因此打算將一些源碼的閱讀經(jīng)歷記錄下來,也通過敲一遍的過程,加深理解。

最開始,用一個比較簡單的例子來小試牛刀吧

對于View(Button、TextView等)的點擊事件,常用的寫法是通過 findViewById 獲取View的實例,然后通過 setOnClickListener 設(shè)置監(jiān)聽事件,比如我們有如下Button控件。

設(shè)置點擊事件(假設(shè)在Activity中)

但是還有一種寫法是在xml布局中通過android:onClick屬性直接指定點擊執(zhí)行的函數(shù)。

【思考】

首先我們知道諸如 android:xxx 之類的屬性是會在某個attrs文件中定義的,此處的 android:onClick 是View的屬性,定義在如下文件中。

在View的構(gòu)造函數(shù)中,會解析出此屬性的值。

看這里, 如果變量handlerName不為空,就會為此View設(shè)置點擊事件了 ,這個handlerName就是onClick屬性的值doSubmit,但這個點擊事件,并不是我們所熟悉的OnClickListener。

進一步看看這個 DeclaredOnClickListener 類

DeclaredOnClickListener 實現(xiàn)了 OnClickListener ,其中重點是參數(shù) mResolvedMethod 和 mResolvedContext 。

在onClick事件中最終通過反射 mResolvedMethod.invoke(mResolvedContext, v); 執(zhí)行了doSubmit方法。

doSubmit的訪問權(quán)限是否可以設(shè)置為private呢?

答案:不可以,因為源碼中沒有調(diào)用 mMethod.setAccessible(true); 注入所有修飾符。

其實在onClick屬性的注釋中就已經(jīng)說明了。

怎樣查看 Android APP 源代碼

用壓縮軟件打開apk文件,解壓出根目錄中的classes.dex文件

使用cmd ,dex2jar.bat classes.dex命令將classes.dex轉(zhuǎn)換為jar

再用jd-gui打開該jar就可以查看源碼了,如果apk安全性好的話,有些代碼是看不到的


名稱欄目:android源碼閱讀,Android 閱讀
網(wǎng)頁網(wǎng)址:http://weahome.cn/article/phccdo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部