Android清单合并静默添加权限

9

我的Gradle项目包含4个库。最近在我的应用程序的构建过程中,我发现Android Studio默默地将“读取通话记录”和“写入通话记录”权限添加到了清单文件中。在构建文件夹中有一个“final”清单,它被打包到apk中并包含了这些行:

<android:uses-permission android:name="android.permission.READ_CALL_LOG" />
<android:uses-permission android:name="android.permission.WRITE_CALL_LOG" />

有没有一种方法可以完全禁用这种奇怪的行为或者启用一些日志记录,以便知道这是从哪里来的?我不喜欢软件试图比我聪明。


什么是库? - CommonsWare
2个回答

16
你可以使用“合并冲突标记”来从你的 Android Manifest 中移除此标签。
然后,你可以在 AndroidManifest 上设置下面的代码,它们将被删除:
<uses-permission android:name="android.permission.READ_CALL_LOG" 
        tools:node="remove"/>
<uses-permission android:name="android.permission.WRITE_CALL_LOG" 
        tools:node="remove"/>

1
我确认在我的清单文件中添加这个内容,在我的权限之后,可以成功从最终的.apk文件中移除这个无用的权限(请注意,我必须删除第一个android:前缀):<uses-permission android:name="android.permission.WRITE_CALL_LOG" tools:node="remove"/> - Sébastien
这应该是被接受的答案,因为输出文件的结构更依赖于AS,脚本容易失败。 - danypata

0
清单文件已合并,所以目前不支持这个功能。
您可以通过在 build.gradle 中添加一个新的 Gradle 任务,并将其附加为 processDebugResourcesprocessReleaseResources Gradle 任务的依赖项来实现此目标。
task('removeExtraPermissionsDebug') << {
    //Input the correct manifest file (could be under 'full' folder).
    def manifestFile = file("build/intermediates/manifests/full/debug/AndroidManifest.xml")
    def patternPermissions = Pattern.compile(".+(android\\.permission\\.ACCESS_NETWORK_STATE|android\\.permission\\.WAKE_LOCK).+")
    def manifestText = manifestFile.getText()
    def matcherPermissions = patternPermissions.matcher(manifestText)
    def newManifestText = matcherPermissions.replaceAll("")
    manifestFile.write(newManifestText)
}

tasks.whenTaskAdded { task ->
    if(task.name == 'processDebugResources'){
        task.dependsOn 'removeExtraPermissionsDebug'
    }
}

注意事项:
如果您有自定义的风味和构建类型,请考虑需要附加到的任务名称:process{Flavour}{BuildType}Resources
在生成发布版本时,您可能还需要复制删除权限的任务。


这肯定能行,但我想要一个更好的解决方案。在这里http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger中,他们谈到了日志记录和日志格式,但没有提到如何打开这些日志...有什么想法吗? - Grishka
我已经尝试了我的代码,它可以工作。 记录对于您的任务没有用处,正如您在(http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Merging-Policies)所看到的那样,节点类型 uses-permission 具有 android:name 属性的合并策略为 merge。这意味着所有的 uses-permission 都将被合并,无论重复与否,使用 android:name 来避免重复。 - Gero
不,我是说这两个 uses-permission 节点是在构建过程中由清单合并器自动添加的。它们不存在于任何库的清单中(我进行了双重检查),但它们存在于合并后的清单中。记录日志将有助于查看是什么原因导致清单合并器添加了这些节点。 - Grishka
我明白,如果是这种情况,可能与此相关... http://developer.android.com/reference/android/Manifest.permission.html#WRITE_CALL_LOG 注意:如果您的应用程序使用 READ_CONTACTS 权限,并且您的 minSdkVersion 和 targetSdkVersion 值均设置为 15 或更低版本,则系统会隐式授予您的应用此权限。 如果您不需要此权限,请确保您的 targetSdkVersion 是 16 或更高版本。 - Gero
抱歉@Grishka,如果我在你的位置上,我会使用gradle任务。但作为最后的资源,如果你愿意尝试更多的解决方法,而不知道这是否有效,你可以尝试将manifestmerger.enabled=false添加到你的属性文件中,并自己处理清单(?)。 - Gero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接