2014-11-06 2 views
2

Проект My Gradle содержит 4 библиотеки. В последних сборках моего приложения я обнаружил, что Android Studio молча добавляет к манифесту разрешения «читать журнал вызовов» и «записывать журнал вызовов». В папке сборки является «окончательным» манифестом, который упакован в APK и содержит следующие строки:Слияние манифеста Android молча добавляет разрешения

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

Есть ли способ отключить такое странное поведение полностью или включить некоторое протоколирование знать, где это происходит от ? Мне не нравится, когда программное обеспечение пытается быть умнее меня.

+0

Какие библиотеки? – CommonsWare

ответ

0

Ярлыки объединены, так что это еще не поддерживается.

Вы можете архивировать это, добавив новую задачу градации к вашему build.gradle и прикрепляя ее как зависимость processDebugResources и processReleaseResources задач градации.

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

+0

Я пробовал свой код, и он работает. Ведение журнала не подходит для вашей задачи, как вы можете видеть (http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Merging-Policies), У Node Type 'uses-permission' есть Политика слияния' merge' по атрибуту android: name. Это означает, что все 'uses-permission' объединены независимо от того, что использует' android: name', чтобы избежать повторных. – Gero

+0

Нет, я имею в виду, что эти два использования - узлы разрешения автоматически добавляются с помощью манифеста слияния во время процесса сборки. Они не существуют в каких-либо проявлениях библиотек (я дважды проверял), но они существуют в объединенной. Ведение журнала будет полезно узнать, что заставляет манифестное слияние добавлять эти узлы. – Grishka

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:'): ' ' –

+0

Это должен быть принятый ответ, так как структура выходных файлов больше зависит от AS, сценарий может сбой. – danypata

Смежные вопросы