2.1的系统没有提供直接获取apk大小的方法,所以需要自己计算,经过百度+google,终于找到一个貌似可以的方法,但是总是得不到结果,代码如下:
 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.v("Appcontrol", ""+ps.codeSize);                              
                      }    
                      Log.v("Appcontrol", "ps.codeSize:"+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);
            // 执行invokeGetSize方法
            sizeObserverClass.getMethod("invokeGetSize", String.class, CountDownLatch.class)
                    .invoke(soObject, packageName, new CountDownLatch(1));
            Field f_mStats = sizeObserverClass.getDeclaredField("stats");
            f_mStats.setAccessible(true);
            ps= (PackageStats)f_mStats.get(soObject);
            
            if(ps != null)
                Log.v("packagename", "code size:" + ps.codeSize +" cacheSize:" +ps.cacheSize +" dataSize:" + ps.dataSize);        } 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();    
        }    
    }    
其中f_mHandler的内容一直没有执行,所以得不到结果,请问哪位大虾研究过?在此求解