java.lang.SecurityException: 权限拒绝:

8

我使用Instrumentation来测试PhoneApp,通过Instrumentation编写了我的测试应用程序。

我创建了一个apk并将其安装在Nexus One-Android手机上,这一步已经通过了。在我的代码中,我使用了一些不是标准SDK的内部类。我没有在Eclipse中构建它,而是在我的嵌入式环境中构建它。我在一家为Android开发的公司工作,所以我有一个包含所有内部库的Android树。

我在清单文件中使用了适当的权限。

我的apk可能使用了某个签名,但这个签名可能不够好。

现在我通过adb运行测试,立即收到了这个错误:

-------------------------------------------------------------------------------------
INSTRUMENTATION_STATUS: id=ActivityManagerService
INSTRUMENTATION_STATUS: Error=Permission Denial: starting instrumentation ComponentInfo{com.android.phonetests/com.android.phonetests.PhoneInstrumentationTestRunner} from pid=495, uid=495 not allowed because package com.android.phonetests does not have a
 signature matching the target com.android.phone
INSTRUMENTATION_STATUS_CODE: -1
java.
lang.SecurityException: Permission Denial: starting instrumentation ComponentInfo{com.android.phonetests/com.android.phonetests.PhoneInstrumentationTestRunner} from pid=495, uid=495 not allowed because package com.android.phonetests does not have a
signature matching the target com.android.phone
-------------------------------------------------------------------------------------

请帮忙。

9个回答

5

您解决了这个问题吗?当我在设备上安装了使用其他密钥签名的测试apk时,我也会重现此问题。

因此,为了解决问题,请首先使用adb uninstall卸载您的应用程序和测试包的包。

adb uninstall com.android.phone
adb uninstall com.android.phonetests

2

这是一个关于

'签名匹配'

的问题。请确保测试项目的 APK 文件和目标项目的 APK 文件使用相同的证书进行签名。


我在这上面浪费了很多时间 - 我一直在使用调试版本,认为这不可能是问题的原因,因为我的默认 buildType 没有设置 signingConfig。但我错了,因为项目定义了一个 signingConfigs.debug,它被隐式地用作调试的签名配置!非常感谢! - Luke Needham

1
清理您的项目并立即构建。并查看您的AndroidManifest中是否有像这样的意图:

category android:name="android.intent.category.LAUNCHER"

1
错误是因为您正在测试系统权限级别应用程序,要测试的应用程序应位于system/data中,而application_test项目可以安装在data/app中。

1
我认为问题可能是签署您的“主”应用程序和测试应用程序所使用的证书不同。我假设您的测试应用程序将自己定义为主应用程序的测试仪器(instrumentation)。这样做可以使您的测试应用程序在主应用程序的进程中运行,访问其类等,因此出于安全考虑,这两个应用程序必须使用相同的证书进行签名。
该答案来自这个论坛

当我在我们平台上的应用程序(手机设备)上运行时,我不会遇到这样的权限拒绝问题! 只有当我在参考手机上安装和运行我的apk时才会发生这种情况,例如Google的Nexus One或其他任何手机。 我的应用程序测试手机应该在手机上运行。 - ilana

0

遇到了类似的问题,但没有得到任何签名的同意。

使用调试应用程序构建(./gradlew assembleDebug)而不是发布版本可以完全规避这个问题,因为调试应用程序在安装之前不需要签名。


0

这个问题可以通过从模拟器卸载apk文件和测试应用程序来解决。然后使用re-sign.jar重新签名应用程序,然后安装apk并运行测试应用。


0
我通过在Android开发者网站上描述的方法中,添加签名我的测试应用程序的证书来修复了相同的问题:
在Eclipse中:转到Windows>首选项>Android>构建,并在自定义调试密钥库中添加您的应用程序密钥库。
重新构建测试包,然后您就可以愉快地进行测试了。
希望这有所帮助。

0

此解决方案仅适用于系统应用程序

在我的情况下,当我为现有的系统应用程序创建InstrumentationTest用例时(我们正在构建基于AOSP的自己的Android操作系统),就会出现此错误。

我们通常使用mm命令基于Android.mk文件构建apk,在这里关键是LOCAL_CERTIFICATE

在您开发的目标系统应用程序和测试用例项目中查找Android.mk

系统应用程序的Android.mk LOCAL_CERTIFICATE值应与InstrumentationTest用例项目的Android.mk LOCAL_CERTIFICATE值匹配。

祝你好运!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接