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

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

<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, как примечания к выпуску из gradle Android-плагин предлагает:

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

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

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

Я что-то не так делаю или это баг?


person Denis Kniazhev    schedule 07.01.2015    source источник


Ответы (1)


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

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

adb shell pm list packages -f -3

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

package:/data/app/SmokeTestApp.apk=com.android.smoketest package:/data/app/GestureBuilder.apk=com.android.gesture.builder package:/data/app/com.mycompany.myapp- 2.apk=com.mycompany.myapp пакет:/data/app/SoftKeyboard.apk=com.example.android.softkeyboard пакет:/data/app/org.libsdl.app-2.apk=org. Пакет libsdl.app:/data/app/SmokeTest.apk=com.android.smoketest.tests package:/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, который будет объединен с манифестом основного приложения только при запуске как connectAndroidTest.

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

person Denis Kniazhev    schedule 09.01.2015