Android獲取程序大小及程序緩存大小

源碼下載:點擊下載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說明

截圖以下:

工程圖:                   

 

原文地址

相關文章
相關標籤/搜索