0

我在几个用户(运行 android 7.0/7.1)时发生了崩溃,我无法重现。

崩溃发生在我尝试获取已安装应用程序列表的模块中。我在真实硬件和各种模拟器上测试了该应用程序,没有出现任何问题。

我在下面展示了我的代码的简化版本。

崩溃的行是:

ApplicationInfo ai = packageManager.getApplicationInfo(info.packageName, 0);

在函数 getInstalledAppList 中。

ListApptest 是一个从片段实例化的类:

ListApptest applications = new ListApp(getActivity());

我将 packageManager 初始化为 activity.getPackageManager() 并且看起来 getInstalledApplications() 运行良好(我可以添加对返回值的检查?)那么 PackageManager$NameNotFoundException 的原因是什么?

getInstalledApplications 怎么会返回一个未知的包名?

这是我的代码:

class ListApptest {
    private static final int flags = PackageManager.GET_META_DATA |
            PackageManager.GET_SHARED_LIBRARY_FILES |
            PackageManager.GET_UNINSTALLED_PACKAGES;

    private static Context context;
    private static Activity activity;

    private static PackageManager packageManager;

    ListApptest(Activity a, UsageStatsManager u, ListView l, ProgressBar p){
        activity = a;
        packageManager = activity.getPackageManager();
    }

    static class AppsGetInfo extends AsyncTask<Void, Void, Void> {
        private List<AppsItem> listAppsItem;

        @Override
        protected Void doInBackground(Void... arg0) {
            getInstalledApp();
            return null;
        }

        void getInstalledApp() {
            List<String> installedApps = getInstalledAppList();
        }

        private List<String> getInstalledAppList() {
            List<ApplicationInfo> infos = packageManager.getInstalledApplications(flags);
            List<String> installedApps = new ArrayList<>();
            for (ApplicationInfo info : infos) {
                installedApps.add(info.packageName);

                try {
                    // CRASH HERE
                    ApplicationInfo ai = packageManager.getApplicationInfo(info.packageName, 0);

                } catch (PackageManager.NameNotFoundException e) {
                    e.printStackTrace();
                }
            }

            return installedApps;
        }

     }
}

以下是相关的跟踪:

java.lang.RuntimeException: 
at android.os.AsyncTask$3.done (AsyncTask.java:325)
at java.util.concurrent.FutureTask.finishCompletion (FutureTask.java:354)
at java.util.concurrent.FutureTask.setException (FutureTask.java:223)
at java.util.concurrent.FutureTask.run (FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run (AsyncTask.java:243)
at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1133)
at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:607)
at java.lang.Thread.run (Thread.java:762)

Caused by: java.lang.IllegalArgumentException: 
at com.narb.listapp.Applications.ListApp$AppsGetInfo.fromUsageStat (ListApp.java:214)
at com.narb.listapp.Applications.ListApp$AppsGetInfo.buildUsageStatsWrapper (ListApp.java:201)
    at com.narb.listapp.Applications.ListApp$AppsGetInfo.getInstalledApp (ListApp.java:163)
    at com.narb.listapp.Applications.ListApp$AppsGetInfo.doInBackground (ListApp.java:72)
    at com.narb.listapp.Applications.ListApp$AppsGetInfo.doInBackground (ListApp.java:60)
    at android.os.AsyncTask$2.call (AsyncTask.java:305)
    at java.util.concurrent.FutureTask.run (FutureTask.java:237)

  Caused by: android.content.pm.PackageManager$NameNotFoundException: 
    at android.app.ApplicationPackageManager.getApplicationInfoAsUser (ApplicationPackageManager.java:484)
    at android.app.ApplicationPackageManager.getApplicationInfo (ApplicationPackageManager.java:466)
    at com.narb.listapp.Applications.ListApp$AppsGetInfo.fromUsageStat (ListApp.java:210)

编辑

我有一个友好的测试人员(不在同一个城市)发生了崩溃。我能够得到一些数据:

在 infos = packageManager.getInstalledApplications 之后:

ApplicationInfo{69419b2 com.sec.factory}
ApplicationInfo{e8f5d03 com.samsung.knox.knoxtrustagent}
ApplicationInfo{4b3b480 com.android.htmlviewer}, 

坠机前:

com.sec.factory
com.samsung.knox.knoxtrustagent

所以看起来它在 com.samsung.knox.knoxtrustagent 上崩溃了?

可能是什么原因?你如何解决这个问题?

4

0 回答 0