Ответ 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.