我如何才能为我的UItesting项目添加额外的Android权限?

我尝试从InstrumentationTestCase2派生的testing用例中将文件写入外部SD卡,以进行纯粹的testing。 如果在testing的应用程序的AndroidManifest.xml文件中configuration了android.permission.WRITE_EXTERNAL_STORAGE ,但是在testing项目的AndroidManifest.xml文件中只存在此设置,则此function无效。

当然,我不想把这个权限添加到主清单中,因为我在functiontesting期间只需要这个function。 我怎样才能做到这一点?

Solutions Collecting From Web of "我如何才能为我的UItesting项目添加额外的Android权限?"

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

这个解决方法来自事实上,Android实际上分配权限到Linux用户帐户(uids),而不是应用程序本身(默认情况下,每个应用程序获取自己的uid,因此它看起来像权限是每个应用程序设置)。

但是使用相同证书签名的申请可以共享同一个uid。 因此,他们有一套共同的权限。 例如,我可以使用请求WRITE_EXTERNAL_STORAGE权限的应用程序A和请求INTERNET权限的应用程序B. A和B都由相同的证书签名(比方说debugging一个)。 在A和B的AndroidManifest.xml文件中android:sharedUserId="test.shared.id"<manifest>标签中声明。 然后,A和B都可以访问networking,并写入SD卡,即使他们只声明所需的权限的一部分,因为权限是每uid分配的。 当然,这只有在A和B都实际安装的情况下才有效。

这里是一个如何设置testing项目的例子。 适用于应用程序的AndroidManifest.xml:

 <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> 

和一个testing项目的AndroidManifest.xml

 <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> 

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

有关共享UID的其他信息可以在http://developer.android.com/guide/topics/security/permissions.html#useridfind&#x3002;

还有一个简单的答案。

将权限设置为src / debug / AndroidManifest.xml(如果不存在,创build它)

默认情况下,AndroidTest使用debug作为BuildType。 那为什么你在debug buildType中定义这些权限。 感谢合并过程,将这些权限添加到您的UItesting版本。 这里是具有新权限的Manifest(注意,我没有包括package属性,因为它将从较低优先级的清单inheritance)

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> </manifest> 

执行程序,因为生成的Debug类的Debug模式将在这些条件下进行debugging。