私は次のディレクトリ構造(Android Studio)によって設定された)を使用してテストしようとしています:
私は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
ファイルでpackage
をAndroidManifest.xml
に設定しようとしましたが(設定->アプリリストに表示されているため)、喜びはありません。
バージョン番号もテストアプリの設定に表示されないため、AndroidManifest.xml
ファイルを認識していないと思います。
テストプロジェクトに正しい権限を挿入するにはどうすればよいですか?
同様のことをする必要がありました。アプリのデバッグバリアントに対応するandroidTestの横に「debug」という名前のフォルダーを作成し、そのフォルダーに権限を持つAndroidManifest.xmlを配置しました。その後、テストアプリはデバッグバリアントを使用するため、権限はテストの下で機能します。テストとデバッグの境界が曖昧になるため、理想的ではありません。これらはまったく同じではありません。
何が起こっているのかと思います。androidTest/ AndroidManifest.xmlの権限は、ターゲットアプリではなくテストアプリに与えられますが、実際には2つの異なるAPKがあるかどうかは100%わかりません。
古いバージョンの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の場合はこれを少し調整してください)。
cd MyApplication
./gradlew assembleDebugTest
ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
ls app/build/outputs/apk/manifest-merger-debug-report.txt
追加のメモのカップル:
指定された here のように、インストルメント化されたテスト中に、2つの.apkファイルが生成されます。見てみると、小さい方がapp-debug-androidTest-unaligned.apk
という名前の可能性が高く、実際にはdoesに提供された権限が含まれています。
aapt d permissions <apk_file_path>.apk
を使用してファイルを検査すると、それらすべてのリストを表示するのに役立ちます。
現在、権限が要求されているコンテキスト自体に問題がある可能性があります。同様の問題があり、SDカードにスクリーンショットを書き込もうとしました(そのため、WRITE_EXTERNAL_STORAGE
権限が必要です)。
これは answer で問題を解決するのに役立ちましたが、なぜそれが必要なのか完全には理解できません。
つまり、両方のapkが同じデバイスにインストールされているときにアクセス許可をマージするには、両方のマニフェストで同じAndroid:sharedUserId
を宣言する必要があります。これは、テストの実行中に発生します。これは、テストのためだけに必要な権限を本番環境の権限から分離するのに役立ちました。
これは既知の問題です。
現在(AGP <= 3.4.X)はAndroidManifest
テストのマージをサポートしていません。
これはここで報告されます: https://issuetracker.google.com/issues/127986458 および here Roboelectricメンテナの1人によって作成された問題があります。
説明されている回避策 ここser328629によって提案されたものとほぼ同じ、現在は唯一の方法テスト目的でマニフェストをマージする。
AGP 3.5または3.6の修正を確認したい
1つの解決策は、1回の実行でメインAPKとテストAPKをビルドするようなものです。例:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest
。
これにより、テストアプリケーションに必要なすべての追加の権限を持つ新しいインストルメント化されたメインアプリケーションが作成されます。
これをbuild.gradleファイルで定義する必要があります。
Android {
sourceSets {
androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
}
}