2014-11-06 48 views
2

我的Gradle项目包含4个库。在我的应用程序的最近版本中,我发现Android Studio默默地为清单添加了“读取通话记录”和“写入通话记录”权限。在build文件夹是“最终”清单被打包成APK,它包含这些行:Android清单合并默默添加权限

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

有没有办法要么完全禁用这种怪异的行为,或使一些日志记录,以知道这个来自?我不喜欢软件试图比我更聪明。

+0

是什么库? – CommonsWare 2014-11-06 23:53:51

回答

0

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

你可以通过向你的build.gradle添加一个新的gradle任务来实现这一点,并附加它作为依赖于processDebugResources和 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
在生成发行版时,您可能还需要复制该任务以删除权限。

+0

这肯定会工作,但我想要一个更好的解决方案。这里http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger他们说关于日志和日志格式,但没有关于如何打开这些日志...任何想法? – Grishka 2014-11-06 23:19:10

+0

我试过我的代码,它的工作原理。 正如您所看到的,日志记录对您的任务没有用处(http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Merging-Policies),节点类型'uses-permission'通过'android:name'属性具有合并策略。这意味着无论使用“android:name”来避免重复使用,所有'uses-permission'都会被合并。 – Gero 2014-11-06 23:28:17

+0

不,我的意思是这两个使用权限节点是在构建过程中由清单合并器自动添加的。它们不存在于任何图书馆的清单中(我仔细检查过),但它们确实存在于合并的一个中。记录将有助于查看导致清单合并添加这些节点的原因。 – Grishka 2014-11-06 23:34:27

4

您可以使用“Merge conflict markers”从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"/> 
+1

我确认在我自己的清单中添加这个,就在我自己的权限后,从最终的.apk中删除了这个无用的权限(注意我必须删除第一个'android:'前缀):'' – 2015-09-28 09:07:09

+0

这应该是被接受的答案,因为输出文件的结构更依赖于AS,脚本可能容易失败。 – danypata 2017-11-03 13:17:57