標籤:android style blog class c java
今天老大安排一個任務叫我擷取手機中應用耗電排行(時間是前天晚上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,這個方式很使用的,後面用到的會很多。。