2017-02-06 29 views
0

我想了解一些用例在Android中的動態權限。換句話說,我試圖理解爲什麼我們有addPermission *()API方法,爲什麼只有靜態權限是不夠的。這裏似乎沒有太多材料可以解釋這一點,所以我希望能有一些解釋。另外,爲了解應用程序使用動態權限所做的工作,我下載了一些Android應用程序並開始對其進行逆向工程,並在源代碼中查找addPermission *()API方法。我注意到有一些應用程序爲PackageManager實現了一個包裝類,我想知道這樣做的目的是什麼。下面是這些應用程序實現的包裝類的一個示例,他們所做的只是調用PackageManager類的相應方法:用於動態權限的Android用例

public class PackageManagerWrapper 
    extends PackageManager 
{ 
    protected PackageManager mInner; 

    public PackageManagerWrapper() 
    { 
    this.mInner = null; 
    } 

    public PackageManagerWrapper(Context paramContext) 
    { 
    this.mInner = paramContext.getPackageManager(); 
    } 

    @Inject 
    public PackageManagerWrapper(PackageManager paramPackageManager) 
    { 
    this.mInner = paramPackageManager; 
    } 

    public void addPackageToPreferred(String paramString) 
    { 
    this.mInner.addPackageToPreferred(paramString); 
    } 

    public boolean addPermission(PermissionInfo paramPermissionInfo) 
    { 
    return this.mInner.addPermission(paramPermissionInfo); 
    } 
... 
} 

非常感謝!

回答

0

應用程序可以定義自定義權限以保護其代碼/數據,但仍允許其他應用程序(具有正確權限)使用它。雖然很容易想到用例 - 就像一套應用程序需要在它們之間共享數據/功能一樣,可以通過在清單中使用<permission>標籤來實現這些用例。但是,此API僅用於創建尚未被任何其他應用使用的權限:

在使用這些權限的任何.apks安裝之前,必須添加新的權限。通過此方法添加的權限在設備重新啓動時會被記住。如果授予的權限已經存在,則您在此提供的信息將用於更新它。

但仍然意味着任何已聲明permission-tree的應用程序在其清單中使用。

因此,由於它在運行時創建權限,因此無法應用於自己的活動/服務,因此我們只剩下廣播。這個API的唯一優勢就是在Manifest中聲明這些權限,我能想到的是用戶不需要更新應用程序。因此,如果您有一套應用程序,只有一個「主」應用程序(類似於Google Play),並且希望即使用戶未更新您的應用程序,也能夠安全地向該應用程序中的新應用程序廣播,您可以仍然通過網絡獲得更新,並添加所需的權限與新應用進行通信。

對於第二個問題 - 它不能從你的例子中扣除。可能有幾個原因,例如作爲Bridge,或者爲了添加自定義功能。

+0

好的,但那你爲什麼認爲這是一個公開的API? –

+0

對於第二個問題,包裝類似乎只調用PackageManager類的方法,而沒有真正添加任何功能。 –

+0

Android操作系統是非常模塊化的,許多你可能認爲的「操作系統」都是應用程序(例如,啓動器)。自然,這些應用程序只能使用公共Java方法。其中一些應用程序需要執行有意義的操作,因此Android權限模型僅允許那些「系統應用程序」使用它的某些apis。所以有可能這個api甚至不能被非系統應用程序使用,或者它是,但是沒有能夠安裝軟件包(只能通過系統應用程序完成)而無用 –