要するに、アプリケーションのマニフェストとテストプロジェクトの両方のマニフェストに同じandroid:sharedUserId
を追加し、テストプロジェクトに必要な権限を宣言する必要があります。
この回避策は、実際にはAndroidユーザーアカウント(uid)にアクセス許可を割り当てますが、アプリケーション自体には許可しません(デフォルトではすべてのアプリケーションが独自のuidを取得するので、アプリケーションごとにアクセス許可が設定されます)。
ただし、同じ証明書で署名されたアプリケーションは、同じuidを共有できます。結果として、彼らは共通の権限セットを持っています。たとえば、WRITE_EXTERNAL_STORAGEアクセス権を要求するアプリケーションAと、インターネットアクセス権を要求するアプリケーションBを持つことができます。 AとBの両方が同じ証明書で署名されています(デバッグをしましょう)。 AndroidManifest.xmlでは、android:sharedUserId="test.shared.id"
のファイルは<manifest>
タグで宣言されています。 UIDごとにパーミッションが割り当てられているため、AとBの両方が必要なパーミッションの一部だけを宣言していても、AとBの両方がネットワークにアクセスしてsdcardに書き込むことができます。もちろん、これは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にあります。
パーフェクトかつ包括的な答えを!これは、他の点では "非推奨"の共有ユーザーIDの非常に良いユースケースです。私があなたが言及した欠点を抱えて生きることができる、ここで最も重要なことは実際にテストをプロダクションパーミッションから分離することであり、これが達成される。再度、感謝します! –
素晴らしい回避策ですが、まだtest.apkにすべての権限が必要なときに、なぜそれがまだエラーを投げていたのですか? –
こんにちは!素晴らしい回避策、ありがとう!しかし、Android 6(APIレベル23)から新しい許可システムが導入されている可能性が高いため、許可はもはやマージされないようです。私は個人的にこれを説明する文書を見つけられなかったので、私の前提は正しくないかもしれません。私以外に誰かがこの問題を経験していますか? –