2013-01-03 9 views
25

純粋なテスト目的のために、派生したテストケースInstrumentationTestCase2の外部SDカードにファイルを書き込もうとしています。これは、テスト中のアプリケーションのAndroidManifest.xmlファイルでandroid.permission.WRITE_EXTERNAL_STORAGEが設定されている場合はすべて正常に動作しますが、この設定がテストプロジェクトのAndroidManifest.xmlファイルにのみ存在する場合は機能しません。UIテストプロジェクトにのみAndroidのアクセス許可を追加するにはどうすればよいですか?

当然ながら、私は機能テスト中にこの機能が必要なだけなので、メインマニフェストにこの権限を追加したくありません。それをどうすれば実現できますか?

答えて

33

要するに、アプリケーションのマニフェストとテストプロジェクトの両方のマニフェストに同じ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にあります。

+0

パーフェクトかつ包括的な答えを!これは、他の点では "非推奨"の共有ユーザーIDの非常に良いユースケースです。私があなたが言及した欠点を抱えて生きることができる、ここで最も重要なことは実際にテストをプロダクションパーミッションから分離することであり、これが達成される。再度、感謝します! –

+0

素晴らしい回避策ですが、まだtest.apkにすべての権限が必要なときに、なぜそれがまだエラーを投げていたのですか? –

+4

こんにちは!素晴らしい回避策、ありがとう!しかし、Android 6(APIレベル23)から新しい許可システムが導入されている可能性が高いため、許可はもはやマージされないようです。私は個人的にこれを説明する文書を見つけられなかったので、私の前提は正しくないかもしれません。私以外に誰かがこの問題を経験していますか? –

-4

生成されたデバッグクラスのデバッグモードは、これらの条件でデバッグするので、プログラムで実行してください。

6

もう一つの簡単な答えがあります。 SRC /デバッグ/ AndroidManifest.xmlをへ

の設定権限が(存在しない場合は、それを作成します)デフォルトAndroidTestことで

BuildTypeとしてdebugを使用しています。なぜこれらのアクセス許可をdebug buildTypeの下に定義するのですか。ありがとうマージプロセスは、これらのアクセス許可をあなたのUIテストビルドに追加します。ここで が新たな権限を持つマニフェストいる今、あなたはdebug

よりも、特定のbuildTypeにこれらのアクセス許可を適用する場合

<?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> 

(それはマニフェスト優先度の低いレベルから継承されますので、私はパッケージ属性が含まれていなかったことに注意してください)

だけでこれを使用する:

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

これは私にとって良いことです。答えを共有してくれてありがとう –

関連する問題