我正在尝试使用以下目录结构(由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>
不幸的是,这不起作用。当我运行我的一个测试时,我仍然收到以下错误:
E / RestAPIRequestTest:权限被拒绝(缺少INTERNET权限?)
我已尝试在我的package
文件中将com.example.core.test
设置为AndroidManifest.xml
(因为这是我在我的设置 - >应用列表中显示的内容),但是没有快乐。
我认为它甚至不能识别AndroidManifest.xml
文件,因为版本号也没有显示在测试应用的设置中。
如何为我的测试项目注入正确的权限?
答案 0 :(得分:23)
我需要做类似的事情。我在androidTest旁边创建了一个名为“debug”的文件夹,它对应于应用程序的调试变体,并在该文件夹中放置了具有权限的AndroidManifest.xml。然后,由于测试应用程序使用调试变体,因此权限正在测试中。它并不理想,因为它模糊了测试和调试之间的界限,这并不完全相同。
我认为正在发生的事情是androidTest / AndroidManifest.xml中的权限将转到测试应用程序,而不是目标应用程序,尽管如果实际上有两个不同的APK或者什么,它不是100%清楚。
答案 1 :(得分: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文件合并(除了调试和发布清单文件(如果存在) )。关于清单合并的更多细节rules are here。
如果您仍遇到问题或只是调试清单相关的测试问题,请尝试此操作 (稍微适应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
一些额外的说明:
答案 2 :(得分:3)
如指定here,在检测测试期间,会生成两个.apk文件。如果您看一下,较小的那个最可能是名为app-debug-androidTest-unaligned.apk
的那个,而实际上确实包含所提供的权限。
使用aapt d permissions <apk_file_path>.apk
检查文件对于查看所有文件的列表非常有用。
现在,请求权限的上下文本身可能存在问题。我遇到了类似的问题,试图在SD卡上写一些截图(因此需要WRITE_EXTERNAL_STORAGE
权限)。
这answer帮助我解决了这个问题,虽然我无法完全理解为什么这是必要的。
简而言之,您需要在两个清单中声明相同的android:sharedUserId
,以便在两个apks安装在同一设备上时合并权限 - 这在测试运行时发生。
这有助于我将仅用于测试的权限与生产中的权限分开。
答案 3 :(得分:0)
一个解决方案就像在单次运行中构建主apk和测试apk。
示例:./gradlew clean :main:assembleDebug :main:assembleDebugAndroidTest
。
这将创建一个新的检测主应用程序,它具有测试应用程序所需的所有额外权限。
答案 4 :(得分:0)
这是一个已知问题。
当前(AGP <= 3.4.X)不支持AndroidManifest
测试合并。
在这里报告:https://issuetracker.google.com/issues/127986458 而here则是其中一个Roboelectric维修人员制造的问题。
here中描述的变通办法与 user3286293 所提出的变通方案几乎相同,目前是合并清单以进行测试的唯一方法。
希望看到针对AGP 3.5或3.6的修复程序
答案 5 :(得分:0)
您需要在build.gradle文件中定义它:
android {
sourceSets {
androidTest.manifest.srcFile "src/androidTest/AndroidManifest.xml"
}
}