查找已安装应用程序的 APK 大小

发布于 2024-12-25 15:42:49 字数 3552 浏览 1 评论 0原文

我正在尝试计算已安装应用程序的 apk 文件大小。这是代码

 public class PackageTabActivity extends ListActivity{

  private static final String APP_NAME = "app_name";
  private static final String APP_ICON = "app_icon";
  private static final String APP_SIZE = "app_size";
  Method getPackageSizeInfo = null;
  PackageManager pm  ;
@Override
public void onCreate(Bundle icicle){
    super.onCreate(icicle);
    pm = getPackageManager();


    try {
        getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
    } catch (SecurityException e1) {

        e1.printStackTrace();
    } catch (NoSuchMethodException e1) {

        e1.printStackTrace();
    } 
    new AppDetails().execute();
}

private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
            : false;
}


class AppDetails extends AsyncTask<Void, Void, ArrayList<HashMap<String , Object>>>
{
     private  long   app_apk_size;
     ProgressDialog mDialog;
     @Override
     public void onPreExecute()
     {
             mDialog = new ProgressDialog(PackageTabActivity.this);
             mDialog.setCancelable(true);
             mDialog.setMessage("Loading... " );
             mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
             mDialog.setProgress(0);
             mDialog.show();
     }
    @Override
    protected ArrayList<HashMap<String, Object>> doInBackground(
            Void... params) {

        ArrayList<HashMap<String,Object>> applistwithicon = new ArrayList<HashMap<String,Object>>();
        HashMap<String,Object> hm;
        String appname;
        Drawable icon = null;
        List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);   

        for(int i=0;i<packs.size();i++) {

            PackageInfo p = packs.get(i);


            if(!isSystemPackage(p))
            {
                hm = new HashMap<String, Object>();
                appname = p.applicationInfo.loadLabel(getPackageManager()).toString();

                icon = p.applicationInfo.loadIcon(getPackageManager());
                Log.v("package name", "package name =" + p.packageName);
                try {
                  getPackageSizeInfo.invoke(pm,  p.packageName, new IPackageStatsObserver.Stub()  {

                    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {

                                   app_apk_size = pStats.codeSize;    
                                   Log.v("apksize", "appsize = "+app_apk_size);
                    }           
            });
                }catch(IllegalAccessException e) {}
                catch(IllegalArgumentException r) {}
                catch(InvocationTargetException w){}

            hm.put(APP_SIZE, (app_apk_size/(1024)));
            hm.put(APP_ICON, icon);
            hm.put(APP_NAME, appname);
            applistwithicon.add(hm);
            }
        }

        return applistwithicon;
    }
    @Override
    public void onPostExecute(ArrayList<HashMap<String, Object>> result)
    {
        mDialog.dismiss();
         CustomAdapterList myAdapter = new CustomAdapterList(result,PackageTabActivity.this );

          setListAdapter(myAdapter);

    }
}
}

这里 IPackageStatsObserver 是一个接口(aidl 文件)。 这在模拟器上但在手机上给了我正确的结果。它给出了正确和错误的应用程序大小的混合。

我现在完全陷入困境,找不到任何解决方法。

任何帮助将不胜感激。

I am trying to calculate apk file size of the installed applications. Here is the code

 public class PackageTabActivity extends ListActivity{

  private static final String APP_NAME = "app_name";
  private static final String APP_ICON = "app_icon";
  private static final String APP_SIZE = "app_size";
  Method getPackageSizeInfo = null;
  PackageManager pm  ;
@Override
public void onCreate(Bundle icicle){
    super.onCreate(icicle);
    pm = getPackageManager();


    try {
        getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);
    } catch (SecurityException e1) {

        e1.printStackTrace();
    } catch (NoSuchMethodException e1) {

        e1.printStackTrace();
    } 
    new AppDetails().execute();
}

private boolean isSystemPackage(PackageInfo pkgInfo) {
    return ((pkgInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) ? true
            : false;
}


class AppDetails extends AsyncTask<Void, Void, ArrayList<HashMap<String , Object>>>
{
     private  long   app_apk_size;
     ProgressDialog mDialog;
     @Override
     public void onPreExecute()
     {
             mDialog = new ProgressDialog(PackageTabActivity.this);
             mDialog.setCancelable(true);
             mDialog.setMessage("Loading... " );
             mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
             mDialog.setProgress(0);
             mDialog.show();
     }
    @Override
    protected ArrayList<HashMap<String, Object>> doInBackground(
            Void... params) {

        ArrayList<HashMap<String,Object>> applistwithicon = new ArrayList<HashMap<String,Object>>();
        HashMap<String,Object> hm;
        String appname;
        Drawable icon = null;
        List<PackageInfo> packs = getPackageManager().getInstalledPackages(0);   

        for(int i=0;i<packs.size();i++) {

            PackageInfo p = packs.get(i);


            if(!isSystemPackage(p))
            {
                hm = new HashMap<String, Object>();
                appname = p.applicationInfo.loadLabel(getPackageManager()).toString();

                icon = p.applicationInfo.loadIcon(getPackageManager());
                Log.v("package name", "package name =" + p.packageName);
                try {
                  getPackageSizeInfo.invoke(pm,  p.packageName, new IPackageStatsObserver.Stub()  {

                    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {

                                   app_apk_size = pStats.codeSize;    
                                   Log.v("apksize", "appsize = "+app_apk_size);
                    }           
            });
                }catch(IllegalAccessException e) {}
                catch(IllegalArgumentException r) {}
                catch(InvocationTargetException w){}

            hm.put(APP_SIZE, (app_apk_size/(1024)));
            hm.put(APP_ICON, icon);
            hm.put(APP_NAME, appname);
            applistwithicon.add(hm);
            }
        }

        return applistwithicon;
    }
    @Override
    public void onPostExecute(ArrayList<HashMap<String, Object>> result)
    {
        mDialog.dismiss();
         CustomAdapterList myAdapter = new CustomAdapterList(result,PackageTabActivity.this );

          setListAdapter(myAdapter);

    }
}
}

Here IPackageStatsObserver is an interface (aidl file).
This gives me correct result on emulator but on phone. It gives mixture of right and wrong size of application.

I am now totally stuck and can't find any workaround.

Any help would be higly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

乖乖 2025-01-01 15:42:49
ApplicationInfo tmpInfo = context.getPackageManager().getApplicationInfo(packageName,-1);
long size = new File(tmpInfo.sourceDir).length();
ApplicationInfo tmpInfo = context.getPackageManager().getApplicationInfo(packageName,-1);
long size = new File(tmpInfo.sourceDir).length();
娇纵 2025-01-01 15:42:49

这是约瑟夫的一个对我有用的技巧。他的原始帖子可以在此处找到

PackageManager pm = getPackageManager();

Method getPackageSizeInfo = pm.getClass().getMethod(
    "getPackageSizeInfo", String.class, IPackageStatsObserver.class);

getPackageSizeInfo.invoke(pm, "com.android.mms",
    new IPackageStatsObserver.Stub() {

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
            throws RemoteException {

            Log.i(TAG, "codeSize: " + pStats.codeSize);
        }
    });

Here is a hack from Joseph that worked for me. His original post can be found here

PackageManager pm = getPackageManager();

Method getPackageSizeInfo = pm.getClass().getMethod(
    "getPackageSizeInfo", String.class, IPackageStatsObserver.class);

getPackageSizeInfo.invoke(pm, "com.android.mms",
    new IPackageStatsObserver.Stub() {

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
            throws RemoteException {

            Log.i(TAG, "codeSize: " + pStats.codeSize);
        }
    });
美胚控场 2025-01-01 15:42:49

IPackageStatsObserver 它是非常硬级别的代码,我使用该代码来归档apks 大小:

ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
String sourceDir = appInfo.publicSourceDir;
File file = new File(sourceDir);
long bytes = file.length();      // main apk, devide 1024 to get KB, etc.

String[] splitSourceDirs = appInfo.splitPublicSourceDirs;
for(String str: splitSourceDirs){
    File file = new File (str);  // split apks, do the same to get size

结果:
输入图片此处描述

IPackageStatsObserver it is the very hard-level code, I use the code to archive apks size:

ApplicationInfo appInfo = packageManager.getApplicationInfo(packageName, 0);
String sourceDir = appInfo.publicSourceDir;
File file = new File(sourceDir);
long bytes = file.length();      // main apk, devide 1024 to get KB, etc.

String[] splitSourceDirs = appInfo.splitPublicSourceDirs;
for(String str: splitSourceDirs){
    File file = new File (str);  // split apks, do the same to get size

Result:
enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文