Вы получаете пустой список обратно, потому что PackageManager умер, потому что буфер IPC, который используется для возврата списка установленных приложений, стал больше, чем его размер буфера 1 МБ (по состоянию на 4.4).
Начиная с API 15, такое же поведение выдает TransactionTooLargeException
. В API <15 возвращается только пустой список, и иногда в logcats видна небольшая ошибка. </p>
getInstalledPackages()
не требуется выполнять в потоке пользовательского интерфейса. Может показаться, что так, но это будет только случайным. Если вы выполняете его только в главном потоке, у вас есть побочный эффект, заключающийся в том, что он предотвращает одновременные вызовы, которые могут заполнить общий для всего процесса IPC-буфер.