【问题标题】:How to debug apk signed for release?如何调试签署发布的apk?
【发布时间】:2012-02-23 07:26:21
【问题描述】:

我有一个已签名并上传到 Android Market 并安装在手机上的 apk。我想在我的手机上运行这个版本的 apk(通过 Eclipse)来调试它。我以前做过这个(并且记得它是使用其中一个 Android 开发工具;也许是 Dalvik 调试监视器)但不幸的是不记得如何去做,并且无法在网上找到任何文章。有谁知道如何做到这一点?

注意:在清单中设置了android:debuggable="true",并在我的手机上启用了USB调试。

【问题讨论】:

  • 您目前正在尝试什么?不知道如何在 Eclipse 中使用设备视图?
  • 我现在在 Eclipse 中显示了 Devices 视图。我可以在设备列表中看到我的设备。我单击它,但尽管应用程序在手机上运行并且源项目存在并在工作区中打开,但“调试所选进程”按钮被禁用。有什么想法吗?!
  • 你是在点击你应用的包名吗?
  • 是的。请参阅您的答案中的评论。 (顺便说一句,感谢您的帮助。感谢它。)

标签: android google-play


【解决方案1】:

我知道这是一个老问题,但未来的参考。在带有 Gradle 的 Android Studio 中:

buildTypes {
    release {
        debuggable true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
}

debuggable true 这行是我的诀窍。

在 Gradle 1.0 之前它是 runProguard 而不是 minifyEnabled。看here

【讨论】:

  • 请注意,从 gradle 1.0 开始,它是 minifyEnabled 而不是 runProguard - 请参阅 tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0
  • 作为对当前答案的说明,我本人会避免向 Google Play 商店发送可调试版本,并且它可能不会像以前过时的答案中的 hasnain_ahmad 那样让您这样做。只是临时测试一个从商店下载的发布问题,比如应用内购买代码跟踪,风险会更小。您也可以尝试使用 beta 轨道(我不知道这是否会出现与 hasian 相同的错误)或将发布构建 apk 从您的计算机传输到您的手机以避免安全问题(处理捆绑包更麻烦)。
【解决方案2】:

确保在清单文件的application 标记中设置了android:debuggable="true",然后:

  1. 将手机插入电脑并在手机上启用 USB 调试
  2. 打开 eclipse 和一个包含应用代码的工作区
  3. 在 Eclipse 中,转到 Window->Show View->Devices
  4. 查看现在应该可见的设备视图,您应该会看到列出的设备
  5. 如果您的设备未列出,您必须先找到手机的 ADB 驱动程序,然后再继续
  6. 如果要单步执行代码,请在应用中的某处设置断点
  7. 在手机上打开应用
  8. 在“设备”视图中,展开您手机的条目(如果尚未展开),然后查找您的应用程序包名称。
  9. 单击包名称,在设备视图的右上角,您应该会看到一个绿色错误以及许多其他小按钮。点击绿色错误。
  10. 您现在应该附加/调试您的应用程序。

【讨论】:

  • 我到了第 8 步,但由于某种原因,当我运行签名/发布 apk 时,我的应用程序包名称没有显示。 (奇怪的是,当我直接从 Eclipse 在我的手机上运行应用程序(调试 apk)时,它确实显示出来了。)困惑...
  • 知道了!我已将android:debuggable="true" 属性放在manifest 标记中,而不是清单中的application 标记!!我的错 :( 非常感谢 Sam_D 的指导。没有你就不会这样做,或者充其量会花很长时间!
  • 当我在 build.gradle 中添加 debuggable 关键字并希望在 Play 商店中发布时,它会显示此错误 You uploaded a debuggable APK. For security reasons you need to disable debugging before it can be published in Google Play.
  • 这个答案已经过时了。你应该更新build.gradle,而不是androidManifest.xml。查看其他答案。
  • @hasnain_ahmad 你能找到解决方案吗?
【解决方案3】:

除了 Manuel 的方式,你仍然可以使用 Manifest。

在 Android Studio stable 中,您必须在 AndroidManifest 文件中的 application 中添加以下 2 行:

    android:debuggable="true"
    tools:ignore="HardcodedDebugMode"

第一个将启用已签名 APK 的调试,第二个将防止编译时错误。

之后,您可以通过“将调试器附加到 Android 进程”按钮附加到该进程。

【讨论】:

  • @jaibatrik 它必须是您的 apk,并且您必须从源附加调试器。如果你同时做这两个,但它仍然不起作用,分享更多信息,我可能会尝试帮助
  • 我收到“[致命错误]:7:203: 与元素类型“应用程序”关联的属性“工具:忽略”的前缀“工具”未绑定。” tools:ignore="HardcodedDebugMode" 这里是合法的配置吗?
  • 我必须将 lintOptions { abortOnError false } 添加到我的 app/build.grade 中,而不是像这样使用 tools:ignoreandroid { lintOptions: { abortOnError false } }
  • 我得到了The prefix "tools" for attribute "tools:ignore" associated with an element type "application" is not bound.
【解决方案4】:

我尝试了以下方法并且成功了:

release {
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }

【讨论】:

  • 这个答案已经由 Manuel Lopera 在这个帖子中给出......三年前!见这里:*.com/a/27181562/1071320
  • @AdilHussain 但我试过这个答案对我不起作用。看到我在 `minifyEnabled false` 的回答有所不同,在他的情况下是runProguard true。请查看更改
  • 没什么大不了的,但他的回答确实包含对此效果的更新。反正。没什么大不了的。感谢您的回答。
【解决方案5】:

将以下内容添加到您的应用 build.gradle 并选择指定的发布版本构建变体并运行

signingConfigs {
        config {
            keyAlias 'keyalias'
            keyPassword 'keypwd'
            storeFile file('<<KEYSTORE-PATH>>.keystore')
            storePassword 'pwd'
        }
    }
    buildTypes {
      release {
          debuggable true
          signingConfig signingConfigs.config
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }

【讨论】:

    【解决方案6】:

    如果您决定调试 您的 apk,它已经在市场上但未指定为可调试并且您不想再次发布它。所以请按照以下步骤操作;

    1. 使用ApkTool(例如apktool d &lt;APK_PATH&gt;)反编译Apk
    2. 从反编译文件中打开 AndroidManifest.xml
    3. application标签中设置android:debuggable="true"
    4. 使用 ApkTool 编译修改后的源代码(例如apktool b &lt;MODIFIED_PATH&gt;
    5. 可调试的 apk 准备就绪(未签名表示无法发布存储)。您可以根据需要进行调试。

    【讨论】: