private ProcStatsPackageEntry createOsEntry(
     ProcessDataCollection bgTotals,
     ProcessDataCollection runTotals,
     TotalMemoryUseCollection totalMem,
     long baseCacheRam) {
   // Add in fake entry representing the OS itself.
   ProcStatsPackageEntry osPkg = new ProcStatsPackageEntry("os", memTotalTime);
   ProcStatsEntry osEntry;
   if (totalMem.sysMemNativeWeight > 0) {
     osEntry =
         new ProcStatsEntry(
             Utils.OS_PKG,
             0,
             mContext.getString(R.string.process_stats_os_native),
             memTotalTime,
             (long) (totalMem.sysMemNativeWeight / memTotalTime));
     osEntry.evaluateTargetPackage(mPm, mStats, bgTotals, runTotals, sEntryCompare, mUseUss);
     osPkg.addEntry(osEntry);
   }
   if (totalMem.sysMemKernelWeight > 0) {
     osEntry =
         new ProcStatsEntry(
             Utils.OS_PKG,
             0,
             mContext.getString(R.string.process_stats_os_kernel),
             memTotalTime,
             (long) (totalMem.sysMemKernelWeight / memTotalTime));
     osEntry.evaluateTargetPackage(mPm, mStats, bgTotals, runTotals, sEntryCompare, mUseUss);
     osPkg.addEntry(osEntry);
   }
   if (totalMem.sysMemZRamWeight > 0) {
     osEntry =
         new ProcStatsEntry(
             Utils.OS_PKG,
             0,
             mContext.getString(R.string.process_stats_os_zram),
             memTotalTime,
             (long) (totalMem.sysMemZRamWeight / memTotalTime));
     osEntry.evaluateTargetPackage(mPm, mStats, bgTotals, runTotals, sEntryCompare, mUseUss);
     osPkg.addEntry(osEntry);
   }
   if (baseCacheRam > 0) {
     osEntry =
         new ProcStatsEntry(
             Utils.OS_PKG,
             0,
             mContext.getString(R.string.process_stats_os_cache),
             memTotalTime,
             baseCacheRam / 1024);
     osEntry.evaluateTargetPackage(mPm, mStats, bgTotals, runTotals, sEntryCompare, mUseUss);
     osPkg.addEntry(osEntry);
   }
   return osPkg;
 }
 private void createPkgMap(
     ArrayList<ProcStatsEntry> procEntries,
     ProcessDataCollection bgTotals,
     ProcessDataCollection runTotals) {
   // Combine processes into packages.
   ArrayMap<String, ProcStatsPackageEntry> pkgMap = new ArrayMap<>();
   for (int i = procEntries.size() - 1; i >= 0; i--) {
     ProcStatsEntry proc = procEntries.get(i);
     proc.evaluateTargetPackage(mPm, mStats, bgTotals, runTotals, sEntryCompare, mUseUss);
     ProcStatsPackageEntry pkg = pkgMap.get(proc.mBestTargetPackage);
     if (pkg == null) {
       pkg = new ProcStatsPackageEntry(proc.mBestTargetPackage, memTotalTime);
       pkgMap.put(proc.mBestTargetPackage, pkg);
       pkgEntries.add(pkg);
     }
     pkg.addEntry(proc);
   }
 }
  private ArrayList<ProcStatsEntry> getProcs(
      ProcessDataCollection bgTotals, ProcessDataCollection runTotals) {
    final ArrayList<ProcStatsEntry> procEntries = new ArrayList<>();
    if (DEBUG) Log.d(TAG, "-------------------- PULLING PROCESSES");

    final ProcessMap<ProcStatsEntry> entriesMap = new ProcessMap<ProcStatsEntry>();
    for (int ipkg = 0, N = mStats.mPackages.getMap().size(); ipkg < N; ipkg++) {
      final SparseArray<SparseArray<ProcessStats.PackageState>> pkgUids =
          mStats.mPackages.getMap().valueAt(ipkg);
      for (int iu = 0; iu < pkgUids.size(); iu++) {
        final SparseArray<ProcessStats.PackageState> vpkgs = pkgUids.valueAt(iu);
        for (int iv = 0; iv < vpkgs.size(); iv++) {
          final ProcessStats.PackageState st = vpkgs.valueAt(iv);
          for (int iproc = 0; iproc < st.mProcesses.size(); iproc++) {
            final ProcessStats.ProcessState pkgProc = st.mProcesses.valueAt(iproc);
            final ProcessStats.ProcessState proc =
                mStats.mProcesses.get(pkgProc.mName, pkgProc.mUid);
            if (proc == null) {
              Log.w(
                  TAG,
                  "No process found for pkg "
                      + st.mPackageName
                      + "/"
                      + st.mUid
                      + " proc name "
                      + pkgProc.mName);
              continue;
            }
            ProcStatsEntry ent = entriesMap.get(proc.mName, proc.mUid);
            if (ent == null) {
              ent = new ProcStatsEntry(proc, st.mPackageName, bgTotals, runTotals, mUseUss);
              if (ent.mRunWeight > 0) {
                if (DEBUG)
                  Log.d(
                      TAG,
                      "Adding proc "
                          + proc.mName
                          + "/"
                          + proc.mUid
                          + ": time="
                          + ProcessStatsUi.makeDuration(ent.mRunDuration)
                          + " ("
                          + ((((double) ent.mRunDuration) / memTotalTime) * 100)
                          + "%)"
                          + " pss="
                          + ent.mAvgRunMem);
                entriesMap.put(proc.mName, proc.mUid, ent);
                procEntries.add(ent);
              }
            } else {
              ent.addPackage(st.mPackageName);
            }
          }
        }
      }
    }

    if (DEBUG) Log.d(TAG, "-------------------- MAPPING SERVICES");

    // Add in service info.
    for (int ip = 0, N = mStats.mPackages.getMap().size(); ip < N; ip++) {
      SparseArray<SparseArray<ProcessStats.PackageState>> uids =
          mStats.mPackages.getMap().valueAt(ip);
      for (int iu = 0; iu < uids.size(); iu++) {
        SparseArray<ProcessStats.PackageState> vpkgs = uids.valueAt(iu);
        for (int iv = 0; iv < vpkgs.size(); iv++) {
          ProcessStats.PackageState ps = vpkgs.valueAt(iv);
          for (int is = 0, NS = ps.mServices.size(); is < NS; is++) {
            ProcessStats.ServiceState ss = ps.mServices.valueAt(is);
            if (ss.mProcessName != null) {
              ProcStatsEntry ent = entriesMap.get(ss.mProcessName, uids.keyAt(iu));
              if (ent != null) {
                if (DEBUG)
                  Log.d(
                      TAG,
                      "Adding service "
                          + ps.mPackageName
                          + "/"
                          + ss.mName
                          + "/"
                          + uids.keyAt(iu)
                          + " to proc "
                          + ss.mProcessName);
                ent.addService(ss);
              } else {
                Log.w(
                    TAG,
                    "No process "
                        + ss.mProcessName
                        + "/"
                        + uids.keyAt(iu)
                        + " for service "
                        + ss.mName);
              }
            }
          }
        }
      }
    }

    return procEntries;
  }