Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

adb shell pm list packages -f -3

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

пакет:/data/app/SmokeTestApp.apk=com.android.smoketest пакет:/data/app/GestureBuilder.apk=com.android.gesture.builder пакет:/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 пакет:/data/app/com.mycompany.myapp.test-1.apk=com.mycompany.myapp.test

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

[email protected]_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

[email protected]_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.

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

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

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

    ./gradlew connectedAnimcontrolDebugAndroidTest
    

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

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