编译后将Android应用程序设置为可调试

编译后将Android应用程序设置为可调试,android,debugging,Android,Debugging,这可能是一个完全的“否”,但我想知道在应用程序被签名并编译成apk后,是否有可能使其可调试 我希望能够在我的服务器上生成一个随机密钥,然后使用该密钥将我发布的应用程序置于可调试状态 //Build a hidden back door to request the randomly generated key on my server //Input this key into an edittext box of some sort. //Check this key against the

这可能是一个完全的“否”,但我想知道在应用程序被签名并编译成apk后,是否有可能使其可调试

我希望能够在我的服务器上生成一个随机密钥,然后使用该密钥将我发布的应用程序置于可调试状态

//Build a hidden back door to request the randomly generated key on my server
//Input this key into an edittext box of some sort.
//Check this key against the server
//If key validates, put application in debuggable state.

我意识到这样做会带来潜在的安全风险,但我只是想知道这是否有可能。

查看开发人员站点,我看到通过调用
getApplicationInfo().flags来自给定上下文
flags
不是
final
,因此它显示为
getApplicationInfo.flags |=FLAG|u可调试
允许您在运行时启用调试:参考
ApplicationInfo
doc:


请注意,我还没有测试过这一点(目前还没有通过android环境)

如果您愿意重新签名并重新安装,那么从不可调试的APK生成可调试的APK是相当简单的,但是您无法对已安装的实例执行此操作

根据可调试/不可调试状态,实际代码中行为不同的任何东西也可以像Brent所建议的那样考虑其他东西,但这是有限的,因为大多数调试功能都内置在Android中,而不是应用程序代码的一部分

不过,您可能能够为调试功能提供与标志相关的备选方案。例如,您可以提供将私有文件复制到公共存储的功能。如果您真的愿意,您可以在服务器中烘焙,该服务器将提供一个作为应用程序UID运行的shell。但是,要让一个实际的JDWP调试器运行,可能需要极端的、依赖于android构建的黑客技术,因为您可能需要提供许多系统代码的自己版本

简单地说,让您的程序通过记录大量通常被抑制的内部细节来改变其行为是非常简单的


一定要花些时间考虑一下对用户的安全影响。

您对此有什么特别的使用案例吗?我不想陈述实际的特别使用案例,因为它可能会暴露安全风险,但我基本上希望能够调试一些无法在开发环境中复制的用例。可能不太有效,因为这只会覆盖该表达式的结果,并且不会对Android本身及其应用程序启动代码中的可调试状态的其他测试产生影响。即使flags类成员不是final,也会检查其外观的文档,FLAG_DEBUGGABLE成员是静态和最终的,因此在运行时更改它似乎是不可能的。@dell116,FLAG_DEBUGGABLE是静态和最终的,因为它是一个常量。applicationInfo的flags字段本质上是一个位掩码,FLAG_DEBUGGABLE只是该掩码中相应的位。即FLAG_DEBUGGABLE只是包含可调试位的位置,而不是位本身。这也是一个问题,但这并不是无法工作的真正原因。尝试执行您建议的操作,您会发现您甚至还没有成功地更改通过后续调用getApplicationInfo()检索到的标志的结果。您检索的应用程序信息只是一个副本,它不是Android行为所依据的实际信息。