首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何仅为UI测试项目添加额外的Android权限?

如何仅为UI测试项目添加额外的Android权限?
EN

Stack Overflow用户
提问于 2013-01-04 00:21:55
回答 3查看 11.1K关注 0票数 30

出于纯粹测试的目的,我尝试在从InstrumentationTestCase2派生的测试用例中将文件写入外部SD卡。当在被测应用程序的AndroidManifest.xml文件中配置android.permission.WRITE_EXTERNAL_STORAGE时,这一切都很好,但如果此设置仅存在于测试项目的AndroidManifest.xml文件中,则不起作用。

当然,我不想将此权限添加到主清单中,因为我只在功能测试期间需要此功能。我怎样才能做到这一点呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-07 21:00:08

简而言之,您应该为应用程序的清单和测试项目的清单添加相同的android:sharedUserId,并声明测试项目的必要权限。

这个变通方法来自于Android实际上将权限分配给linux用户帐户( uid ),而不是分配给应用程序本身(默认情况下,每个应用程序都有自己的uid,所以看起来像是每个应用程序都设置了权限)。

但是,使用相同证书签名的应用程序可以共享相同的uid。因此,它们具有一组通用的权限。例如,我可以有请求WRITE_EXTERNAL_STORAGE权限的应用程序A和请求互联网权限的应用程序B。A和B都由相同的证书签名(假设是debug证书)。在A和B的AndroidManifest.xml文件中,android:sharedUserId="test.shared.id"是在<manifest>标记中声明的。则A和B都可以访问网络并写入SD卡,即使它们只声明了所需权限的一部分,因为权限是按uid分配的。当然,这只有在实际安装了A和B的情况下才有效。

下面是一个如何在测试项目中进行设置的示例。应用程序的AndroidManifest.xml:

代码语言:javascript
复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testproject"
    android:versionCode="1"
    android:versionName="1.0"
    android:sharedUserId="com.example.testproject.uid">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name">
        <activity
            android:name="com.example.testproject.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

和测试项目的AndroidManifest.xml

代码语言:javascript
复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.testproject.test"
    android:sharedUserId="com.example.testproject.uid"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <instrumentation
        android:name="android.test.InstrumentationTestRunner"
        android:targetPackage="com.example.testproject" />

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <uses-library android:name="android.test.runner" />
    </application>

</manifest>

这种解决方案的缺点是,当安装了测试包时,应用程序也能够写入外部存储。如果它意外地将某些内容写入到存储中,它可能会一直保持不被注意,直到发布时,包将使用不同的密钥签名。

有关共享UID的一些其他信息可以在http://developer.android.com/guide/topics/security/permissions.html#userid上找到。

票数 38
EN

Stack Overflow用户

发布于 2017-04-11 21:07:46

还有另一个简单的答案。

src/debug/AndroidManifest.xml中设置权限。如果该文件不存在,请创建它。

默认情况下,AndroidTest使用debug作为BuildType,因此如果您在其中定义了测试权限,那么清单合并过程会将这些权限添加到您的UI测试构建中。

这是具有新权限的清单。请注意,我没有包含package属性,因为它将从较低优先级的清单中继承。

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
</manifest>

此外,如果您希望将这些权限应用于debug以外的buildType,则只需将新的AndroidManifest.xml移动到所需的文件夹,并使用以下命令:

代码语言:javascript
复制
android {
   ...
   testBuildType 'release' // or other buildType you might have like 'testUI'
}
票数 13
EN

Stack Overflow用户

发布于 2013-01-07 19:41:38

以编程方式执行此操作,因为生成的Debug类的Debug模式将在这些条件下调试。

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14142857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档