如何使用系统签名密钥对我的应用进行签名?

10

我需要创建一个Robotium应用程序,该应用程序将使用设置应用程序从菜单"设置"->"无线和网络"->"Wi-Fi"中打开/关闭WIFI。我找到了一些示例代码在这里,演示了如何只通过apk文件启动应用程序。问题是我的Robotium应用程序应具有与(系统)设置应用程序相同的签名。尝试运行应用程序时,我收到以下错误消息:

测试运行失败:权限拒绝: 从pid=354、uid=354启动工具组件信息 {com.jayway.test/android.test.InstrumentationTestRunner} 不允许, 因为包com.jayway.test没有与目标com.android.settings匹配的签名

  1. 我能否以某种方式在Android模拟器上使其正常工作?
  2. 如果我编译了Android手机镜像,如何将Android系统签名与我的应用程序配合使用?
2个回答

16

我遇到了同样的问题。有些权限只有系统应用程序才能拥有。我试图在具有android.permission.DUMP权限的情况下,从我的应用程序访问adb shell dumpsys命令。

解决方法是...

在您的项目的Android清单文件中,在manifest标签中添加以下行

android:sharedUserId="android.uid.system"

在用于构建二进制文件的代码中,需要存在两个签名密钥。

platform.x509.pem

platform.pk8

它们应位于

android/build/target/product/security

从网络上下载一个工具,例如:

signapk.jar

在Eclipse中通过右键单击Android工具中的项目来导出未签名的apk。将所有东西(包括密钥、未签名的apk和signapk.jar)放入一个文件夹中。运行以下命令:

java -jar signapk.jar platform.x509.pem platform.pk8 unsigned.apk signed.apk

未签名的 APK 是您的 APK 的名称,已签名的 APK 则是您想要的新名称。 之后,只需使用命令在手机上安装您已签名的应用程序即可。

adb install signed.apk

1
Nirmit忘了提到,要获取android/build/target/product/security,您必须从此处检出Android源代码树。 - ChuongPham
2
如果您无法检出完整的 Android 源代码(例如,您使用 Windows),则可以检出此单个存储库:git clone https://android.googlesource.com/platform/build。平台文件将位于target/product/security下。 - Alexey
@NirmitSrivastava:一旦应用程序使用系统密钥签名,那么如果我们从Eclipse /更新远程侧载它...在所有这些情况下,应用程序是否会自动存储在system/apps文件夹中? - Basher51
2
您好,在签名过程中,我遇到了以下错误。请帮忙解决。java.security.cert.CertificateException: 无法解析证书:java.io.IOException: 空输入。 - Utsav Gupta
我在尝试安装按照所述过程签名的apk时,遇到了“INSTALL_FAILED_SHARED_USER_INCOMPATIBLE”错误。在我的情况下,adb shell中没有install命令,因此我使用adb install ...代替adb shell install...。PS.也使用了zipalign。 - Stan
显示剩余3条评论

1

启用应用程序中的WiFi的最佳方法是使用WifiManager

WifiManager wManager = (WifiManager)getSystemService(Context.WIFI_SERVICE);

if(!wManager.isWifiEnabled() && wManager.getWifiState() != WifiManager.WIFI_STATE_ENABLING)
    wManager.setWifiEnabled(true);

注意:您还需要将以下权限添加到您的清单中。
<uses-permission android:name="android.permissions.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permissions.CHANGE_WIFI_STATE" />

我不仅需要打开/关闭WiFi。我需要使用Robotium脚本控制设置应用。实际上,我想模拟用户点击以打开/关闭WiFi。 可以使用带有monkey工具的自定义脚本来完成此过程。虽然我想使用Robotium来验证是否真的找到了访问点。 我的主要目标是使此Robotium脚本能够访问com.android.settings.apk。这将绕过签名不匹配,并使我的Robotium脚本控制此APK。 - Michalis

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