web-dev-qa-db-ja.com

androidTestディレクトリのAndroidManifestが無視される

私は次のディレクトリ構造(Android Studio)によって設定された)を使用してテストしようとしています:

test directory structure

私はsomeテストを問題なく実行でき、AllTests.JavaファイルがなくてもAndroidManifest.xmlでも問題なく実行できます。新しいテストの1つでは、Android.permission.INTERNET権限が必要です。そこで、androidTestディレクトリ内にあるAndroidManifest.xmlファイルに以下を追加しました。

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
          package="com.example.core"
          Android:versionCode="2"
          Android:versionName="2.0" >

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

    <uses-permission Android:name="Android.permission.INTERNET" />
</manifest>

残念ながら、これは機能しません。テストの1つを実行しても、次のエラーが発生します。

E/RestAPIRequestTest:権限が拒否されました(インターネット権限がありませんか?)

私のcom.example.core.testファイルでpackageAndroidManifest.xmlに設定しようとしましたが(設定->アプリリストに表示されているため)、喜びはありません。

バージョン番号もテストアプリの設定に表示されないため、AndroidManifest.xmlファイルを認識していないと思います。

テストプロジェクトに正しい権限を挿入するにはどうすればよいですか?

28
jwir3

同様のことをする必要がありました。アプリのデバッグバリアントに対応するandroidTestの横に「debug」という名前のフォルダーを作成し、そのフォルダーに権限を持つAndroidManifest.xmlを配置しました。その後、テストアプリはデバッグバリアントを使用するため、権限はテストの下で機能します。テストとデバッグの境界が曖昧になるため、理想的ではありません。これらはまったく同じではありません。

何が起こっているのかと思います。androidTest/ AndroidManifest.xmlの権限は、ターゲットアプリではなくテストアプリに与えられますが、実際には2つの異なるAPKがあるかどうかは100%わかりません。

25
user3286293

古いバージョンのAndroid StudioとAndroid Gradleプラグインでは、androidTest/AndroidManifest.xmlファイルは無視されました。これはtools.Android.comサイトに記載されていました当時の。

Android Studio 1.0+およびAndroid Gradle 1.0+プラグインが2014年12月にリリースされたので、AndroidManifest.xmlファイルを通常のmain/AndroidManifestとマージする必要があります。 xmlファイル(デバッグおよびリリースのマニフェストファイルが存在する場合は、それらに加えて)マニフェストのマージに関する詳細 ルールはこちら

それでも問題が発生する場合、またはマニフェスト関連のテスト問題をデバッグしている場合は、これを試してください(Windowsの場合はこれを少し調整してください)。

  1. 端末にドロップ
  2. プロジェクトディレクトリに変更しますcd MyApplication
  3. 'debug'をテスト対象のビルドタイプと想定してプロジェクトをビルドしますが、 'release'またはビルドスクリプトで定義されたものでテストすることもできます。 ./gradlew assembleDebugTest
  4. 次に、テストAPKマニフェストを検査します:ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
  5. アプリケーションのAPKマニフェストを表示:ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
  6. マニフェストのマージプロセスの詳細を示すマージ出力ログが見つかります:ls app/build/outputs/apk/manifest-merger-debug-report.txt

追加のメモのカップル:

  • インストルメンテーション要素はテストAPKのAndroidManifest.xmlに自動的に追加されるため、テストAPKが必要とするアクティビティ、権限などを追加するだけで済みます。
  • モックの場所でテストする場合、アプリケーションAPKには ACCESS_MOCK_LOCATION 権限が必要です。権限をdebug/AndroidManifest.xmlファイルに追加するか、テストAPKとアプリケーションAPKがデプロイ時に同じuserId(AndroidManifest.xmlのsharedUserId属性)を使用するように定義できます。
13
PaulR

指定された here のように、インストルメント化されたテスト中に、2つの.apkファイルが生成されます。見てみると、小さい方がapp-debug-androidTest-unaligned.apkという名前の可能性が高く、実際にはdoesに提供された権限が含まれています。

aapt d permissions <apk_file_path>.apkを使用してファイルを検査すると、それらすべてのリストを表示するのに役立ちます。

現在、権限が要求されているコンテキスト自体に問題がある可能性があります。同様の問題があり、SDカードにスクリーンショットを書き込もうとしました(そのため、WRITE_EXTERNAL_STORAGE権限が必要です)。

これは answer で問題を解決するのに役立ちましたが、なぜそれが必要なのか完全には理解できません。

つまり、両方のapkが同じデバイスにインストールされているときにアクセス許可をマージするには、両方のマニフェストで同じAndroid:sharedUserIdを宣言する必要があります。これは、テストの実行中に発生します。これは、テストのためだけに必要な権限を本番環境の権限から分離するのに役立ちました。

4
Bianca D.

これは既知の問題です。

現在(AGP <= 3.4.X)はAndroidManifestテストのマージをサポートしていません。

これはここで報告されます: https://issuetracker.google.com/issues/127986458 および here Roboelectricメンテナの1人によって作成された問題があります。

説明されている回避策 ここser328629によって提案されたものとほぼ同じ、現在は唯一の方法テスト目的でマニフェストをマージする。

AGP 3.5または3.6の修正を確認したい

3
MatPag

1つの解決策は、1回の実行でメインAPKとテストAPKをビルドするようなものです。例:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest

これにより、テストアプリケーションに必要なすべての追加の権限を持つ新しいインストルメント化されたメインアプリケーションが作成されます。

0
VillageMonkey

これをbuild.gradleファイルで定義する必要があります。

Android {
    sourceSets {
        androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
    }
}
0
Shayan_Aryan