亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android獲取應用程序大小的方法

2020-04-11 11:56:27
字體:
來源:轉載
供稿:網友

今天碰到個問題,想獲取某個已安裝的包的大小,沒找到合適的方法。搜索了一下,發現PackageManager里面有個getPackageSizeInfo方法,可惜是hide的,而且它執行之后,會將結果回調給IPackageStatsObserver的onGetStatsCompleted方法。后來想直接計算/data/app和/system/app里面的apk大小,可是有時候會碰到權限問題,需要root才可以獲取大小。        再后來,我想起系統的設置里面有一個應用程序管理,它里面列出了所有程序的占用空間大小、數據大小和緩存大小。恩,這個就是突破口。
以前寫過一篇獲取其他包的Context ,這個東西是真有用,這個結合反射,可以做很多神奇的事情,比如今天的這個。

上代碼:

Java代碼

復制代碼 代碼如下:

package chroya.demo; 

import java.lang.reflect.Constructor; 
import java.lang.reflect.Field; 
import java.lang.reflect.InvocationTargetException; 
import java.util.concurrent.CountDownLatch; 

import android.app.Activity; 
import android.content.Context; 
import android.content.pm.PackageStats; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 

public class Main extends Activity { 
    private PackageStats ps; 

    public void getPackageStats(String packageName) { 
        try { 
            //獲取setting包的的Context 
            Context mmsCtx = createPackageContext("com.android.settings", 
                    Context.CONTEXT_INCLUDE_CODE | Context.CONTEXT_IGNORE_SECURITY); 
            //使用setting的classloader加載com.android.settings.ManageApplications類 
            Class<?> maClass = Class.forName("com.android.settings.ManageApplications", true, mmsCtx.getClassLoader()); 
            //創建它的一個對象 
            Object maObject = maClass.newInstance(); 

            /*
             * 將私有域mPm賦值。因為mPm在SizeObserver的invokeGetSize中用到了,
             * 卻因為沒有執行onCreate而沒有初始化,所以要在此處初始化。
             */ 
            Field f_mPm = maClass.getDeclaredField("mPm"); 
            f_mPm.setAccessible(true);             
            f_mPm.set(maObject, mmsCtx.getPackageManager()); 

            /*
             * 給mHandler賦值為重新定義的Handler,以便接收SizeObserver的
             * onGetStatsCompleted回調方法中dispatch的消息,從中取PackageStats對象。
             * */ 
            Field f_mHandler = maClass.getDeclaredField("mHandler"); 
            f_mHandler.setAccessible(true); 
            f_mHandler.set(maObject, new Handler() { 
                  public void handleMessage(Message msg) { 
                      if(msg.what == 1) { 
                          //此處獲取到PackageStats對象 
                          ps = (PackageStats) msg.getData().getParcelable("ApplicationPackageStats");                          
                          Log.d("", ""+ps.codeSize);                           
                      } 
                  } 
            }); 

            //加載內部類SizeObserver 
            Class<?> sizeObserverClass = Class.forName("com.android.settings.ManageApplications$SizeObserver", true, mmsCtx.getClassLoader()); 
            Constructor sizeObserverConstructor = sizeObserverClass.getDeclaredConstructors()[0]; 
            sizeObserverConstructor.setAccessible(true); 
            /*
             * 創建SizeObserver對象,兩個參數,第一個是外部類的對象,
             * 也就是ManageApplications對象,第二個是msgId,也就是
             * 分發消息的id,跟Handler接收的msgId一樣。
             * */ 
            Object soObject = sizeObserverConstructor.newInstance(maObject, 1); 
            //執行invokeGetSize方法 
            sizeObserverClass.getMethod("invokeGetSize", String.class, 
                    CountDownLatch.class).invoke(soObject, packageName, new CountDownLatch(1));          
        } catch (NameNotFoundException e) { 
            e.printStackTrace(); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
        } catch (IllegalArgumentException e) { 
            e.printStackTrace(); 
        } catch (SecurityException e) { 
            e.printStackTrace(); 
        } catch (InvocationTargetException e) { 
            e.printStackTrace(); 
        } catch (NoSuchMethodException e) { 
            e.printStackTrace(); 
        } catch (InstantiationException e) { 
            e.printStackTrace(); 
        } catch (NoSuchFieldException e) { 
            e.printStackTrace(); 
        } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState);   
        getPackageStats("chroya.demo");        
    } 

注釋都在代碼里面了,稍微理解一下應該都能懂的。
獲取到PackageStats對象,就可以從中獲取到應用程序的占用空間大小、數據大小和緩存大小。

另,這畢竟只是hack code,不可能通用。這段代碼的局限性是,只有1.5能用,而且如果別人把setting包去掉了,也沒法使用。要寫出各版本SDK通用的代碼,就必須查看每個版本的setting包,看代碼有何變化,然后根據上面給出的思路為每個版本寫一個方法,就ok了。

想要獲得成功,首先要自己相信自己,再者要贏得周圍朋友的信任!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女在线观看| 欧美精品在线观看| 久久久精品在线| 欧美日本高清一区| 国产精品自拍视频| 欧美视频在线视频| 日韩精品在线观看一区| 国产精品美女无圣光视频| 欧美一级片在线播放| 亚洲精品久久久久中文字幕二区| 永久免费毛片在线播放不卡| 中文字幕亚洲欧美日韩高清| 91chinesevideo永久地址| 亚洲人成电影网站色…| 国产成人精品久久久| 国产美女直播视频一区| 成人在线国产精品| 中文字幕亚洲字幕| 成人免费在线网址| 欧美性高潮床叫视频| 亚洲精品白浆高清久久久久久| 亚洲另类欧美自拍| 亚洲а∨天堂久久精品喷水| 69久久夜色精品国产7777| 色婷婷av一区二区三区久久| 91精品在线观看视频| 一区二区在线视频播放| 日韩精品欧美国产精品忘忧草| 国产美女精品免费电影| 欧美日韩免费网站| 91麻豆国产精品| 日韩在线观看免费av| 国产香蕉精品视频一区二区三区| 欧美亚洲在线视频| 精品偷拍一区二区三区在线看| www.欧美精品| 国产v综合v亚洲欧美久久| 亚洲国产精品国自产拍av秋霞| 亚洲国产高清自拍| 国产精品91视频| 国产成人啪精品视频免费网| 91免费版网站入口| 久久久久久噜噜噜久久久精品| 中文日韩在线观看| 色系列之999| 美女久久久久久久久久久| 中文字幕av一区二区| 色综久久综合桃花网| 尤物九九久久国产精品的分类| 亚洲一区精品电影| 一个人看的www久久| 国产精品午夜视频| 欧美一级片免费在线| 国产精品视频自在线| 国产精品老女人精品视频| 欧美精品福利在线| 欧美午夜片在线免费观看| 国产午夜一区二区| 91精品国产综合久久久久久久久| 亚洲a一级视频| 久久99精品久久久久久琪琪| 91免费精品视频| 懂色av影视一区二区三区| 亚洲人成网站999久久久综合| 久久综合伊人77777蜜臀| 精品国产一区二区三区久久狼5月| 亚洲91av视频| 亚洲精品国产精品国自产在线| 久久全球大尺度高清视频| 国产一区二区三区免费视频| 欧洲日韩成人av| 亚洲人成77777在线观看网| 97av视频在线| 九九九久久国产免费| 国产精品美女免费看| 日韩网站在线观看| yw.139尤物在线精品视频| 色综合久久88色综合天天看泰| 欧美激情欧美狂野欧美精品| 国产丝袜精品第一页| 久久中文字幕视频| 亚洲视频在线播放| 欧亚精品中文字幕| 久久综合88中文色鬼| 国产精品av在线播放| 亚洲精品国产精品乱码不99按摩| 国产欧美精品一区二区| 精品美女国产在线| 久99九色视频在线观看| 国产91色在线|免| 欧美情侣性视频| 国产91免费观看| 精品国产网站地址| 欧美性受xxxx黑人猛交| 一区二区av在线| 欧美黑人一级爽快片淫片高清| 精品国产一区av| 国产久一一精品| 久久久免费精品视频| 欧美性少妇18aaaa视频| 91成人在线观看国产| 亚洲欧美自拍一区| 亚洲最大成人在线| 欧美一级淫片aaaaaaa视频| www亚洲精品| 色噜噜久久综合伊人一本| 91精品国产色综合| 久久久久久12| 欧美激情精品久久久久久大尺度| xxxxx成人.com| 久久久精品国产亚洲| 亚洲视频视频在线| 欧美高清视频免费观看| 亚洲欧美中文日韩在线v日本| 精品国内亚洲在观看18黄| 亚州成人av在线| 自拍视频国产精品| 精品久久久中文| 日韩一二三在线视频播| 少妇高潮 亚洲精品| 久久久久久中文字幕| 91禁外国网站| 久久人人看视频| 亚洲国产成人精品久久| 午夜精品理论片| 久久久久久久电影一区| 中文字幕久久亚洲| 日韩欧美主播在线| 国产精品久久久久久久久久新婚| 欧美日韩精品在线观看| 中文字幕在线看视频国产欧美在线看完整| 在线视频欧美日韩精品| 国产精品欧美风情| 久久99精品久久久久久琪琪| 亚洲欧美国产日韩中文字幕| 成人精品在线视频| 国产91在线播放| 亚洲奶大毛多的老太婆| 日韩资源在线观看| 成人av在线网址| 成人精品aaaa网站| 国产精品第10页| 中文字幕亚洲二区| 成人黄色片网站| 欧美福利视频在线| 亚洲黄色片网站| 日韩av免费看| 亚洲欧美制服第一页| 亚洲国产成人精品一区二区| 黑人巨大精品欧美一区二区| 亚洲女人天堂网| 国产成人av在线播放| 欧美中文在线免费| 精品毛片网大全| 超碰97人人做人人爱少妇| 日韩欧美在线观看视频| 国产91精品青草社区| 一级做a爰片久久毛片美女图片| 亚洲精品国精品久久99热一| 狠狠干狠狠久久| 亚洲成人性视频| 精品国产自在精品国产浪潮| 在线观看欧美日韩国产| 7m第一福利500精品视频|