【问题标题】:Android L permission conflict between release and debug apks发布和调试 apk 之间的 Android L 权限冲突
【发布时间】:2014-11-27 09:15:23
【问题描述】:

我已升级到 Android L,并且在“Google play”中拥有我的应用程序的发布版本和我们用于开发的调试版本。

它们使用不同的密钥进行签名。

我的问题是我安装了“Google play”版本,然后当我尝试安装调试版本时,它的定义如下:

debug {
        debuggable true
        packageNameSuffix ".debug"
        buildConfigField BOOLEAN, IS_DEV, TRUE
    }

这是我收到的错误:

Failure [INSTALL_FAILED_DUPLICATE_PERMISSION perm=com.app.name.permission.C2D_MESSAGE pkg=com.app.name]

这是有问题的权限:

<permission
    android:name="com.app.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>

<uses-permission android:name="com.app.name.permission.C2D_MESSAGE"/>

我知道 (http://commonsware.com/blog/2014/08/04/custom-permission-vulnerability-l-developer-preview.html) 并且知道这是由于安全问题而创建的,但我仍然需要能够与每个拥有自己的调试签名密钥的团队合作。

我尝试使用 adb uninstall (https://stackoverflow.com/a/27090838/2746924) 进行卸载,并且尝试清除设备上的所有应用缓存。

【问题讨论】:

  • 请注意,packageNameSuffix 已被弃用一段时间。请改用applicationIdSuffix。关于您的问题,我认为 GCM 应该关心 applicationId,因此您的自定义权限的 com.app.name 部分在您的调试和发布版本之间应该是不同的。关于您无法清除现有权限,我还没有运行测试(希望今天晚些时候进行),但我怀疑可能需要恢复出厂设置。
  • 没错,在发布和调试之间更改包名称可能会起作用,但这会扼杀我的口味。
  • “在发布和调试之间更改包名称可能会起作用” - 你已经这样做了,你的问题中的build.gradle sn-p 证明了这一点。
  • 那么是什么导致了我的实际问题?如果名称不同,则权限不同,这意味着无论使用什么键,我都不应该有问题?
  • “那么是什么导致了我的实际问题?” ——您的debug 构建是否可以在任何版本的Android(例如4.4)上运行? IOW,您的问题是否仅限于 5.0 和安装问题,还是您的 packageNameSuffix 在以前的 Android 版本中搞砸了?

标签: android google-cloud-messaging android-gradle-plugin


【解决方案1】:

通过修改清单以使用占位符,我可以成功地将 GCM 客户端应用的 debugrelease 版本同时安装在同一个 Android 5.0 Nexus 9 上:

<permission
  android:name="${applicationId}.permission.C2D_MESSAGE"
  android:protectionLevel="signature" />
<uses-permission
  android:name="${applicationId}.permission.C2D_MESSAGE" />

请注意,您还应该在&lt;receiver&gt; 中使用${applicationId} 作为&lt;category&gt;

    <receiver
        android:name="GCMBroadcastReceiverCompat"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE"/>

            <category android:name="${applicationId}" />
        </intent-filter>
    </receiver>

(坦率地说,我不相信自定义 &lt;permission&gt; 甚至不再需要,因为我尝试删除它并且仍然可以接收 GCM 消息)

如果您随后定义您的build.gradle,并为其中一种构建类型(例如debug)定义applicationIdSuffix,您最终将获得按构建类型单独的自定义权限,您将能够让它们并排安装。

【讨论】:

    猜你喜欢
    • 2016-12-16
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    相关资源
    最近更新 更多