Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中的隱藏API和Internal包的使用之獲取應用電量排行

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

編輯:關於Android編程

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

 

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

 

主要是給那些沒有研究過這部分源碼的同學。
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打開,如圖:

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022317033539.jpg

 

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

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022317033669.jpg

 

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

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

data-cke-saved-src=https://www.android5.online/Android/UploadFiles_5356/201702/2017022317033637.jpg

 

OK,完成。

 

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

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved