開發(fā)調試環(huán)境: Ubuntu 14/display/IDEADEV/Inotify+Watches+Limit),具體內容如下圖:四、解決源碼中跳轉錯誤問題 ①為當前工程設置正確的SDK和JDK②設置'Modules'的依賴先將所有依賴刪掉,只留下上圖'1'所指向的兩個(注意:這里刪除全部只是為了方便。如果確實用到了.jar,在將它們的路徑添加進來就可以了. 如:5.0.1的ContactsCommon用到了geocoder-2.9.jar和libphonenumber-6.2.jar) 點擊上圖中'2'指向的'+'并選擇上圖'3'指向的'Jars or directories'選項,依次將frameworks和external文件夾添加進來.如:其它版本的代碼在添加frameworks時可能會顯示成:沒有關系,只是顯示問題,點擊OK還是會把frameworks路徑添加進去的. 如果還有代碼跳轉錯誤,請仿照上面的步驟將相應代碼的路徑或jar文件添加到其Dependencies標簽頁中即可. 五、DEBUG源碼 我們可以通過給剛導入的工程在'Modules'中添加'Android Framework'來讓AS將它作為一個Android工程,從而方便我們調試代碼.可以按照上圖中'1'和'2'來添加Android Framework支持.在代碼中加斷點,然后選擇'Run'-'Attach debugger to Android process'或者直接點擊下圖所示的圖標 在彈出的選擇進程(Choose Process)對話框中,勾選顯示所有進程,選擇要DEBUG的代碼所在的進程,點擊OK即可. 六、其它 代碼中很多地方提示Call requires API Level x.... 出現(xiàn)這個問題是因為AS將我們的工程當做安卓應用程序工程了,且源碼中沒有指定minSdkVersion. 我們只需在源碼根目錄加一個聲明minSdkVersion的AndroidManifest.xml文件即可(分享了一個AndroidManifest.xml)。 也可以考慮使用build.gradle來解決該問題。

成都創(chuàng)新互聯(lián)公司主打移動網(wǎng)站、成都網(wǎng)站建設、成都做網(wǎng)站、網(wǎng)站改版、網(wǎng)絡推廣、網(wǎng)站維護、國際域名空間、等互聯(lián)網(wǎng)信息服務,為各行業(yè)提供服務。在技術實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務,根據(jù)網(wǎng)站的內容與功能再決定采用什么樣的設計。最后,要實現(xiàn)符合網(wǎng)站需求的內容、功能與設計,我們還會規(guī)劃穩(wěn)定安全的技術方案做保障。
創(chuàng)建文件 IMyApiService
文件路徑 frameworks/base/core/java/android/os/
定義了一個計算和的方法。
在frameworks/base/Android.mk
LOCAL_SRC_FILES最后加入
創(chuàng)建文件 MyApiService.java
文件路徑 frameworks/base/core/java/com/android/server/
實現(xiàn)aidl的接口,計算參數(shù)和。
(1)Context添加服務名
文件路徑 frameworks/base/core/java/android/content/Context.java
添加
(2)添加啟動服務
文件路徑 frameworks/base/services/java/com/android/server/SystemServer.java
在startOtherServices方法中添加
創(chuàng)建 MyApiManager.java文件
文件路徑 frameworks/base/core/java/android/app/
文件路徑 frameworks/base/core/java/android/app/ContextImpl
添加registerService
記住make update-api
編譯打包完成后,燒寫新的固件。
jar主要為了在android studio編譯環(huán)境中MyApiManager報錯導致編譯不通過問題。
也可以導入frameworks jar包或使用反射。
在源碼目錄packages/app下新建MyJar文件夾
并新建目錄com/myapi/(包名)
在目錄com/myapi/新建文件MyApi.java
具體Android.mk語法這里不做解釋,可以自行查閱
在MyApi目錄下直接運行mm編譯命令(記得先source build/envsetup.sh)
待編譯完成后,jar生成目錄
out/target/common/obj/JAVA_LIBRARIES/Myapi_intermediates/javalib.jar
可更改為其他名稱。
用eclipse?+?ADT作為android開發(fā)工具,?可以說是很方便的,在HelloActivity小程序里我們就感覺到eclipse功能的強大。那么,我們可以用?eclipse來開發(fā)android源碼嗎?如果我們直接把android源碼里一個工程導入eclipse,一般來說都會出現(xiàn)錯誤,說許多類庫(包)找?不到。
今天找到關于怎樣使用eclipse來開發(fā)android源碼的官方文檔:
e7?V/?[:?]!?l*?P+?n0?`
從該文檔和實踐可以總結出幾點:0?J*?f"?t:?q/?i?c
1、可以使用eclipse來編輯JAVA程序、檢查錯誤(主要是類庫包含和語法方面),但是不能在eclipse上編譯運行android源碼,還是得在shell中make(或mm或mmm)
2、android源碼文件夾里提供有一些eclipse配置文件,.?n;?`4?E)?z5?B8?G6?V,?z1?x2?a
.claapath:eclipse工程的配置文件,方便我們直接把android源碼相應的文件和JAVA包導入工程#??%?B9?J,?m!?t%?n0?t*?B9?P'??;?{
android-formatting.xml和android.importorder:這個很重要,主要是用來規(guī)范我們的編碼風格,更容易使我們的代碼風格一致
3、把android源碼作為一個工程導入eclipse時,必須注意兩點
1)、新建的工程必須是java?project,不能是android?project,否則會破壞android源碼(一般是多添加文件/文件夾)
2)、導入前最好檢查.classpath里的文件在android源碼中是否有相應的文件(文件夾),否則也會破壞android源碼(一般是多添加文件/文件夾)
總的來說:!?P"?A+?~'?]%?p9?I5?U7?V;?S;?B
1、用eclipse來編輯代碼、檢查錯誤
2、不在eclipse上編譯、運行android源碼程序,只能在命令行通過make(或mm或mmm)編譯android源碼
3、可以在eclipse上調試android源碼程序(原理:eclipse通過ddms服務器在emulator上進行調試),并可以單步調試、斷點調試。
下面,從官方文檔總結出具體怎樣用eclipse來開發(fā)android源碼
1、建立基本的android開發(fā)環(huán)境3?{#??0?q:?D?k#?k)?\$?R
請參考官方文檔或
2、編譯android源碼
android源碼根目錄下通過make進行編譯,請注意一些配置,具體可參考
3、把eclipse工程配置文件復制到android源碼根目錄下
cp?development/ide/eclipse/.classpath?./
chmod?u+w?.classpath?#?Make?the?copy?writable
4、修改eclipse程序的配置
1)、修改eclipse緩存設置
把eclipse.ini(在eclipse軟件的安裝目錄下)的3個值改為下面的值:
-Xms128m/?i2?t!?A4?p!?Z%?V/?q#?o"?J
-Xmx512m;?J??z8?E.?@'?z'?D'?D3?W
-XX:MaxPermSize=256m
2)、把android-formatting.xml和android.importorder導入eclipse
android-formatting.xml、.classpath和android.importorder都放在development/ide/eclipse/下
android-formatting.xml用來配置eclipse編輯器的代碼風格;android.importorder用來配置eclipse的import的順序和結構。(?S8?q$?p'?T*?x"?\/?H7?a
在window-preferences-java-Code?style-Formatter中導入android-formatting.xml+?X"?y*?b!?N$?m
在window-preferences-java-Code?style-Organize?Imports中導入android.importorder#?F??d5?X"?H.?X
3)、安裝anyedit插件(可選)#?G9?C;?h/?Z?q5?D!?s8?z7?y9?_
在下載并導入eclipse中+?J.?X#?@5??3?r3?U
5、把android源碼作為一個工程導入eclipse
導入前先檢查.classpath里的文件在android源碼中是否有相應的文件(文件夾),否則也會破壞android源碼(一般是多添加文件/文件夾),.classpath里多余的路徑可刪除-?]!?U4?n$?@:?~9?b+?A1?|-?z
新建Java?Project(不是android?project,否則會破壞android源碼),選擇從已存在的工程導入,工程名任意,完成。
導入時,eclipse要build工程,比較慢。導完后,一般都沒有錯誤。"?B(?U??i%?w#?w*?y4?]
6、eclipse上調試android里的程序。
先執(zhí)行:$?K+?H,?r.?},?v.?_??U5?q'?x?~,?I
cd?android源碼目錄
.?build/envsetup.sh
lunch?1?#?to?build?the?emulator
emulator??#?you?should?see?a?GUI?picture?of?a?phone$?q-?{/?n6?z+?{.?k0?O?I0?\-?p
ddms??#?you?should?get?a?splufty?debugging?console
然后在eclipse中配置調試類型和端口:5?z8?t(?q*?A+?o-?g7?L#?_
在Run-Debug?Configurations-Remote?java?application上雙擊,然后,”Host:”設為localhost,”Port:”設為8700,”Connection?Type”為Standard(Socket?Attach)
然后“Apply”-?Q7?I(?\8?v4?B??A9?R/?Q?u
注意,在點擊”Debug”時苦出錯,說8700端口被占用,那么把DDMS程序關掉,重新打開DDMS就OK了。如果提供連不到VM錯誤時,請注意,要先在DDMS中選中某一進程(對應某一應用程序),才能在eclipse執(zhí)行?Debug。.?B%?\*?E!?T,?K7?N8?U??b
在eclipse調試時,可以設斷點、單步調試。估計google團隊也是這樣開發(fā)、調試android應用程序的?X:?n6?t"?|%?B4?E
7、編譯android源碼2??:?`9?i0?O1?U;?E*?|+?Z'?]/?r
執(zhí)行:
cd?android源碼目錄0?v1?Z;?p1?P0?|$?V6?x5?A.?@$?S2?o7?p
.?build/envsetup.sh$?R!?h!?^-?l/?l:?i5?P
那么就會多出mm/mmm等命令,mm/mmm用來編譯模塊(包括C、C++、JAVA程序)。我們也可以直接在?android源碼根目錄下執(zhí)行“make?模塊名”來編譯模塊。
來自開源中國網(wǎng)老槍的分享
點可以理解為選中態(tài),在Android TV上起很重要的作用。一個視圖控件只有在獲得焦點的狀態(tài)下,才能響應按鍵的Click事件。
相對于手機上用手指點擊屏幕產生的Click事件, 在TV中通過點擊遙控器的方向鍵來控制焦點的移動。當焦點移動到目標控件上之后,按下遙控器的確定鍵,才會觸發(fā)一個Click事件,進而去做下一步的處理
在處理焦點的時候,有一些基礎的用法需要知道。
首先,一個控件isFocusable()需要為true才有資格可以獲取到焦點。如果想要在觸摸模式下獲取焦點,需要通過setFocusableInTouchMode(boolean)來設置。也可以直接在xml布局文件中指定:
keyEvent 分發(fā)過程:
而當按下遙控器的按鍵時,會產生一個按鍵事件,就是KeyEvent,包含“上”,“下”,“左”,“右”,“返回”,“確定”等指令。焦點的處理就在KeyEvent的分發(fā)當中完成。
首先,KeyEvent會流轉到ViewRootImpl中開始進行處理,具體方法是內部類 ViewPostImeInputStage 中的 processKeyEvent :
接下來先看一下KeyEvent在view框架中的分發(fā):
這里也是可以做焦點控制,最好是在 event.getAction() == KeyEvent.ACTION_DOWN 進行.
因為android 的 ViewRootlmpl 的 processKeyEvent 焦點搜索與請求的地方 進行了判斷if (event.getAction() == KeyEvent.ACTION_DOWN)
? 首先ViewGroup會一層一層往上執(zhí)行父類的dispatchKeyEvent方法,如果返回true那么父類的dispatchKeyEvent方法就會返回true,也就代表父類消費了該焦點事件,那么焦點事件自然就不會往下進行分發(fā)。
? 然后ViewGroup會判斷mFocused這個view是否為空,如果為空就會return false,焦點繼續(xù)往下傳遞;如果不為空,那就會return mFocused的dispatchKeyEvent方法返回的結果。這個mFocused其實是ViewGroup中當前獲取焦點的子View
發(fā)現(xiàn)執(zhí)行了onKeyListener中的onKey方法,如果onKey方法返回true,那么dispatchKeyEvent方法也會返回true
如果想要修改ViewGroup焦點事件的分發(fā)
? 重寫view的dispatchKeyEvent方法
? 給某個子view設置onKeyListener監(jiān)聽
下面再來看一下如果一個頁面第一次進入,系統(tǒng)是如何確定焦點是定位在哪個view上的
由于DecorView繼承自FrameLayout,這里調用的是ViewGroup的requestFocus
descendantFocusability:
? FOCUS_AFTER_DESCENDANTS:先分發(fā)給Child View進行處理,如果所有的Child View都沒有處理,則自己再處理
? FOCUS_BEFORE_DESCENDANTS:ViewGroup先對焦點進行處理,如果沒有處理則分發(fā)給child View進行處理
? FOCUS_BLOCK_DESCENDANTS:ViewGroup本身進行處理,不管是否處理成功,都不會分發(fā)給ChildView進行處理
因為 PhoneWindow 給 DecoreView 初始化時設置 了 setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS),所以這里默認是FOCUS_AFTER_DESCENDANTS
到此第一次請求焦點的過程基本告一個段落
焦點移動的時候,默認的情況下,會按照一種算法去找在指定移動方向上最近的鄰居。在一些情況下,焦點的移動可能跟開發(fā)者的意圖不符,這時開發(fā)者可以在布局文件中使用下面這些XML屬性來指定下一個焦點對象:
在KeyEvent分發(fā)中已經知道如果分發(fā)過程中event沒有被消耗,就會根據(jù)方向搜索以及請求焦點View
流程一:查找用戶指定的下一個焦點
流程二:獲取搜索方向上所有可以獲取焦點的view,使用算法查找下一個view
addFocusables() 獲取搜索方向上可獲得焦點的view
descendantFocusability屬性決定了ViewGroup和其子view的聚焦優(yōu)先級
? FOCUS_BLOCK_DESCENDANTS:viewgroup會覆蓋子類控件而直接獲得焦點
? FOCUS_BEFORE_DESCENDANTS:viewgroup會覆蓋子類控件而直接獲得焦點
? FOCUS_AFTER_DESCENDANTS:viewgroup只有當其子類控件不需要獲取焦點時才獲取焦點
addFocusables 的第一個參數(shù)views是由root決定的。在ViewGroup的focusSearch方法中傳進來的root是DecorView,也可以主動調用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦點。
FocusFinder.findNextFocus 查找焦點
網(wǎng)站欄目:android開發(fā)源碼,Android源碼
當前路徑:http://chinadenli.net/article7/dsioeoj.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、App設計、網(wǎng)頁設計公司、響應式網(wǎng)站、企業(yè)建站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)