在Android中编译java文件后的注释会发生啥?
Posted
技术标签:
【中文标题】在Android中编译java文件后的注释会发生啥?【英文标题】:What happens to comments after the java files are compiled in Android?在Android中编译java文件后的注释会发生什么? 【发布时间】:2012-05-23 13:49:12 【问题描述】:android 编译器是如何工作的?编译时是否会移除 Java 代码和 Android XML 文件中的 cmets?
【问题讨论】:
cmets 被编译器忽略,不在生成的字节码或机器码中 【参考方案1】:Java 文件中的注释在编译成类文件时会被删除或忽略。类文件不是供人类阅读的——它们经过优化以在虚拟机上高效运行。如果要保留 cmets,它们只会导致类文件大于所需的大小,并且没有额外的好处(即编译器和虚拟机不理解 cmets,所以为什么要包含它们)
对于 XML 文件,通常会保留 cmets。编译后的类文件只有一个用途(在虚拟机上运行),而 XML 文件可以用于多种用途。例如,您可以将 XML 文件加载到应用程序中并对其进行操作。根据应用程序中 XML 文件的使用情况,可能需要将 cmets 保留在其中 - 事实上,您的应用程序可能专门寻找 cmets。由于 XML 文件的用途广泛,因此不会从 XML 文件中删除 cmets,以防它们被用于其他目的。
【讨论】:
谢谢!知道了。 :) 出于安全目的,也许我需要在导出应用程序之前删除 XML 上的一些 cmets。 如果您担心安全隐患,我绝对建议您从 XML 中删除 cmets。如果您有很多 cmets,它还会导致应用程序运行稍慢,因为它在读取 XML 文件时必须跳过所有 cmets。值得记住的是,XML 文件是故意设计成人类可读的 :-) 实际上,如果您指的是 R 中的 XML 布局。那么它们也会被剥离 cmets 并编译成高度优化的视图对象。因此,您甚至不需要从 XML 中删除 cmets。 @Ancantus 视图对象究竟发生了哪些优化? @dacongy 我不知道执行的确切优化。它被映射到一个二进制 .xml 文件,如果你解压 APK 文件就可以查看该文件。更多信息可以在这里找到:***.com/questions/8760841/…【参考方案2】:文件的字节码/.class 版本中不存在注释。编译时编译器会忽略cmets。
编译器的工作方式是将所有高级语言代码转换为机器可理解的代码..一次全部..不像解释器那样逐行.. 对于 Android .. 编译器将 .java 源文件转换为其字节码/.class 文件..然后将其转换为 .dex 文件(Dalvik 可执行文件).. Android 中的所有应用程序都在名为 Dalvik Virtual 的虚拟机上运行需要.dex文件的机器..
尝试使用任何存档器打开一个像 zip 一样的 apk 文件..您会在其中看到 classes.dex 文件..
就 xml 文件而言 .. 仅当您在屏幕上显示某些内容(即正在呈现的 Activity)时,应用程序才会使用它们..所以在显示 Activity 时..其对应的 xml 文件用于构建UI..这个过程称为inflating!
编辑:[但我现在记得的一点是……Android 手机中存在的系统应用程序……例如所有 Google 提供的应用程序(Gmail、地图等)……联系人、Phone.apk等等..所有这些都是系统apks..存在于/system/app/目录中..它们可能包含也可能不包含.dex文件..
如果它们在 apk 文件中包含 .dex(就像我们开发的任何普通应用程序一样)..那么 ROM 被称为 de-odexed ROM(Android 操作系统的固件).. 但这反过来会导致速度变慢由于将所有 .dex 文件从系统 .apk 文件复制到 dalvik 缓存,因此在第一次安装 ROM 时启动。因为系统启动/启动时需要系统 apk 的所有 .dex 文件。。
但是如果 ROM 是 odexed .. 系统 .apk 的所有 .dex 文件都不存在于 .apk 中,而是作为 /system/app/ 目录中的单独文件 .. 扩展名为 .odex
对于你和我开发的所有应用程序(非系统应用程序)..只是 Play 商店的应用程序..那些确实包含 .apk 内的 .dex ]
编辑:我知道它与工作或问题没有太大关系.. 但只是想提一下 .dex 文件在 sys 和非 sys 应用程序中的位置差异! :)
希望对您有所帮助! :)
【讨论】:
谢谢,RiASH! XML 上的 cmets 怎么样?它们是否也在编译时被删除? 通常会保留xml文件中的注释!以上是关于在Android中编译java文件后的注释会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章