Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java &引用;“可调试错误”;是否足以阻止调试我的应用程序?_Java_Android_Debugging - Fatal编程技术网

Java &引用;“可调试错误”;是否足以阻止调试我的应用程序?

Java &引用;“可调试错误”;是否足以阻止调试我的应用程序?,java,android,debugging,Java,Android,Debugging,我看到许多用户在发布版本中使用属性debugable false: release { debuggable false ... } 这也是官方文件中建议的,所以我认为这是一种安全措施,或者至少是一种避免逆向工程和/或应用程序数据盗窃的方法 但是,这足以阻止调试我的应用程序吗 我已经用Google和in-Stack Overflow进行了搜索,但我只找到了关于该属性的信息 对于“调试”,我不是说“反向工程”完成了对应用程序行为的观察,而是通过将应用程序连接到另一个程序/软件来调

我看到许多用户在发布版本中使用属性
debugable false

release {
    debuggable false
    ...
}
这也是官方文件中建议的,所以我认为这是一种安全措施,或者至少是一种避免逆向工程和/或应用程序数据盗窃的方法

但是,这足以阻止调试我的应用程序吗

我已经用Google和in-Stack Overflow进行了搜索,但我只找到了关于该属性的信息

对于“调试”,我不是说“反向工程”完成了对应用程序行为的观察,而是通过将应用程序连接到另一个程序/软件来调试应用程序,以获取有关它的信息,例如Android Studio调试器

我在Ubuntu Linux机器上使用最新版本的Android Studio,使用的是
Java


非常感谢

清单中的
debugable
设置告诉运行中的系统,应用程序可能连接了调试器。对于基于Java/Kotlin的应用程序(例如,任何第三方Android应用程序),这会导致系统启动一个内部线程,允许调试器附加到进程。这与传统的Java应用程序调试是一致的。事实上,您可以将任何符合JDWP的调试器(例如
jdp
)附加到进程。如果没有此设置,进程将不会有调试线程侦听端口,因此无法连接JDWP调试器。这与附加
gdb
并在可执行映像中内置符号不同。Android应用程序不是典型的可执行程序


在典型的Linux系统上,像gdb这样的东西可以“连接”到任何正在运行的进程。不过,易用性将根据是否在映像中内置调试符号而有所不同。但是,在Android上,系统安全性将阻止shell进程附加到使用
gdb
的任何进程,除非它是开发系统或已根目录的系统。

清单中的
可调试
设置告诉运行中的系统,应用程序可能附加了调试器。对于基于Java/Kotlin的应用程序(例如,任何第三方Android应用程序),这会导致系统启动一个内部线程,允许调试器附加到进程。这与传统的Java应用程序调试是一致的。事实上,您可以将任何符合JDWP的调试器(例如
jdp
)附加到进程。如果没有此设置,进程将不会有调试线程侦听端口,因此无法连接JDWP调试器。这与附加
gdb
并在可执行映像中内置符号不同。Android应用程序不是典型的可执行程序


在典型的Linux系统上,像gdb这样的东西可以“连接”到任何正在运行的进程。不过,易用性将根据是否在映像中内置调试符号而有所不同。但是,在Android上,系统安全性将阻止shell进程附加到使用
gdb
的任何进程,除非它是一个开发系统或已根目录的系统。

定义“调试”。一般来说:不,没有什么可以阻止感兴趣的工程师调试你的应用程序,这只会使调试变得更加困难。更重要的是,没有用实际代码打包调试信息。文件名和行号。@luk2302对于“调试”,我不是指“反向工程”,而是通过将应用程序连接到另一个程序/软件来调试应用程序,以获取有关它的信息。@JoopEggen我已经在发布版本中设置了
缩小为true
,并从源Java代码中删除了所有
日志
调用。定义“调试”。一般来说:不,没有什么可以阻止感兴趣的工程师调试你的应用程序,这只会使调试变得更加困难。更重要的是,没有用实际代码打包调试信息。文件名和行号。@luk2302对于“调试”,我不是指“反向工程”,而是通过将应用程序连接到另一个程序/软件来调试应用程序,以获取有关它的信息。@JoopEggen我已经在发布版本中设置了
minified true
,并从源Java代码中删除了所有
Log
调用。谢谢您的回复,为什么要谈论清单中的
可调试
集?我在relase设置内的gradle文件中发布了该属性的示例,也许这些设置相同?感谢您,因为gradle文件中的
debugable
设置最终用于在应用程序的APK中包含(以编译形式)的
AndroidManifest.xml
中生成设置。gradle文件中还设置了自动注入清单文件的其他内容,例如
应用程序ID
。您可以在树的
app/build
目录中找到最终绑定到APK中的“合并”清单,例如
app/build/intermediates/merged\u manifests//AndroidManifest.xml
。请参阅本页了解更多详细信息:根据您所说的,我可以理解,总有一种方法可以将我的应用程序进程附加到“调试器”或类似软件。那么,我可以在应用程序的Java代码中做些什么来发现应用程序是否被调试过,如果是的话,通过终止我的应用程序进程来做出反应吗?不,这根本不是我要说的。当应用程序被标记为可调试时,系统会在应用程序进程内创建一个线程,Java调试器可以连接到该线程并控制该进程。如果未启用
debugable
设置,将不会有符合JDWP的方式将调试器连接到应用程序。要使用本机级别的调试器,例如
gdb
,需要一个有根的Android设备或开发系统(例如自定义ROM),并且它通过在过程中挂接低级信号处理程序来工作。感谢您的回复,为什么您要谈论清单中设置的
可调试器
?我在relase设置内的gradle文件中发布了该属性的示例,也许这些设置相同?感谢您,因为
可调试设置