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

Как я могу добавить дополнительные разрешения для Android только для моего тестового проекта UI?

Я пытаюсь записать файлы на внешнюю SD-карту в тестовом случае из InstrumentationTestCase2 для чистых целей тестирования. Это хорошо работает, когда android.permission.WRITE_EXTERNAL_STORAGE настроен в файле AndroidManifest.xml тестируемого приложения, но не работает, если этот параметр присутствует только в файле AndroidManifest.xml тестового проекта.

Естественно, я не хочу добавлять это разрешение в основной манифест, так как мне нужна эта возможность только во время моих функциональных тестов. Как я могу это достичь?

4b9b3361

Ответ 1

Короче вы должны добавить те же android:sharedUserId для манифеста приложения и манифеста проекта проекта и объявить необходимое разрешение для тестового проекта.

Это обходное решение исходит из того факта, что Android фактически назначает разрешения для учетных записей linux (uids), но не для самих приложений (по умолчанию каждое приложение получает свой собственный uid, поэтому похоже, что разрешения назначаются для приложения).

Приложения, подписанные с тем же сертификатом, могут совместно использовать один и тот же uid. Как следствие, у них есть общий набор разрешений. Например, я могу иметь приложение A, которое запрашивает разрешение WRITE_EXTERNAL_STORAGE и приложение B, которое запрашивает разрешение INTERNET. Оба A и B подписываются одним и тем же сертификатом (пусть отлаживают один). В файлах AndroidManifest.xml для A и B android:sharedUserId="test.shared.id" объявлен тег <manifest>. Затем оба A и B могут получить доступ к сети и записать на SD-карту, даже если они объявляют только часть необходимых разрешений, потому что разрешения назначаются за uid. Конечно, это работает только в том случае, если на самом деле установлены A и B.

Вот пример того, как настроить в случае тестового проекта. AndroidManifest.xml для приложения:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testproject"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.example.testproject.uid">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name="com.example.testproject.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

И AndroidManifest.xml для тестового проекта

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testproject.test"
    android:sharedUserId="com.example.testproject.uid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.testproject" />

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

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

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

Некоторая дополнительная информация об общих UID может быть найдена в http://developer.android.com/guide/topics/security/permissions.html#userid.

Ответ 2

Есть еще один простой ответ.

Установить разрешение на src/debug/AndroidManifest.xml(если его не существует, создать его)

По умолчанию AndroidTest использует debug как BuildType. что вы определяете эти разрешения там под debug buildType. Спасибо. Процесс объединения, который добавит эти разрешения в вашу сборку тестов UI. Вот манифест с новыми разрешениями (обратите внимание, что я не включил атрибут пакета, потому что он будет унаследован от манифеста с более низким приоритетом)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

Теперь, если вы хотите применить эти разрешения к определенному типу buildType, чем debug

просто используйте это:

android {
   ...
   testBuildType 'release' // or other buildType you might have like 'testUI'
}

Ответ 3

Сделать это программно, поскольку режим отладки сгенерированного класса Debug будет отлаживаться в этих условиях.