簡體   English   中英

更快或更清晰的方式來確定Android上是否安裝了軟件包

[英]Faster or cleaner way to find out if a package is installed on Android

我知道,我可以趕上NameNotFoundException從調用PackageManager.getPackageInfo通過或循環PackageInfo通過返回的列表PackageManager.getInstalledPackages知道是否安裝了特定的軟件包,但是這兩個似乎無論是長篇大論還是丑陋。 在我的個人電話上,我安裝了300多個軟件包,所以每次我需要檢查時,我都不想做這個操作。 捕獲異常作為執行應用程序邏輯的一種方法只會讓我感到錯誤。 我在某處錯過了isPackageInstalled方法,還是只需要使用上述技術之一自己實現它? 如果是后者,那將被認為是更快,資源更少的選擇?

由於PackageManager.getInstalledPackages()返回List ,因此您無需手動循環。 您可以使用List.contains()List.containsAll()在一行代碼中完成任務。 當然,這不會改變效率,因為兩種方法本身都可能包含循環。

如果使用API​​確實會讓您感到煩惱,那么您可能會看到涉及以下內容的黑客攻擊

獲取PM列表的Bash shell表達式Java運行時表達式Java管道和緩沖區和流Java NIO Java grep

所以bash表達式將是:

pm list packages -f | sed's / ^ package .//'| awk -F“=”'{print $ 2“”$ 1}'| 分類

以及可能最快加快的方式從'pm list'處理stdout的引用列表...

PipedBuffers

NIO / grep的

運行時間/流

處理NameNotFoundExcepetion不應該讓你覺得“整個錯誤”恕我直言。 根據文檔,如果自api級別1后包不存在,則拋出此異常。使用try / catch語句與使用if / then語句測試空值非常相似。

在這種情況下,不應將其視為變通方法或黑客,因為您正在使用已記錄和預期的異常返回值來確定是否存在包。

我假設這個方法比通過getInstalledPackages()返回的List迭代更快。 但是,我不知道在返回NameNotFoundExcepetion之前android采取了什么步驟。 這將是一個有趣的基准測試。

我不知道有任何其他實用方法來測試已安裝的軟件包。

我寫了一些基准測試並測試了捕獲異常與幾種不同的方法來獲取已安裝的軟件包並循環遍歷它們。 這是我的結果

  1. 調用PackageManager.getPackageInfo並捕獲NameNotFoundException在所有情況下都需要1到4毫秒,無論是否安裝了請求的包,我確保還包括這是第一次調用PackageManager以執行特定應用程序的情況並且作為后續調用,以防框架在每個應用程序啟動時對此信息進行任何緩存。

  2. 在所有情況下,調用PackageManger.getPackageInfo也需要1到1.5秒。

調用getPackageInfo並捕獲異常以確定是否未安裝軟件包是目前檢查的更快方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM