Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android清单合并会自动添加权限_Android_Android Manifest_Android Gradle Plugin - Fatal编程技术网

Android清单合并会自动添加权限

Android清单合并会自动添加权限,android,android-manifest,android-gradle-plugin,Android,Android Manifest,Android Gradle Plugin,我的Gradle项目包含4个库。在我的应用程序的最新版本中,我发现Android Studio正在默默地向清单中添加“读取调用日志”和“写入调用日志”权限。构建文件夹中有一个打包到apk中的“最终”清单,其中包含以下行: <android:uses-permission android:name="android.permission.READ_CALL_LOG" /> <android:uses-permission android:name="android.permission

我的Gradle项目包含4个库。在我的应用程序的最新版本中,我发现Android Studio正在默默地向清单中添加“读取调用日志”和“写入调用日志”权限。构建文件夹中有一个打包到apk中的“最终”清单,其中包含以下行:

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


有没有一种方法可以完全禁用这种奇怪的行为,或者启用一些日志记录来了解其来源?我不喜欢软件试图比我聪明。

清单被合并,所以这还不受支持

您可以通过向build.gradle中添加一个新的gradle任务,并将其作为
processDebugResources
processReleaseResources
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'
    }
}
task('removeExtraPermissionsDebug')
if(task.name==“processDebugResources”){
task.dependsOn'removeExtraPermissionsDebug'
}
}
注:
如果您有自定义风格和构建类型,请考虑需要附加到的任务的名称:
process{flavor}{BuildType}Resources

生成发布时,您可能还需要复制任务以删除权限。

您可以使用“”从Android清单中删除此标记

然后,您可以在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"/>


这肯定会奏效,但我想要一个更好的解决方案。这里他们说的是日志和日志格式,但没有说明如何打开这些日志。。。有什么想法吗?我已经试过我的代码了,它很有效。日志记录对您的任务没有用处,正如您在()上所看到的,节点类型
使用权限
有一个通过
android:name
属性的
merge
合并策略。这意味着所有的
使用权限
都会被合并,无论使用什么
android:name
,以避免重复。不,我的意思是这两个使用权限节点是在构建过程中通过清单合并自动添加的。它们不存在于任何库的清单中(我仔细检查过),但它们确实存在于合并的清单中。日志记录将有助于查看是什么导致清单合并添加这些节点。我理解,在这种情况下,它可能与此相关<代码>注意:如果您的应用程序使用READ_CONTACTS权限,并且您的minSdkVersion和targetSdkVersion值都设置为15或更低,则系统会隐式授予您的应用程序此权限。如果您不需要此权限,请确保您的targetSdkVersion为16或更高版本Sorry@Grishka,我会在您的位置使用gradle任务。但是,作为最后一个资源,如果您愿意尝试更多的变通方法,而不知道这是否可行,您可以尝试将
manifestmerge.enabled=false
添加到属性文件中,并自行处理清单(?)。库是什么?我确认,在我自己的许可之后,将其添加到我自己的清单中,努力从final.apk中删除这个无用的权限(注意,我必须删除第一个
android:
前缀):
这应该是可以接受的答案,因为输出文件的结构更依赖于脚本,脚本很容易失败。