Android中的隱藏API和Internal包的使用之獲取應用電量排行

今天老大安排一個任務叫我獲取手機中應用耗電排行(時間是前天晚上7點到第二天早上10點),所以在網上各種搜索,沒想到這種資料還是很多的,發現了一個主要的類:PowerProfile,但是可以的是,這個類沒有曝光給我們開發者,所以我們不能調用它

那怎麼辦呀?,還是有辦法的,這個類是藏在:com.android.internal.os.PowerProfile

com.android.internal.os.PowerProfile.PowerProfile這個類就是負責解析記錄文件,我們可以創建一個它的對象,通過該對象來獲取具體信息。具體耗電計算比較複雜

下面來看一下案例:Demo是對2.3.3的settings源碼修改的

(Demo下載地址http://download.csdn.net/detail/jiangwei0910410003/7357717)

主要是給那些沒有研究過這部分源碼的同學。
settings中獲取手機電量排行的原理主要是通過讀取電池記錄文件來實現的。主要用到了android.os.BatteryStats這個隱藏類和com.android.internal這特殊的個包。
隱藏類都好解決,主要是internal包,該包不但android.jar中沒有,及時你找到該包,把它放到android.jar中,你會發現也是用不了的。原因是ADT對這個包加了限制。不讓使用。


一種解決辦法是修改ADT,將該限制去掉。(這種方式是很難實現的)
另外一種就是不把internal放到android.jar中,把他單獨作爲一個包導入到工程中,這樣就不會被限制了


我們採用第二種方案去解決,這種方法也是最簡單的

就是將這個包直接導入我們的工程,在工程中就可以使用隱藏API和Internal包了。
我們可以使用該包單獨做一個平臺,這在後面再講。

注意:該包不能直接放在libs目錄裏面,請放到其他地方。因爲ADT屏蔽了Internal包,直接放在libs下ADT會檢測到。且放在外面的文件是不會打包到我們的apk文件中的,所以還可以減小了apk文件的體積。同理得出非系統包就一定要放在libs下,否則程序運行的時候就會報找不到包的錯誤。


下面就來看看到底如何製作這個jar包:

首先我們要明白爲什麼隱藏API(有@hide標記)和Internal包不能使用。

當我們使用android的SDK進行開發的時候都會用到一個非常重要的jar文件--android.jar(Android SDK目錄/platforms/platform-X/android.jar,X是API等級)。這個包中移除了所有被標記的尾@hide的類、方法、枚舉、字段和Internal包。當我們的程序在設備上運行的時候會加載設備上的一個framework.jar的文件,它包含了移除的部分。


所以我們的思路是想辦法得到framework.jar將那些缺少的API拿出來放到android.jar中。當然這些都可以通過編譯源碼來解決,但那樣太過麻煩。下面我介紹一種簡單的方法來獲取這些內容。


1,獲取framework.jar
剛纔也說了,設備上有這個文件,那麼我們就從設備上來取。通過adb pull命令(也可以用DDMS):
adb pull /system/framework/framework.jar
我們需要該包中的classes.dex文件。這裏從2.3.3以下模擬器上取,真機上一般是經過優化了的.odex文件,而2.3.3以上的模擬器中的這個文件中沒有classes.dex文件。注意:真機中獲取不到classes.dex文件的,所以要到模擬器中獲取!


2,將framework.jar改成framework.zip,解壓,得到裏面的classes.dex文件。


3,將.dex文件轉換成.jar格式。這裏用到了dex2jar這個工具,知道反編譯的同學都知道這個工具,下載地址:

http://download.csdn.net/detail/jiangwei0910410003/7346527   

轉換結束後會得到一個classes.dex.dex2jar.jar文件。


4,重命名classes.dex.dex2jar.jar成classes.dex.dex2jar.zip,解壓。


5,將Android SDK目錄/platforms/platform-X/中的android.jar拷貝出來,使用WinRAR打開,如圖:



這裏一定要注意,我們在android.jar的基礎上添加classes-dex2.jar中的文件,同時要記得將更新方式選擇爲:跳過已經存在的文件:



然後點擊確定,這時候android.jar就是我們需要的jar了,上面的操作有些人可能有些奇怪,爲什麼不將文件先都解壓了,然後合併在進行壓縮成zip,這裏我們不知道爲什麼,反正我之前是這麼做的,最後合成的jar的話,使用有問題,所以就糾結出了這種方法。

同時這裏一定要記得選擇是zip方式的,不然會報錯:



OK,完成。

下面來看一下效果圖:

             

這裏面socket就是我們的應用,耗電量還是可以的。。。


總結:Android中很多的api我們是用不了的,後面我還會說到怎麼使用反射的技術去訪問那些隱藏和有訪問限制的api,這個方式很使用的,後面用到的會很多。。




文章來源:http://www.bozhiyue.com/anroid/boke/2016/0314/2299.html
發佈了7 篇原創文章 · 獲贊 60 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章