我试图了解Android中动态权限的一些用例。换句话说,我试图理解为什么我们有addPermission *()API方法以及为什么只有静态权限是不够的。似乎没有太多的材料解释这一点,所以我希望得到一些解释。
此外,为了了解应用程序使用动态权限做什么,我下载了一些Android应用程序并开始对它们进行反向工程,并在源代码中查找addPermission *()API方法。我注意到有一些应用程序为PackageManager实现了一个包装类,我想知道这样做的目的是什么。下面是这些应用程序实现的包装类的示例,它们所做的只是调用PackageManager类的相应方法:
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 :(得分:0)
应用可以定义自定义权限以保护其代码/数据,但仍允许其他应用(具有正确权限)使用它。虽然很容易想到用例 - 就像一套应用程序只需要在它们之间共享数据/功能一样,但这些可以通过在清单中使用<permission>
标记来实现。但是,此API仅用于创建任何其他应用尚未使用的权限:
必须在安装任何使用这些权限的.apks之前添加新权限。通过此方法添加的权限会在重新启动设备时被记住。如果已存在给定权限,则您在此处提供的信息将用于更新它。
但仍然意味着任何已在其清单中声明permission-tree的应用使用。
因此,由于它在运行时创建权限,因此无法应用于自己的活动/服务,因此我们只留下广播。这个API相对于在Manifest中声明这些权限的唯一优势我可以想到的是用户不需要更新应用程序。因此,如果您正在使用一个“主要”应用程序(类似于Google Play),并且您希望能够安全地广播此套装中的新应用,即使用户未更新您的应用,您也可以仍然可以通过网络获得更新,并添加与新应用程序通信所需的权限。
对于你的第二个问题 - 它不能从你的例子中扣除。可能有多种原因,例如充当Bridge,或者为了添加自定义功能。