青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個人技術空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

由于黏貼后原有圖片顯示不出來,感興趣的可以下載word文檔,詳見如下 http://m.shnenglu.com/Files/franksunny/Using%20internal%20and%20hide%20api.rar

使用internal(com.android.internal)和hidden(@hide)APIs

Part One

原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-1-introduction/

Android有兩種類型的API是不能經由SDK訪問的。

第一種是位于com.android.internal包中的API。我將稱之為internal API。第二種API類型是一系列被標記為@hide屬性的類和方法。從嚴格意義上來講,這不是一個單一的API,而是一組小的被隱藏的API,但我仍將其假設為一種API,并稱之為hidden API。

Hidden API 例子

你可以查看一下android的源碼,并能找到一些變量、函數和類等,都被@hide屬性標記了。

下面的例子就是在WifiManager(API 10源碼)中隱藏的變量。

image_thumb13_thumb

另一個例子是在WifiManager(API 10源碼)中隱藏了setWifiApEnabled函數。

image_thumb15_thumb

因此,只要你看到@hide屬性,那你看到的就是hidden API。

Internalhidden API的區別

Hidden API之所以被隱藏,是想阻止開發者使用SDK中那些未完成或不穩定的部分(接口或架構)。舉個例子,Bluetooth API在API 5(Android 2.0)上才開放;在API 3 和4上都是用@hide屬性隱藏了。當這些API被驗證和清理后,Google的開發者會移除@hide屬性,并讓其在API 5官方化。很多地方在API 4 和5之間發生了變化。如果你的程序依賴某些隱藏的API,當其部署到新的平臺上時,就有可能陷入困境。

對于internal API來說,從來都沒有計劃將其開放出來。它就是Android的“內部廚房”,對開發者來說,應該將其視作黑盒。凡事都會有變化的。如果你依賴某些internal API,也有可能在新的Android release上,這些internal API發生變化,從而令你失望。

總結一下區別:

Hidden API = 進行中的工作;

Internal API = 黑盒;

Internalhidden API的編譯時 vs. 運行時

當你使用Android SDK進行開發的時候,你引用了一個非常重要的jar文件——android.jar。它位于Android SDK平臺的文件夾中(SDK_DIR/platforms/platform-X/android.jar,其中,X表示API等級)。這個android.jar移掉了com.android.internal包中所有的類,也移掉了所有標記有@hide的類,枚舉,字段和方法。

但當你在設備上啟動應用程序時,它將加載framework.jar(簡單來說,它和android.jar等同),而其未移掉internal API和hidden API。(但它對開發者來說,并不能友好地訪問,因此,我將向大家展示不通過反射如何使用這些API)。

關于internal API,還有一件事需要說明。Eclipse的ADT插件增加了一個額外的規則,那就是禁止使用com.android.internal包中的任何東西。所以,即便是我們可以拿到最原始的android.jar(未刪減版),也沒有輕松的辦法通過Eclipse使用這些internal API。

你可以親自檢查一下。創建一個新的Android工程(或者使用已有的)。查看一下它引用的類庫(右擊project Properties –> Java Build Path –> Libraries)。

image_thumb30_thumb

image_thumb29_thumb

重要的總結:internal和hidden API在SDK中是按照一樣的方式處理的(都從android.jar中移除了),但internal API更慘的是,還被Eclipse的ADT插件顯式禁止了。

不通過反射使用internalhidden API

這些文章的終極目標是讓開發者能夠不通過反射使用Internal和Hidden API。如果你完成了接下來部分中描述的步驟,你將能使用這些Internal和Hidden API,如同公開的API。你不再需要使用反射。

注:如果你正在使用這些非公開的API,你必須知道,你的程序有著極大的風險。基本上,無法保證在下一次的Android OS更新時,這些API不被破壞,也無法保證不同的運營商有著一致的行為。你自己決定吧。

接下來有三個場景:

1. Internal 和hidden API都可用(場景A)

2. 只Hidden API可用(場景B)

3. 只Internal API可用(場景C)

場景A是B、C的總和。場景B是最簡單的一個(不需要對Eclipse的ADT修改)。

場景A:閱讀Part1, 2, 3, 4, 5

場景B:閱讀Part1, 2, 3, 5

場景C:閱讀Part1, 2, 3, 4, 5

Part 2

原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-2-hacking-around/

在上一篇中,我解釋了為什么我們不通過反射就會很難使用internal和hidden API。這是因為android.jar中就沒包含這些API,因此,沒人能夠在編譯時引用這些類。

這篇文章將描述如何還原最初的android.jar。這將允許我們像使用公開的API那樣使用internal和hidden API。

如何得到原版android.jar

我們需要修改android.jar,這樣它才能包含所有的*.class文件(包括internal和hidden API類)。有兩種辦法:

1) Android是一個開源工程。我們可以下載源碼并搭建編譯環境,這樣它就不能移除那些internal和hidden的類了。這個辦法比較困難;

2) 每個模擬器或真機在運行時都會有一個等同android.jar的東西。我們可以從這里拿到jar文件,提取出原始的.class文件,并拷貝到Android SDK的android.jar中。

我將采用方案2。它易于開始,還不需要搭建Linux環境及編譯環境等。

從設備上獲取framework.jar

你可以使用命令行(adb pull)從模擬器或設備上下載文件,或者使用DDMS(借助Eclipse或SDK中的應用)。

注意:模擬器通常在.dex文件中包含代碼,而真機一般在優化版的dex文件中包含代碼——odex文件。操作odex文件比較困難,這也是為什么我選擇模擬器的原因。

與Android SDK中的android.jar等同的文件是framework.jar。這個文件位于設備的:/system/framework/framework.jar

adb pull /system/framework/framework.jar

image當framework.jar從設備上下下來之后,重命名為framework.zip并解壓到獨立的文件夾中,看起來是這個樣子的:

 

classes.dex正是我們需要的。

創建framework-classes.zip

首先,我們需要把.dex文件轉換成.jar格式。你可以使用通用的工具dex2jar。只需要運行:

dev2jar classes.dex

當轉換結束時,你應該得到了classes.dex.dex2jar.jar文件。重命名為framework-classes.zip。使用zip查看器,進入到framework-classes.zip/com/android/internal/:

image

恭喜你,你已經擁有了所有的.class文件,包括internal和hidden API(盡管截圖只確認了internal部分)。

創建original-android.jar

Android SDK的android.jar位于ANDROID_SDK/platforms/android-X/android.jar(X表示API等級)。

拷貝android.jar成custom-android.jar。解壓至custom-android文件夾。將framework-classes.zip中所有的.class文件拷貝到custom-android文件夾中(你需要覆蓋所有已經存在的.class文件)。

然后,壓縮custom-android文件成original-android.zip。重命名為original-android.jar。

步驟總結

1. 選擇你的目標平臺X

2. 創建目標平臺X的模擬器

3. 啟動模擬器,下載/system/framework/framework.jar

4. 重命名framework.jar -> framework.zip

5. 從framework.zip中抽取classes.dex

6. 使用dex2jar工具,將其轉換成classes.jar

7. 重命名classes.jar -> framework-classes.zip

8. 拷貝android.jar –> custom-android.zip

9. 解壓custom-android.zip至custom-android文件夾

10. 將framework-classes.zip中所有文件拷貝至custom-android文件夾(覆蓋存在的文件)

11. 壓縮custom-android文件夾成original-android.zip

12. 重命名original-android.zip -> original-android.jar

打完收功。

總結

我們還原了android.jar,使其包含所有的internal和hidden API的.class文件。這只是第一步。下一步將創建定制的android平臺,使其使用未刪節版的android.jar,并將其添加到Android SDK platforms文件夾中。

Part 3

原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-3-custom-android-platform/

在上一篇中,我已經展示了如何創建一個包含所有internal和hidden API的original-android.jar。

接下來的工作就是要修改已經存在的Android平臺(SDK_DIR/platforms/platform-X/android.jar,X表示API等級)。你可以直接使用Part2中創建的original-android.jar替換android.jar。但這樣的話,你的所有工程都將直接使用internal和hidden API而沒有任何限制。這不夠方便,因為在多數的工程中你不希望這樣。甚至,你可能更希望禁止這些API(ADT/android.jar的默認行為)。但對于一些特定的工程,你希望能夠使用這些internal和hidden API。

為了達到這樣的靈活性,你需要創建一個新的自定義的Android平臺。當不需要訪問internal和hidden API時,你只需使用原有的Android平臺。當你使用這些API時,你使用自定義的Android平臺。

Android SDK文件夾結構

讓我們看一下Android SDK樹是如何組織的:

image

我們需要“platforms”文件夾。看一下里面:

image

這里列出了支持的Android平臺。

現在,我們看一下它是如何與Eclipse設定關聯的。選擇你的工程,右擊–> Properties –> Android。你將會看到一組支持的Android平臺(與…/platforms/folder相似)。下面是截圖:

image

創建新的平臺

為了創建一個新的平臺,我們需要拷貝android-9文件夾 -> android-9-internals。讓我們做一些修正:

1. 刪除其中的android.jar

2. 拷貝original-android.jar,并改名為android.jar

3. 修改build.prop文件:

ro.build.version.sdk=9 -> ro.build.version.sdk=-9

ro.build.version.release=2.3 -> ro.build.version.release=2.3.extended

重啟Eclipse。并確認你能看到新的平臺。下面是我所看到的:

image

為什么我選擇API等級為-9?這是因為它必須是一個數字,而且它不能是9(或者其它已經存在的API等級)。否則,你自定義的平臺將不能被使用(它在列表里可見,但選中后也不能正常工作,編譯時仍然使用相應API等級的原始平臺)。

下面是引用類庫的截圖(當前工程選中了自定義的平臺):

image

總結

在上一篇中,我已經告訴你如何創建一個未刪節版的android.jar。在這一篇中,我向你展示了如何創建一個自定義的Android平臺,并在其中使用original-android.jar。這對于hidden API來說已經足夠了。但對于internal API來說,還需要另一步。這是因為ADT仍然不允許使用com.android.internal包中的類(參見上圖中的“forbidden”訪問規則)。下一節我將向你展示如何定制ADT來允許使用internal包中的類。

============華麗的分割線=============

在實際的操作過程中,我創建的自定義的android.jar(API 10)不能被Eclipse成功加載,會出現以下的錯誤框,如同網站上其它人操作的結果一樣,期待解決方案。

clip_image012

不過,作者提供了可用的自定義的android.jar,如果不想自己嘗試的話,可以直接從網站下載,地址將在Part5中給出,稍等。

Part 4

原文路徑:http://devmaze.wordpress.com/2011/01/18/using-com-android-internal-part-4-customizing-adt/

在上一篇文章里,我描述了如何創建一個自定義的original-android.jar,以及如何創建一個自定義的Android平臺來使用這個original-android.jar。這對Hidden API來說足夠了。但對Internal API來說,仍然還有一個包袱:Eclipse的ADT插件。它限制使用com.android.internal包中的任何類。

有幾種方法可以解決這個訪問限制。

1) ADT源碼可以下載。因此,刪除/修改代碼中的某些代碼,從而編譯出一個新的ADT是可以的。麻煩的是你需要搭建64位Linux系統,下載源碼,編譯等。它需要花費一些時間。當有新的ADT版本時,你需要重來一遍。

2) 另外的方法就是修改ADT的字節碼。用一個類似于“com/android/internax/**”的字符串替換“com/android/internal/**”。

第二種方法可以用腳本實現。并且不需要訪問源碼以及可在Windows上操作。這也是為什么我在這篇中選用第二種解決方案的原因。

修改ADT的字節碼

進入Eclipse的plugins文件夾。找到文件名看起來像“com.android.ide.eclipse.adt_*.jar”的文件。備份一下這個文件(以防中間有錯誤發生)。并拷貝這個文件到一個“experimental”文件夾,在這里,我們要完成對其字節碼的修改。

重命名*.jar為*.zip。解壓這個文件到單獨的文件夾。參看以下圖片:

image

現在,進入到com/android/ide/eclipse/adt/internal/project子文件夾。

找到AndroidClasspathContainerInitializer.class文件。

image

這個文件包含“com/android/internal/**”字符串。接下來就是要替換這個字符串,例如“com/android/internax/**”。改變字符串的長度理論上是安全的,但最好還是替換其中的一個字母,并保持長度一致。

我使用notepad++修改的,它支持非可印刷字符,因此在對其修改時,不要觸碰修改非可印刷字符。

image

當做完這個,保存文件。壓縮這個文件夾,保證文件名與原始文件一模一樣。在我這里,文件名是:com.android.ide.eclipse.adt_8.0.1.v201012062107-82219.zip。

注意:確保壓縮文件的正確性。比較原始文件和修改文件的根文件結構。

現在,用修改后的版本替換原來的ADT的*.jar文件。然后,啟動Eclipse。

在使用庫窗口,你應該看到下面的樣子,一切都變得那么的美好:

image

步驟總結

1. 關閉Eclipse

2. 從Eclipse的plugin文件夾中拷貝出ADT插件的jar文件

3. 重命名.jar -> .zip,然后解壓至獨立的文件夾

4. 找到com/android/ide/eclipse/adt/internal/project/AndroidClasspathContainerInitializer.class文件

5. 用“com/android/internax/**”替換“com/android/internal/**”

6. 壓縮這個文件夾

7. 重命名 .zip -> .jar

8. 用修改后的jar替換原始的ADT jar文件

9. 啟動Eclipse

結論

這是不使用反射也能使用Internal API的最后一步。

Part 5

 

原文路徑:https://devmaze.wordpress.com/2011/01/19/using-com-android-internal-part-5-summary-and-example/

為了能夠使用Internal和Hidden API,你需要:

1. 創建自定義的original-android.jar,包含所有的.class文件

2. 創建自定義的Android平臺來使用original-android.jar

3. 修改ADT插件,允許使用com.android.internal包(只為Internal API)

4. 創建新的工程,引用自定義的Android平臺(本文中的例子)

在本文中,我將向你們展示如何使用那些Internal和Hidden API。

此外,在本文的結尾,我列出了一些自定義的Android平臺,它們都包含Internal和Hidden API。我附帶了它們,是為了可能你不想花太多時間在這方面,但又想快速的嘗試什么。

例子

創建一個新工程,選擇2.3.extender平臺:

下面是代碼:

這個代碼使用了Internal API(PowerProfile)和Hidden API(isWifiApEnabled)。我不用使用反射就能編譯并運行這些代碼。

自定義平臺

下面有些平臺,是我為自己創建的。只用拷貝它們到SDK_DIR\platforms文件夾下。這只是讓Hidden API可用。對于Internal API,你需要修改你的ADT插件。

API 3:http://www.megaupload.com/?d=S1F2MKYZ

API 4:http://www.megaupload.com/?d=VUCTRI3Y

API 7:http://www.megaupload.com/?d=7ITNILBK

API 8:http://www.megaupload.com/?d=EXT5FKKT

API 9:http://www.megaupload.com/?d=EXT5FKKT

API 10:http://www.megaupload.com/?d=FCV78A9M

==============華麗的分割線=============

我嘗試了其中的幾個自定義平臺,發現,internal 和hidden API真的是可用了,但也有一些意外的問題,如AlertDialog.Builder(Context context)居然說Context參數是多余的。。

沒花時間去研究為什么會這樣,如果哪位童鞋知道原因,告訴我哈~~

 

@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted on 2011-09-26 17:52 frank.sunny 閱讀(3325) 評論(3)  編輯 收藏 引用 所屬分類: Android開發

FeedBack:
# re: [轉]使用internal(com.android.internal)和hidden(@hide)APIs
2011-12-16 14:50 | 二百五
好東西。。。  回復  更多評論
  
# re: [轉]使用internal(com.android.internal)和hidden(@hide)APIs
2012-07-19 16:51 | ##
absolutely 牛逼  回復  更多評論
  
# re: [轉]使用internal(com.android.internal)和hidden(@hide)APIs
2012-09-19 09:54 | cpu0oop
請問,AlertDialog.Builder的這個問題解決了嗎?  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲毛片在线看| 女仆av观看一区| 欧美一区二区三区四区夜夜大片 | 国产精品久久久久一区| 欧美二区在线观看| 欧美精品日日鲁夜夜添| 国产精品v日韩精品v欧美精品网站| 久久国产精品亚洲va麻豆| 久久这里只有精品视频首页| 国产精品a级| 国产精品igao视频网网址不卡日韩| 欧美精品网站| 国产精品久久久久影院色老大| 亚洲黄色片网站| 久久久久9999亚洲精品| 亚洲一区在线视频| 小黄鸭精品密入口导航| 久久久久九九九| 欧美wwwwww| 亚洲午夜一区二区三区| 亚洲欧美日韩国产成人精品影院| 欧美专区日韩专区| 欧美人成免费网站| 国产精品久久久久久久app| 一区二区视频免费完整版观看| 在线观看视频一区二区| 亚洲免费中文字幕| 你懂的国产精品| 亚洲六月丁香色婷婷综合久久| 欧美一级久久久| 欧美韩日一区二区三区| 国产亚洲日本欧美韩国| 99视频一区二区三区| 久久综合久久综合这里只有精品| 亚洲免费高清视频| 久久久精品网| 国产精品推荐精品| 亚洲精品国精品久久99热| 亚洲一区二区伦理| 欧美激情视频免费观看| 亚洲精品乱码久久久久久按摩观 | 精品成人免费| 亚洲天堂成人在线观看| 久久一区二区三区四区五区| 日韩视频免费| 美女脱光内衣内裤视频久久影院| 国产精品一区二区久久久久| 亚洲精品美女在线观看播放| 欧美在线视频一区二区| 亚洲一级黄色av| 欧美日韩中文字幕精品| 日韩午夜激情电影| 亚洲二区视频在线| 一本色道久久加勒比精品| 久久久99精品免费观看不卡| 亚洲综合国产精品| 欧美高清一区二区| 国产乱子伦一区二区三区国色天香| a91a精品视频在线观看| 亚洲大片av| 欧美国产精品劲爆| 一本色道久久99精品综合| 另类天堂视频在线观看| 久久精品国产清高在天天线| 亚洲视频电影图片偷拍一区| 欧美久久久久| 中日韩午夜理伦电影免费| 日韩视频国产视频| 欧美三区不卡| 欧美一区二区三区在线观看| 午夜精品www| 国产亚洲午夜| 久久久久久黄| 裸体女人亚洲精品一区| 日韩视频在线一区二区三区| 日韩小视频在线观看| 欧美四级在线| 久久成人免费网| 可以看av的网站久久看| 一本久道久久综合中文字幕| 亚洲一区欧美二区| 一区二区三区在线视频免费观看| 欧美激情在线| 国产精品福利在线| 麻豆av一区二区三区久久| 欧美激情四色| 久久aⅴ乱码一区二区三区| 久久久久久亚洲精品中文字幕 | 久久久www成人免费精品| 久久精品亚洲热| 99在线观看免费视频精品观看| 亚洲视频一区二区在线观看 | 亚洲福利专区| av成人国产| 一区二区三区在线免费观看| 亚洲国产精品激情在线观看| 国产精品久久久久永久免费观看| 久久久免费av| 欧美日韩麻豆| 欧美激情乱人伦| 国产欧美日韩综合精品二区| 亚洲激情综合| 国内久久精品视频| 亚洲精品美女久久久久| 国产欧美精品va在线观看| 玖玖玖国产精品| 国产精品mv在线观看| 老司机午夜精品视频在线观看| 国产精品xvideos88| 亚洲高清久久久| 狠狠久久综合婷婷不卡| 一区二区精品在线| 亚洲国产精品成人综合色在线婷婷| 一本色道久久综合| 亚洲人成7777| 久久久激情视频| 久久精品国产2020观看福利| 欧美视频中文在线看 | 久久男人av资源网站| 一区二区免费在线观看| 久久久综合网| 性一交一乱一区二区洋洋av| 欧美激情精品久久久久久蜜臀| 蜜桃伊人久久| 精品动漫3d一区二区三区| 午夜在线精品偷拍| 亚洲欧美日韩国产中文| 欧美日韩一卡| 亚洲性图久久| 欧美一区二区三区免费观看视频 | 亚洲一区不卡| 亚洲自拍啪啪| 欧美午夜电影完整版| 99国产精品99久久久久久| 亚洲国产精品久久精品怡红院| 欧美专区日韩视频| 免费成人激情视频| 一区在线影院| 久久在线观看视频| 欧美国产专区| 99re在线精品| 欧美视频二区| 亚洲一级网站| 亚洲欧美一区二区激情| 国产日产欧美精品| 久久九九国产精品| 欧美激情一区二区三区成人| 日韩亚洲一区二区| 国产精品久久久久久久午夜片 | 久久久国产精品一区| 国外成人网址| 欧美电影美腿模特1979在线看 | 美女999久久久精品视频| 亚洲黄色一区二区三区| 99精品视频免费全部在线| 欧美日韩在线另类| 亚洲欧美在线aaa| 欧美3dxxxxhd| 99综合精品| 国产视频亚洲| 欧美成人xxx| 亚洲永久在线| 欧美fxxxxxx另类| 在线视频亚洲欧美| 国产亚洲欧洲一区高清在线观看| 久久在精品线影院精品国产| 亚洲人线精品午夜| 久久精品一区二区三区不卡牛牛 | 欧美日韩一级片在线观看| 欧美一级专区| 亚洲第一综合天堂另类专| 亚洲欧美日韩综合aⅴ视频| 国内精品伊人久久久久av一坑| 欧美激情性爽国产精品17p| 亚洲欧美日韩爽爽影院| 欧美国产第二页| 1000部国产精品成人观看| 亚洲美女网站| 久久久久久久高潮| 亚洲黄色av一区| 欧美性猛交99久久久久99按摩| 欧美一区二区黄色| 亚洲精品一区二区三区蜜桃久| 欧美一区二区在线观看| 亚洲国产一区二区三区a毛片| 欧美视频精品一区| 久久久精品欧美丰满| 亚洲欧美日韩国产一区二区三区 | 欧美大片一区| 欧美在线在线| 亚洲午夜一区二区三区| 亚洲理论在线| 欧美v国产在线一区二区三区| 亚洲欧美日韩国产中文| 亚洲视频网在线直播| 亚洲精品中文字幕有码专区| 激情综合五月天| 国内外成人免费激情在线视频| 久久精品视频在线观看| 亚洲欧洲一区二区天堂久久|