To build a better world !

          Android應用開發中如何使用隱藏API


          Android應用開發中如何使用隱藏API



              一開始需要說明的是,Google之所以要將一些API隱藏(指加上@hide標記的public類、方法或常量)是有原因的。其中很大的原因就是Android系統本身還在不斷的進化發展中。從1.01.1到現在即將問世的Android 2.3.4。 這些隱藏的API本身可能是不穩定的,所以,使用隱藏API,意味著程序更差的兼容性。


              如果要我給出建議的話,最好還是不要使用隱藏的API。不過有時為了實現Android應用某些特殊的功能或者效果,隱藏的API往往能發揮意想不到的作用。這些API具體能做些什么事,我就不在這里舉例了。正好,如果你不知道隱藏API能做什么的話,那么還是盡早放棄使用它們吧……


              不想長篇大論,直接進入正題吧。使用隱藏API主要有兩種辦法:一是我在《
          Java反射機制的學習》一文中提到的反射的方法得到隱藏API;二是使用源碼編譯時生成的全編譯的jarclasses.jar


              使用反射的方式,在這里就不詳細介紹了,具體見《
          Java反射機制的學習》。利用反射機制使用隱藏API的方法的優點是靈活,能夠在不兼容的系統捕獲異常,而使程序不至于崩潰;缺點是過程太繁雜,而且對于隱藏類的繼承等很難實現。如果需要大量使用隱藏API,使用反射無疑會讓程序員很煩的。


              這篇文章主要要介紹的就是通過導入全編譯的classes.jar包,來實現對隱藏API的使用。這種方法實現簡單,程序員編程也簡單,就像是那些隱藏的APISDK中變得可見了一樣。它的缺點就是兼容性問題,希望使用者引起重視,在使用時考慮清楚。


              編譯Android框架源碼后,在源碼路徑下會生成out文件夾,在這個文件夾下的out"target"common"obj"JAVA_LIBRARIES"framework_intermediates"路徑下,會生成全編譯的jarclasses.jar。你需要做的就是將這個jar庫導入到你的工程中。


              在導入classes.jar過程中,有可能會出現兩個問題(我是使用eclipse開發環境的,所以僅對此環境會遇到的問題進行說明)。


              問題一是按導入其他jar的方式導入此jar庫,發現編譯很慢,有時甚至無法編譯成功,eclipse崩潰或者提示“
          java.lang.OutOfMemoryError: Java Heap Space錯誤。這個問題,可能是由于jar太大的原因吧,網上說改eclipse.ini里的參數,個人試了下,似乎沒有什么作用。我的做法是在eclipse中新建自定義的library,然后將classes.jar放在library中。Android工程添加library,就像使用SDK一樣。這樣可以很好地解決這個問題。具體如何新建自定義的library我就不詳述了,不知道的朋友自己搜索下或者摸索下,很簡單的。


              問題二是已經正確導入了jar庫,卻發現還是找不到隱藏的API。這個的原因是Build class path order不對,具體說就是android.jarclasses.jar的導入順序不對。應該將classes.jar的順序放在android.jar之前,具體調節Build class path order的地方就在properties -> Java Build Path -> Order and Export.


              成功解決這兩個問題之后,相信你就可以正常使用Android隱藏API了。

          posted on 2011-05-01 23:56 zh.weir 閱讀(14057) 評論(2)  編輯  收藏 所屬分類: Android應用秘技

          評論

          # re: Android應用開發中如何使用隱藏API 2011-06-22 09:47 何健

          你好,我按照你的方法布置了一下,發現大部分的隱藏API都可以使用了,
          但是com.android.server包下面的類都沒有編譯到class.jar中去,請問是什么原因呢?
          謝謝  回復  更多評論   

          # re: Android應用開發中如何使用隱藏API 2011-06-29 11:52 zh-weir

          @何健

          你好,com.android.server里面的類,編譯到了這個路徑下的jar包中:out\target\common\obj\JAVA_LIBRARIES\services_intermediates\classes.jar 。你試試!  回復  更多評論   

          公告

          大家好!歡迎光臨我的 Android 技術博客!



          本博客旨在交流與 Android 操作系統相關的各種技術及信息。

          博客內的文章會盡量以開源的形式提供給大家,希望我們能相互交流,共同提高!

          有不足之處,請不吝賜教!

          我的郵箱:zh.weir@gmail.com
          我的新浪微博:@囧虎張建偉

           

          導航

          <2011年5月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          留言簿(19)

          隨筆分類(24)

          隨筆檔案(18)

          文章檔案(1)

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 舟山市| 安乡县| 双鸭山市| 东乡族自治县| 南丹县| 界首市| 安新县| 临颍县| 阿勒泰市| 邢台市| 昔阳县| 铁岭县| 宁晋县| 洛扎县| 楚雄市| 京山县| 沈阳市| 化隆| 奉节县| 诸暨市| 湾仔区| 确山县| 正蓝旗| 昌宁县| 宁陕县| 安达市| 阿克| 义乌市| 东莞市| 海原县| 阿拉善左旗| 建瓯市| 北海市| 姚安县| 若羌县| 图木舒克市| 鞍山市| 乌拉特前旗| 饶平县| 炉霍县| 吴川市|