【问题标题】:Android test-only permissions with gradle带有 gradle 的 Android 仅测试权限
【发布时间】:2015-03-05 18:56:16
【问题描述】:

我运行./gradlew connectedAndroidTest,我需要我的测试 APK 拥有不应在任何非测试 APK(调试、发布)中的权限。我已经创建了一个具有权限的清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mypackage">
    <uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/>
</manifest>

然后我已将此清单复制到 src/androidTest 目录,正如 gradle android 插件中的 release notes 建议的那样:

0.13.0 (2014/09/18) 需要 Gradle 2.1 现在可以为测试应用提供清单 (src/androidTest/AndroidManifest.xml)

但是,在我的连接测试期间没有应用权限。

如果我创建一个src/debug 目录并将此清单移动到那里——在连接测试期间正确应用了权限(但在常规调试构建期间也是如此,这是不可取的)。

是我做错了什么还是有错误?

【问题讨论】:

    标签: android gradle android-gradle-plugin android-testing


    【解决方案1】:

    问题源于我对connectedAndroidTest gradle task 工作原理的误解。它创建并部署了 2 个 android 应用程序 - 一个可测试(您的项目)和一个测试器(一个模拟与可测试应用程序交互的用户的应用程序)。我的意图是向可测试的应用程序添加权限。但是,将清单添加到 src/androidTest 会导致将权限添加到测试应用程序。我是这样想的:

    如果我执行

    adb shell pm list packages -f -3
    

    -3 表示只列出第三方包)我可以看到这样的东西

    包:/data/app/SmokeTestApp.apk=com.android.smoketest 包:/data/app/GestureBuilder.apk=com.android.gesture.builder 包:/data/app/com.mycompany.myapp-2.apk=com.mycompany.myapp 包:/data/app/SoftKeyboard.apk=com.example.android.softkeyboard 包:/data/app/org.libsdl.app-2.apk=org.libsdl.app 包:/data/app/SmokeTest.apk=com.android.smoketest.tests 包:/data/app/com.mycompany.myapp.test-1.apk=com.mycompany.myapp.test

    test-1后缀的app是tester app,另外一个是我的testable app。检查他们的许可给出:

    root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp-2.apk
    
    package: com.spredfast.android
    uses-permission: android.permission.INTERNET
    uses-permission: android.permission.WRITE_EXTERNAL_STORAGE
    
    root@generic_x86:/ # aapt d permissions /data/app/com.mycompany.myapp.test-1.apk
    
    package: com.spredfast.android
    uses-permission: android.permission.SET_ANIMATION_SCALE
    

    因此,我打算放入可测试应用程序的权限 SET_ANIMATION_SCALE 已放入测试程序应用程序。难怪将清单从 src/androidTest 移动到 src/debug 会将权限放入可测试的应用程序中(正确,但过于宽泛)。


    这是我解决原始问题的方法 - 在应用程序在 connectedAndroidTest 任务中运行的情况下将权限放入应用程序。

    1. 我创建了一个用于集成测试的空构建风格:

      productFlavors {
          /**
           * This flavor is to be run only using connectedAndroidTestAnimcontrol
           */
          animcontrol {}
      
          regular {}
      }
      
    2. 将具有单一权限的src/androidTest/AndroidManifest.xml移至src/animcontrol/AndroidManifest.xml

    3. 执行连接测试

      ./gradlew connectedAnimcontrolDebugAndroidTest
      

    成功了,现在我有了AndroidManifest.xml,只有在以 connectedAndroidTest 运行时才会与主应用的清单合并。

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多