如何调试签名发布的APK?


113

我有一个APK,已签名并上传到Android Market,并安装在手机上。我想在手机上运行此发行版apk(借助Eclipse)时进行调试。我之前已经做过此事(并记得使用Android开发工具之一;也许是Dalvik Debug Monitor),但不幸的是,我不记得该怎么做,也无法在线找到任何文章。有谁知道该怎么做?

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


您目前正在尝试什么?您不知道如何在Eclipse中使用设备视图吗?
山姆·多佐

现在,我在Eclipse中显示了Devices视图。我可以在“设备”列表中看到我的设备。我单击它,但是尽管在电话上运行了该应用程序,并且在工作区中存在并打开了源项目,但“调试所选过程”按钮仍被禁用。有任何想法吗?!
阿迪尔·侯赛因

您是否单击应用程序的软件包名称?
山姆·多佐

是。查看答案中的评论。(感谢帮助。感谢
Adil Hussain 2012年

Answers:


76

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

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

我进入第8步,但是由于某些原因,当我运行签名/发布的apk时,我的应用程序的包名称没有显示。(奇怪的是,它确实显示了我是直接从Eclipse在手机上运行应用程序(调试apk)的。)困惑……
Adil Hussain

2
得到它了!我已经将android:debuggable="true"属性放在了manifest标签中,而不是application清单中的标签中!!我的坏人:(非常感谢Sam_D的指导。没有您,您将无法做到,否则充其量是很长的时间!
Adil Hussain 2012年

当我在build.gradle中添加debuggable关键字并希望在游戏商店中发布时,它显示此错误You uploaded a debuggable APK. For security reasons you need to disable debugging before it can be published in Google Play.
hasnain_ahmad

1
这个答案已经过时了。而不是androidManifest.xml您应该更新build.gradle。查看其他答案。
Antimonit

@hasnain_ahmad您能为此找到解决方案吗?
Shashank Saxena

125

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

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

这条线debuggable true对我来说是诀窍。

更新:

从gradle 1.0开始,它minifyEnabled不是runProguard。看这里


5
请注意,从gradle 1.0开始,它是minifyEnabled而不是runProguard-请参阅tools.android.com/tech-docs/new-build-system/migrating-to-1-0-0
m02ph3u5 2015年

作为当前答案的注释,我本人将避免将可调试的版本发送到Google Play商店,并且可能不会像hasnain_ahmad的情况那样使您过时。只是临时地测试商店中发布的版本下载问题(如inapp购买代码跟踪),风险会降低。您也可以尝试使用Beta轨道(我不知道这是否会产生与hasnian相同的错误),或者将发行版本的apk从计算机转移到您的手机上,以避免安全问题(处理捆绑软件比较麻烦)。
Androidcoder

40

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

在Android Studio稳定版中,您必须applicationAndroidManifest文件中添加以下两行:

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

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

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


@jaibatrik它必须是您的apk,并且您必须从源代码中附加调试器。如果您同时执行两项操作,但仍然无法使用,请分享更多信息,我可能会尝试提供帮助
sandalone

2
我收到“ [致命错误]:7:203:与元素类型“应用程序”相关联的属性“ tools:ignore”的前缀“ tools”未绑定。” tools:ignore =“ HardcodedDebugMode”是这里的合法配置吗?
JD

1
我必须添加lintOptions { abortOnError false }到我的app / build.grade中而不是tools:ignore像这样使用: android { lintOptions: { abortOnError false } }
YoshiJaeger

我知道了The prefix "tools" for attribute "tools:ignore" associated with an element type "application" is not bound.
奥利弗·D

9

我尝试了以下方法,并且有效:

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

三年前,Manuel Lopera已在此主题中给出了这个答案!看到这里:stackoverflow.com/a/27181562/1071320
Adil Hussain

@AdilHussain但是我尝试了这个答案,但它对我没有用。看到我在minifyEnabled false上的答案有所不同,这就是runProguard true他的情况。请看到的变化
Shylendra Madda

没什么大不了,但是他的回答确实包含了这种效果的更新。无论如何。没什么大不了的。感谢你的回答。
阿迪尔·侯赛因

9

将以下内容添加到您的应用程序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'
        }
    }

5

如果您决定调试已经上市但尚未分配为可调试 apk,并且您不想再次发布它。因此,请按照以下步骤操作;

  1. 使用ApkTool反编译Apk (例如apktool d <APK_PATH>
  2. 从反编译的文件中打开AndroidManifest.xml
  3. 设置android:debuggable="true"application标签
  4. 使用ApkTool编译修改后的源代码(例如apktool b <MODIFIED_PATH>
  5. 可调试的APK就绪(未签名意味着无法发布存储)。您可以根据需要进行调试。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.