基于应用安装顺序的Android自定义权限失败

Jay*_*yer 13 java android android-manifest android-intent android-permissions

我的应用在Google Play上遇到问题.我有一个免费的应用程序,它使用自定义权限.此权限允许访问付费应用.这些付费应用程序充当"钥匙"并解锁免费应用程序中的功能.基本上,免费应用程序将尝试启动其中一个付费应用程序的意图.付费应用程序将执行一些操作并返回说明免费应用程序是否应该解锁功能.

根据应用安装的顺序出现问题.如果首先安装免费应用程序然后安装付费应用程序,则免费应用程序无法启动意图.返回权限拒绝.如果首先安装付费应用程序然后安装免费应用程序,免费应用程序可以启动意图没问题.重新启动设备和/或强制停止应用程序无法解决问题.我正在附上相关代码.有些东西告诉我,我做错了什么.

  • 免费App Manifest(相关代码):

    ...
    <uses-permission android:name="com.company.license.PERMISSION" />
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  • 免费应用程序代码检查意图(相关代码):

    Intent KeyApp = new Intent("com.company.license.action.AUTH_1");
    KeyApp.putExtra("com.company.license.challenge", 1);
    
    //If free app is installed first, an exception is thrown for not having the proper permission. If paid app is installed first, no exception is thrown
    try {
        startActivityForResult(KeyApp, COMMING_FROM_KEYAPP);
    } catch (Exception e) {
        cancelStartUp();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 付费应用清单(相关代码):

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.company.installer.1"
    ...
    <permission
        android:name="com.company.license.PERMISSION"
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:protectionLevel="normal" >
    </permission>
    
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoDisplay" >
    
        <activity
            android:name="com.company.license.auth"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:permission="com.company.license.PERMISSION"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="com.company.license.action.AUTH_1" />
    
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    
        <activity
            android:name="com.company.installer.redirect"
            android:configChanges="keyboardHidden|orientation"
            android:exported="true"
            android:theme="@style/Theme.Transparent" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    
    </manifest>
    
    Run Code Online (Sandbox Code Playgroud)

Com*_*are 12

<permission>在两个应用程序中放置相同的元素.此外,由于这是特定于您的两个应用程序,我将使用android:protectionLevel="signature"而不是normal- 这意味着用户永远不需要批准该权限,其他任何人都无法请求权限.而且,这个配方将允许以任何顺序安装.

更新:但请注意,由于Android的"赢得第一个"方法,使用自定义权限会打开潜在的漏洞.

更新#2:现在不再支持Android 5.0,因为两个应用程序不能同时具有相同的<permission>元素,除非它们由相同的签名密钥签名.

  • 问题:如果首次安装的应用程序为相同的权限指定了<permission>和<uses-permission>,则在安装时不会通知用户权限请求.安装第二个应用程序后,第一个应用程序可以访问需要该权限的第二个应用程序组件.重大安全问题? (5认同)
  • @plaisthos:有意思!我将在本周末进行一些测试.谢谢! (2认同)