Разрешения только для Android с разрешением gradle

Я запускаю ./gradlew connectedAndroidTest и мне нужен мой APK для тестирования, чтобы иметь разрешение, которое не должно быть в любом не тестировании APK (debug, release). Я создал манифест с разрешения:

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mypackage"> <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/> </manifest> 

Затем я скопировал этот манифест в каталог src/androidTest , поскольку примечания к выпуску из плагина android-плагин:

0.13.0 (2014/09/18) Требуется Gradle 2.1 Теперь можно предоставить манифест для тестовых приложений (src / androidTest / AndroidManifest.xml)

Однако во время моих подключенных тестов разрешение не применяется.

Если я создаю каталог src/debug и перемещаю этот манифест там – разрешение применяется правильно во время связанных тестов (но также и при регулярных отладочных сборках, что нежелательно).

Я что-то делаю неправильно или есть ошибка?

Solutions Collecting From Web of "Разрешения только для Android с разрешением gradle"

Проблема связана с моим непониманием того, как работает задача градиентаAndroidTest. Он создает и развертывает 2 приложения для Android – тестируемый (ваш проект) и тестер (приложение, которое имитирует пользователя, который взаимодействует с тестируемым приложением). Мое намерение заключалось в том, чтобы добавить разрешение на тестируемое приложение. Однако добавление манифеста в src/androidTest привело к добавлению разрешения на приложение тестера. Вот как я понял это:

Если я выполняю

 adb shell pm list packages -f -3 

( -3 означает перечислить только сторонние пакеты) Я вижу что-то вроде этого

Пакет: /data/app/SmokeTestApp.apk=com.android.smoketest package: /data/app/GestureBuilder.apk=com.android.gesture.builder пакет: /data/app/com.mycompany.myapp-2.apk = Com.mycompany.myapp package: /data/app/SoftKeyboard.apk=com.example.android.softkeyboard package: /data/app/org.libsdl.app-2.apk=org.libsdl.app package: / data /app/SmokeTest.apk=com.android.smoketest.tests пакет: /data/app/com.mycompany.myapp.test-1.apk=com.mycompany.myapp.test

Приложение с суффиксом test-1 – это приложение тестера, другое – мое тестовое приложение. Проверка их разрешения дает:

 root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp-2.apk package: com.spredfast.android uses-permission: android.permission.INTERNET uses-permission: android.permission.WRITE_EXTERNAL_STORAGE root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp.test-1.apk package: com.spredfast.android uses-permission: android.permission.SET_ANIMATION_SCALE 

Таким образом, разрешение, SET_ANIMATION_SCALE , которое я собирался поместить в мое тестовое приложение, помещается в приложение-тестер. Неудивительно, что перемещение манифеста из src/androidTest в src/debug помещает это разрешение в тестовое приложение (правильное, но слишком широкое).


Вот как я решил исходную проблему – включение разрешения в приложение только в том случае, если приложение запускается внутри задачи connectedAndroidTest .

  1. Я создал пустую конструкцию, которая будет использоваться с интеграционными тестами:

     productFlavors { /** * This flavor is to be run only using connectedAndroidTestAnimcontrol */ animcontrol {} regular {} } 
  2. Перемещено src/androidTest/AndroidManifest.xml с единственным разрешением в src/animcontrol/AndroidManifest.xml

  3. Выполненные связанные тесты как

     ./gradlew connectedAnimcontrolDebugAndroidTest 

Это сделало трюк, теперь у меня есть AndroidManifest.xml который будет объединен с манифестом основного приложения только при запуске как connectedAndroidTest.

Надеюсь, это поможет кому-то.