AndroidManifest in androidTest directory being ignored

20,767

Solution 1

I needed to do something similar. I created a folder named "debug" next to androidTest, which corresponds to the debug variant of the app, and put an AndroidManifest.xml with the permission in that folder. Then the permission works under test since the test app uses the debug variant. It's not ideal because it blurs the line between test and debug, which aren't quite the same thing.

I think what's happening is that the permissions in androidTest/AndroidManifest.xml are going to the test app, not the target app, although it's not 100% clear to me if there are actually two different APKs or what.

Solution 2

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):

  1. Drop to a terminal
  2. change to to your project directory cd MyApplication
  3. Build your project, assuming 'debug' is the build type you want to test with, but you could also be testing with 'release' or a build script defined one. ./gradlew assembleDebugTest
  4. Then inspect your test APK manifest: ls app/build/intermediates/manifests/test/debug/AndroidManifest.xml
  5. View your application APK manifest: ls app/build/intermediates/manifests/full/debug/AndroidManifest.xml
  6. A merge output log can be found detailing the manifest merging process: ls app/build/outputs/apk/manifest-merger-debug-report.txt

A couple of extra notes:

  • An instrumentation element is automatically added to your test APK's AndroidManifest.xml so you should only be adding extra activities, permissions, etc that your test APK needs.
  • If testing with mock locations your application APK will need the ACCESS_MOCK_LOCATION permission. You can add the permission to your debug/AndroidManifest.xml file or you can define that the test APK and the application APK should use the same userId when deployed (sharedUserId attribute in your AndroidManifest.xml).

Solution 3

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

Solution 4

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.

Solution 5

You need to define that in build.gradle file:

android {
    sourceSets {
        androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
    }
}
Share:
20,767

Related videos on Youtube

jwir3
Author by

jwir3

I am a developer committed to open source software. I currently work for InVision as a Sr. Graphics Engineer helping to develop the Studio product. I have worked for Mozilla, helping develop the Gecko Platform, the rendering engine behind Firefox, Thunderbird, Sunbird, and many other third-party products. I have also worked for General Dynamics, When I Work1, and a few other startups in the Minneapolis/St. Paul metro area. I also volunteer my time to numerous projects, including the Crystal Space SDK, which is an open source game engine. I am very passionate about video games, especially with regards to high performance graphics and immersive environments. When I'm not working or developing open source software, my major hobbies include martial arts, video games, sailing, and playing my violin. I hold the rank of 3rd Degree Black Belt, Green Sash in Wu Chi Chuu'an Kung Fu. I am also a certified level 3 ice hockey referee for USAHockey.

Updated on July 09, 2022

Comments

  • jwir3
    jwir3 almost 2 years

    I'm trying to test using the following directory structure (which was setup by Android Studio):

    test directory structure

    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?

    • Andrew
      Andrew over 8 years
      I know this was over a year ago, but did you ever get this resolved? My manifest in src/androidTest/AndroidManifest.xml is not being merged into the full manifest.
    • jwir3
      jwir3 over 8 years
      @Andrew I was not able to to find a satisfactory answer for this, unfortunately. Our test structure has changed significantly, so this is no longer an issue for me, but prior to the change, none of the answers were working for me. :(
    • linjiejun
      linjiejun over 3 years
      "How can I inject the correct permissions for my test project?" This is what I want to ask
  • Zach Moshe
    Zach Moshe about 8 years
    thanks! the only solution worked for me. Agree it's not ideal but at least that works, that's also something...
  • epool
    epool almost 8 years
    The reason of this is because By default, all tests run against the debug build type.. You can read more about it here.
  • kilian eller
    kilian eller about 7 years
    that saved me hours!
  • Poweranimal
    Poweranimal almost 7 years
    After couple of month a stumbled again about this error and your solution helped me again!!!! GENIUS :D