【问题标题】:How can I sign my application with the system signature key?如何使用系统签名密钥签署我的应用程序?
【发布时间】:2010-08-24 13:52:00
【问题描述】:

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

测试运行失败:权限被拒绝: 启动仪器 ComponentInfo{com.jayway.test/android.test.InstrumentationTestRunner} 从 pid=354,uid=354 不允许 因为包 com.jayway.test 确实 没有匹配的签名 目标 com.android.settings

  1. 我能否让它与 Android 模拟器一起工作?
  2. 如果我编译一个 Android 手机镜像,我如何在我的应用程序中使用 Android 系统签名?

【问题讨论】:

    标签: android


    【解决方案1】:

    我遇到了同样的问题.. 有一些权限只有系统应用才能拥有。我试图访问 adb shell dumpsys 来自我的应用程序的命令,权限为 android.permission.DUMP

    解决办法是……

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

    android:sharedUserId="android.uid.system"
    

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

    platform.x509.pem

    平台.pk8

    存在于

    android/build/target/product/security

    从网上下载一个工具,即

    signapk.jar

    从 Eclipse 导出您未签名的 apk。通过右键单击android工具中的项目。 将所有东西,即 keys 、 unsigned apk 和 signapk.jar 保存在一个文件夹中。运行以下命令

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

    未签名的 apk 是您的 apk 的名称,签名的 apk 是您想要的新名称。 在此之后,只需使用命令在手机中安装您签名的应用程序

    adb shell install signed.apk
    

    【讨论】:

    • Nirmit 忘了提到要获得android/build/target/product/security,您必须从here 签出Android 源代码树。
    • 如果您无法检出完整的 android 源代码(例如,您在 Windows 上),您可以检出这个单一存储库: git clone android.googlesource.com/platform/build 。平台文件将在目标/产品/安全下
    • @NirmitSrivastava:一旦应用程序使用系统密钥签名,那么如果我们从 Eclipse 侧加载/远程更新它......在所有这些情况下,应用程序会自动存储在系统/应用程序文件夹中每次?
    • @NirmitSrivastava:另外,在将应用程序设为系统应用程序时,除了清单中的 'android:sharedUserId="android.uid.system"' 之外,我们是否需要在其中指定任何其他权限还是在编译 apk 时的其他任何地方?
    • 您好,我在签名时遇到以下错误。请帮助 java.security.cert.CertificateException:无法解析证书:java.io.IO 异常:空输入
    【解决方案2】:

    从您的应用程序启用 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。这个过程可以通过使用带有猴子工具的自定义脚本来完成。虽然我想使用 Robotium 来验证是否真的找到了接入点。我的主要目标是让这个 Robotium 脚本可以访问 com.android.settings.apk。这将绕过签名不匹配,并让我的 Robotium 脚本控制这个 APK。
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多