AppInfoProvider提供应用信息的工具类

package com.loaderman.demo;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 提供应用信息的工具类
 * <p>
 * 软件安装位置:
 * <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 * android:installLocation="internalOnly"//默认只允许安装在手机内存
 * >
 * preferExternal: 优先sdcard, 如果sdcard已满,不存在, 就安装在手机内存
 * auto: 优先手机内存
 * <p>
 * 软件安装流程:
 * 1. 默认, 第三方软件安装时, 系统将apk拷贝到data/app目录下, 完成安装! 用户可以选择将apk移动到sdcard
 * 2. 系统软件: system/app目录下
 * <p>
 * ROOT: 获取手机系统管理员权限, 默认手机出厂后都没有ROOT
 * 一旦ROOT, 所有文件都可以随意修改, 不安全
 * <p>
 * 使用一键Root大师, 刷机大师, 都可以ROOT手机
 */

public class AppInfoProvider {

    //获取已安装的app
    public static ArrayList<AppInfo> getInstalledApps(Context ctx) {
        PackageManager pm = ctx.getPackageManager();
        List<PackageInfo> installedPackages = pm.getInstalledPackages(0);//获取已安装的app

        ArrayList<AppInfo> list = new ArrayList<>();
        for (PackageInfo packageInfo : installedPackages) {
            AppInfo info = new AppInfo();

            String packageName = packageInfo.packageName;//包名
            info.packageName = packageName;

            ApplicationInfo applicationInfo = packageInfo.applicationInfo;//应用信息的对象
            String name = applicationInfo.loadLabel(pm).toString();//应用名称
            Drawable icon = applicationInfo.loadIcon(pm);//图标对象
            info.name = name;
            info.icon = icon;

            String sourceDir = applicationInfo.sourceDir;//apk的安装路径
            File file = new File(sourceDir);
            long size = file.length();//文件大小
            info.size = size;

            //System.out.println(name);
            //判断软件安装位置
            //状态机
            int flags = applicationInfo.flags;//标记, 可以记录当前app的一些特性
            if ((flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) > 0) {
                //就认为当前app具备FLAG_EXTERNAL_STORAGE特性
                //安装在sdcard
                info.isSdcard = true;
            } else {
                //安装在手机内存
                info.isSdcard = false;
            }

            //判断软件类型, 用户?系统?
            if ((flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
                //就认为当前app具备FLAG_SYSTEM特性
                //系统应用
                info.isUserApp = false;
            } else {
                //用户应用
                info.isUserApp = true;
            }

            list.add(info);
        }

        return list;
    }

}
package com.loaderman.demo;

import android.graphics.drawable.Drawable;

/**
*应用对象
 */

public class AppInfo {

    public String   packageName;
    public String   name;
    public Drawable icon;
    public long     size;
    public boolean isSdcard;//标记是否安装在sdcard
    public boolean isUserApp;//标记是否是用户应用

}
原文地址:https://www.cnblogs.com/loaderman/p/6491479.html