【问题标题】:AndroidManifest in androidTest directory being ignoredandroidTest 目录中的 AndroidManifest 被忽略
【发布时间】:2014-12-02 09:51:38
【问题描述】:

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

我可以很好地运行 一些 测试,即使 AllTests.java 运行良好,甚至没有 AndroidManifest.xml 文件在那里。问题是,对于我的一项新测试,我需要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>

很遗憾,这不起作用。运行其中一项测试时,我仍然收到以下错误:

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

我尝试在我的AndroidManifest.xml 文件中将package 设置为com.example.core.test(因为它显示在我的设置->应用列表中),但没有任何乐趣。

我认为它甚至无法识别 AndroidManifest.xml 文件,因为版本号也不会显示在测试应用的设置中。

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

【问题讨论】:

  • 我知道这是一年多以前的事了,但你有没有解决这个问题?我在 src/androidTest/AndroidManifest.xml 中的清单没有被合并到完整的清单中。
  • @Andrew 不幸的是,我无法为此找到满意的答案。我们的测试结构发生了显着变化,所以这对我来说不再是问题,但在改变之前,没有一个答案对我有用。 :(
  • "如何为我的测试项目注入正确的权限?"这就是我想问的

标签: android unit-testing junit


【解决方案1】:

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

我认为发生的情况是 androidTest/AndroidManifest.xml 中的权限将发送给测试应用程序,而不是目标应用程序,尽管我不是 100% 清楚是否实际上有两个不同的 APK 或什么。

【讨论】:

  • 谢谢!唯一的解决方案对我有用。同意这并不理想,但至少可行,这也是……
  • 之所以这样是因为By default, all tests run against the debug build type.。你可以阅读更多关于它的信息here
  • 这为我节省了几个小时!
  • 几个月后再次偶然发现此错误,您的解决方案再次帮助了我!!!!天才:D
【解决方案2】:

在旧版本的 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 文件合并(除了调试和发布清单文件(如果存在) )。有关清单合并的更多详细信息rules are here

如果您仍然遇到问题或只是在调试清单相关的测试问题,请试试这个 (针对 Windows 稍作调整):

  1. 放到终端
  2. 切换到您的项目目录 cd MyApplication
  3. 构建您的项目,假设“调试”是您要测试的构建类型,但您也可以使用“发布”或定义的构建脚本进行测试。 ./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 属性)。

【讨论】:

    【解决方案3】:

    根据here 的规定,在插桩测试期间,会生成两个 .apk 文件。如果您看一下,较小的那个很可能是名为 app-debug-androidTest-unaligned.apk 的那个,它实际上确实包含提供的权限。

    使用aapt d permissions &lt;apk_file_path&gt;.apk 检查文件有助于查看所有文件的列表。

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

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

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

    【讨论】:

      【解决方案4】:

      这是一个已知问题。

      目前(AGP AndroidManifest 测试合并。

      此处报告:https://issuetracker.google.com/issues/127986458 here 是由一位 Roboelectric 维护者造成的问题。

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

      希望看到 AGP 3.5 或 3.6 的修复

      【讨论】:

        【解决方案5】:

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

        android {
            sourceSets {
                androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
            }
        }
        

        【讨论】:

          【解决方案6】:

          一种解决方案就像在单次运行中构建主 apk 和测试 apk。 示例:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest

          这将创建一个新的检测主应用程序,该应用程序具有测试应用程序所需的所有额外权限。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            • 2022-09-24
            • 1970-01-01
            • 2021-08-30
            • 1970-01-01
            • 2021-03-07
            • 1970-01-01
            相关资源
            最近更新 更多