源碼下載:點擊下載html
如何獲取安裝包的大小,包括緩存大小(cachesize)、數據大小(datasize)、應用程序大小(codesize),以下圖所示的RE文件管理器的應用程序信息截圖:java
本部分的知識點涉及到AIDL、Java反射機制。理解起來也不是很難。android
關於安裝包得大小信息封裝在PackageStats類中,該類很簡單,只有幾個字段緩存
PackageStats類:ide
經常使用字段:函數
public long cachesize 緩存大小.net
public long codesize 應用程序大小code
public long datasize 數據大小orm
public String packageName 包名server
PS:應用程序的總大小 = cachesize + codesize + datasize
也就是說只要得到了安裝包所對應的
PackageStats對象,就能夠得到信息了。可是在AndroidSDK中並無顯示提供方法來,得到該對象,是否是很苦惱呢?可是,咱們能夠經過放射機制來調用系統中隱藏的函數(@hide)來得到每一個安裝包得信息。
具體方法以下:
第一步、 經過反射機制調用
getPackageSizeInfo() 方法原型爲:
[java]view plaincopyprint?
內部調用流程以下,這個知識點較爲複雜,知道便可,
getPackageSizeInfo方法內部調用getPackageSizeInfoLI(packageName, pStats)方法來完成包狀態獲取。
getPackageSizeInfoLI方法內部調用Installer.getSizeInfo(String pkgName, String apkPath,String fwdLockApkPath, PackageStats
pStats),繼而將包狀態信息返回給參數pStats。getSizeInfo這個方法內部是以本機Socket方式鏈接到Server,
而後向server發送一個文本字符串命令,格式:getsize apkPath fwdLockApkPath 給server。Server將結果返回,並解析到pStats
中。掌握這個調用知識鏈便可。
第二步、 因爲須要得到系統級的服務或類,咱們必須加入Android系統造成的AIDL文件,共兩個:
IPackageStatsObserver.aidl 和 PackageStats.aidl文件。並將其放置在android.pm.content包路徑下。
IPackageStatsObserver.aidl 文件
PackageStats.aidl文件
第三步、 建立一個類繼承IPackageStatsObserver.Stub 它本質上實現了Binder機制。當咱們把該類的一個實例經過getPackageSizeInfo()調用時,該函數繼而啓動了啓動中間流程 去獲取相關包得信息大小,當掃描完成後,最後將查詢信息回調至該類的onGetStatsCompleted(in PackageStats pStats, boolean succeeded)方法,信息大小封裝在此實例上。例如:
第四步、 最後咱們能夠獲取 pStats的屬性,得到它們的屬性值,經過調用系統函數Formatter.formateFileSize(long size)轉換
爲對應的以kb/mb爲計量單位的字符串。
很重要的一點:爲了可以經過反射獲取應用程序大小,咱們必須加入如下權限,不然,會出現警告而且得不到實際值。
[java] view plaincopyprint?
"android.permission.GET_PACKAGE_SIZE">
流程圖以下:
Demo說明:
截圖以下:
工程圖: