AndroidManifest在androidTest目录中被忽略

jwi*_*ir3 26 junit android unit-testing

我正在尝试使用以下目录结构(由Android Studio设置)进行测试:

测试目录结构

我可以运行一些测试就好了,甚至AllTests.java运行也没有AndroidManifest.xml文件甚至在那里.问题是,对于我的一项新测试,我需要获得android.permission.INTERNET许可.所以,我将以下内容添加到目录中的AndroidManifest.xml文件中androidTest:

<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>
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不起作用.当我运行我的一个测试时,我仍然收到以下错误:

E/RestAPIRequestTest:权限被拒绝(缺少INTERNET权限?)

我已经尝试设置packagecom.example.core.test我的AndroidManifest.xml文件(因为这是它显示在我的设置- >应用程序列表),但没有喜悦.

我认为它甚至不能识别AndroidManifest.xml文件,因为版本号也没有显示在测试应用程序的设置中.

如何为我的测试项目注入正确的权限?

use*_*293 26

我需要做类似的事情.我在androidTest旁边创建了一个名为"debug"的文件夹,它对应于应用程序的调试变体,并在该文件夹中放置了具有权限的AndroidManifest.xml.然后,由于测试应用程序使用调试变体,因此权限正在测试中.它并不理想,因为它模糊了测试和调试之间的界限,这些并不完全相同.

我认为正在发生的事情是androidTest/AndroidManifest.xml中的权限将转到测试应用程序,而不是目标应用程序,尽管如果实际上有两个不同的APK或什么,它不是100%清楚.

  • 这是因为“默认情况下,所有测试都是针对调试构建类型运行的”。您可以在[此处](https://developer.android.com/studio/test/index.html#change_the_test_build_type)阅读更多有关它的内容。 (2认同)
  • 几个月后,再次偶然发现此错误,您的解决方案再次帮助了我!!!!天才:D (2认同)

Pau*_*ulR 13

在早期版本的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

一些额外的说明:

  • instrumentation元素会自动添加到您的测试APK的AndroidManifest.xml中,因此您应该只添加测试APK所需的额外活动,权限等.
  • 如果使用模拟位置进行测试,您的应用程序APK将需要ACCESS_MOCK_LOCATION权限.您可以将权限添加到debug/AndroidManifest.xml文件中,也可以定义测试APK和应用程序APK在部署时应使用相同的userId(AndroidManifest.xml中的sharedUserId属性).


Mat*_*Pag 8

这是一个已知问题。

目前(AGP <= 3.4.X)不支持AndroidManifest测试合并。

此处报告: https: //issuetracker.google.com/issues/127986458这里是由 Roboelectric 维护人员之一创建的问题。

此处描述的解决方法与user3286293提出的解决方法几乎相同,并且目前是出于测试目的合并清单的唯一方法。

希望看到 AGP 3.5 或 3.6 的修复


Sha*_*yan 6

您需要在 build.gradle 文件中定义它:

android {
    sourceSets {
        androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
    }
}
Run Code Online (Sandbox Code Playgroud)


Bia*_* D. 5

如此处所述,在插桩测试期间,会生成两个 .apk 文件。如果你看看,较小的一个是最有可能的一个命名app-debug-androidTest-unaligned.apk,它实际上并不包括所提供的权限。

检查文件aapt d permissions <apk_file_path>.apk有助于查看所有文件的列表。

现在,请求权限的上下文本身可能存在问题。我有一个类似的问题,试图在 SD 卡上写一些截图(因此需要WRITE_EXTERNAL_STORAGE许可)。

这个答案帮助我解决了这个问题,虽然我不能完全理解为什么它是必要的。

简而言之,您需要android:sharedUserId在两个清单中声明相同的内容,以便在两个 apk 安装在同一设备上时合并权限 - 这发生在测试运行时。这帮助我将测试所需的权限与生产中的权限分开。