Reputation: 6209
I'm trying to test using the following directory structure (which was setup by Android Studio):
I can run some tests just fine, and even the AllTests.java
runs fine without the AndroidManifest.xml
file even being there. The thing is, for one of my new tests, I need the android.permission.INTERNET
permission. So, I added the following to the AndroidManifest.xml
file located within the androidTest
directory:
<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>
Unfortunately, this doesn't work. I'm still getting the following error when I run one of my tests:
E/RestAPIRequestTest﹕ Permission denied (missing INTERNET permission?)
I've tried setting the package
to be com.example.core.test
in my AndroidManifest.xml
file (since that is what it shows up as in my Settings->Apps list), but with no joy.
I'm thinking it's not even recognizing the AndroidManifest.xml
file, since the version number doesn't show in the Settings for the test app, either.
How can I inject the correct permissions for my test project?
Upvotes: 47
Views: 28450
Reputation: 736
I had a similar issue, where to fix it I did:
debug
" next to "androidTest
" folder, which corresponds to the debug
variant of the app,AndroidManifest.xml
file, which contains the required permission, in said "debug
" folder.It's not ideal because it blurs the line between test and debug, which isn't quite the same thing.
Update; what's happening is that:
There are multiple build types, like "debug" and "release".
Each can have an AndroidManifest.xml
file, inside related folder with matching name, like "debug" and "release" folders.
But "androidTest" is NOT a build type (at time of writing), hence Gradle's default value for testBuildType
option is "debug"
(as docs mention), like:
android {
// ...
testBuildType "debug"
}
Said inconsistency is handled poorly by so-called Gradle-plugin ("com.android.tools.build:gradle:7.1.3").
And in fact, the "androidTest/AndroidManifest.xml
" file only works for library-projects
(not Apps, at time of writting).
Note that even if we manually set path to manifest, like:
android {
sourceSets {
androidTest {
manifest.srcFile "${project.rootDir}/AndroidManifest.xml"
}
}
}
It's silently ignored for androidTest
source-set (tested with Gradle 7.5.1),
while simialr setting works for main
source-set.
Upvotes: 57
Reputation: 3293
In older versions of Android Studio and the Android Gradle plugin the androidTest/AndroidManifest.xml file was ignored. This was documented at the tools.android.com site at the time.
With the Android Studio 1.0+ and Android Gradle 1.0+ plugin launch in December 2014 the AndroidManifest.xml file should now be merged with the normal main/AndroidManifest.xml files (in addition to the debug and release manifest files if they exist). More details regarding the manifest merging rules are here.
If you still run into issues or are just debugging manifest related testing issues try this (Adapt this slightly for 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
A couple of extra notes:
Upvotes: 17
Reputation: 2042
You need to define that in build.gradle file:
android {
sourceSets {
androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
}
}
Upvotes: 6
Reputation: 44813
This is a known problem.
Currently (AGP <= 3.4.X) is not supporting AndroidManifest
test merging.
This is reported here: https://issuetracker.google.com/issues/127986458 and here there is the issue created by one of the Roboelectric maintainers.
The workaround as described here its near the same proposed by user3286293 and currently is the only way to have the manifest merged for testing purposes.
Hope to see a fix for AGP 3.5 or 3.6
Upvotes: 8
Reputation: 111
One solution would be like build main apk and test apk in single run.
Example: ./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest
.
This will create a new instrumented main application which has all extra permissions required for test application.
Upvotes: 0
Reputation: 930
As specified here, during instrumented tests, there are generated two .apk files. If you take a look, the smaller one it's most probably the one named app-debug-androidTest-unaligned.apk
and it actually does include the provided permissions.
Inspecting the file with aapt d permissions <apk_file_path>.apk
can be useful to see a list of all of them.
Now, there might be an issue with the context itself where the permission is requested. I had a similar problem, trying to write some screenshots on SD card (thus needing the WRITE_EXTERNAL_STORAGE
permission).
This answer helped me to fix the problem, although I cannot fully understand why it's necessary.
In few words, you'll need to declare the same android:sharedUserId
in both manifests, in order to merge the permissions when both apks are installed on the same device - that happens when tests are running.
This helped me to separate permissions needed just for testing from the one in production.
Upvotes: 5