问题标签 [android-runtime]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
976 浏览

android - 应用程序在 odex 中编译而不是 oat

正如 Google 提到的 ART 运行时 (AOT) 应用程序将以 oat 格式/完全以本机代码编译。

检查 Nexus 6P 设备和系统应用程序有 oat 文件夹,但存在 odex 文件。我期待类似于 boot.oat 的相应 oat 文件据我所知,odex 只是 dalvik 使用 dexopt 工具时使用的优​​化 dex。

ART 应该在安装过程中使用 dex2oat,然后为什么要存储 odex 文件。

有人可以提供有关此行为的解释吗?

谢谢, 维奈

0 投票
2 回答
2135 浏览

java - 如何在 Android 运行时 (ART) 上启用语言级别的断言?

我有一个正在开发的 Pixel-C。我的最低 API 级别是 21,这也是 ART 取代 Dalvik 的级别。我已经尝试了两个:

他们似乎执行成功。我已放置

在我的 onStart 中,我在 logcat 中没有看到任何堆栈跟踪。我希望应用程序在安装并运行后立即退出。请告诉我如何让这个断言执行。

请不要提及 JUnit 或其他进行断言的方式,也不要提及任何需要显式抛出错误的解决方案。生产代码不应该抛出错误,也不应该试图捕捉和处理它们。这就是为什么将断言添加到语言中的原因,以便有一种方法可以在测试环境中违反不变量时导致应用程序崩溃,而不会在生产中产生任何开销或风险。

这个有 6 年历史的问题基本相同,但是对于 Dalvik(IE 已过时),解决方案要么不起作用要么不好: 我可以在 Android 设备上使用断言吗?

0 投票
2 回答
1473 浏览

android - Android棉花糖权限?

我想在用户可以接受该权限访问的地方显示权限提示,就像我想访问用户联系人一样,我想用两个选项显示提示,允许和拒绝任何示例和源代码。

0 投票
2 回答
7586 浏览

java - JVM 与 Dalvik 和/或 ART 究竟有何不同?

首先,我认为我可能对这个问题的标题不好,但我想不出合适的词,所以请随时提出修改建议,我会做的,这样这个问题就更有教育意义,并且与其他人相关。

我知道 javax.Swing 根本不能用于 Android 项目,我已经接受了这一点并学习了基于 Android XML 的 UI 设计,但出于好奇,我想知道确切的原因

我意识到手机的屏幕尺寸可能是 Swing 不能很好处理的,但是阻止开发人员简单地导入 javax.Swing 包(除了 Android Studio 根本不让它发生)变形和丑陋的 Swing 窗口可能出现在 Android 设备屏幕上?我也意识到 AWT 和 SWT 也必须被导入,但同样的问题也适用于这些包。

我认为我对此缺乏了解可能真的源于对 Java 虚拟机和 Android 等价物的理解缺乏了解(Dalvik 是否仍在使用,或者他们是否已将冷火鸡转换为 ART?)。

与往常一样,非常感谢您提供的有关该主题的任何信息或阅读材料。我真的很想了解更多关于 JVM、Dalvik 和 ART 工作原理的基础知识。

0 投票
2 回答
1956 浏览

android - Android:罕见且不可重现的 ClassNotFoundException

我有一个已发布的应用程序,该应用程序从用户那里获取有关ClassNotFoundException我超出我的智慧试图修复的报告。我无法在 SO 上重现此崩溃和此错误的类似实例,要么是依赖路径不正确,要么是MainActivity清单中的包不同。

依赖项路径错误的问题是 Eclipse 的问题,而所有其他错误都可以通过 Android Studio 的“同步”和“清理项目”轻松修复(我这样做无济于事)。

我已经三重检查了所有包名称,没有发现任何差异。

这是我的清单:

这是我总是从用户那里得到的错误报告:

罪魁祸首似乎是java.io.IOException: Failed to remove obsolete file from /data/dalvik-cache/arm/data@app@com.johan.fsc-1@base.apk@classes.dex when searching for dex file /data/app/com.johan.fsc-1/base.apk: Permission denied,但我还没有找到为什么它被某些用户而不是大多数用户调用,更重要的是 - 如何修复它。

0 投票
2 回答
301 浏览

java - 在 Android 上调用方法的成本

我创建了一个只在一个地方调用的方法——onBindViewHolder()在 RecyclerView 中。它是代码的逻辑单元,我认为将代码块提取到方法中可以提高可读性。但是,在代码审查期间,我被告知方法调用很昂贵,因此会对性能产生负面影响,并且我应该内联代码而不是将其放在单独的方法中。

我认为 JVM 或编译器会通过内联该方法来优化此代码,但我不确定 Android 上是否是这种情况。我还没有真正找到任何关于新的 ART JVM 做了什么样的优化的具体信息。

在 Android 上调用一个方法是否如此昂贵,以至于我应该在可能多次调用该方法的地方以可读性为代价避免它?此外,由于 DEX 方法的限制,创建这样的一次性方法是否令人不快?(这个应用程序已经在使用 multidex)。

这个问题与其他类似的 java 问题没有重复,因为我专门询问 Android 上的性能,它有自己的特质。

0 投票
0 回答
1525 浏览

android - 是否可以使用 Frida 框架在 Android ART 中跟踪 Java API 调用?

我可以使用此代码非常轻松地跟踪 JNI API

当我尝试使用以下代码跟踪 java 函数时,没有任何返回

来自弗里达网站

Frida 目前支持 Dalvik,虽然大部分代码只是与 VM 实现的 JNI API 交互,但有些位是 VM 特定的

0 投票
1 回答
5426 浏览

java - Android FinalizerDaemon 挂了

我在 Android 应用程序中遇到了一个非常奇怪的问题。在某个点之后(大约在主要活动开始并显示片段时),FinalizerDaemon 停止处理对象并且垃圾不断堆积。查看线程转储,它似乎卡在ReferenceQueue.remove()

然而队列不是空的。如果我在使用应用程序一段时间后转储堆,则队列实际上有数千个条目。数据结构看起来也没有损坏: 显示非空 ReferenceQueue 的 FinalizerDaemon 实例

在分配和垃圾收集更多之后再次转储表明队列的头部与之前的 Matrix 实例相同。

现在,我注意到了这一点,因为我保留了一些需要在某个时候释放的 C++ 对象。虽然我怀疑终结器调用 JNI 函数并在 C++ 端做一些愚蠢的事情可能会以某种方式破坏它,但我所有的日志都表明所有终结器都运行良好并且没有抛出任何东西就返回,直到它们随机停止被调用。此外,finalize 调用实际上不可能破坏守护程序,除非对整个应用程序进行段错误或其他内容,因为 Watchdog 应该处理运行时间过长并引发异常的终结器。

我尝试了一个显式的System.runFinalization()方法,它所做的只是永远挂起主线程,等待永远不会运行的守护进程。

知道这怎么会发生吗?

0 投票
2 回答
8696 浏览

android - Android - 暂停所有线程占用:* ms

即使在我离开应用程序一段时间后,我的 logcat 中也会出现这些警告。(虽然没有杀,只是按回来离开它。)

这些数字很严重,而且很多。

我看到了一些关于这个问题的问题,但没有一个问题与我的相似,我不能接受“除非你没有 OOM 或冻结问题,否则忽略它”如果这可能导致,我不能等到它碰巧做一些事情它。

我只需要知道导致这种情况的原因以及如何防止这种情况发生。

我使用 Retrofit 来完成我的网络服务请求。还有一个 ThreadPoolExecutor 在等待请求完成时从缓存中获取/更新/删除数据。我认为这些都不会导致这种情况。

感谢您提供有关这种情况的任何想法或一般信息,因为我没有发现有关此“暂停所有线程”警告的任何具体信息。

0 投票
2 回答
5893 浏览

android - Art: Verification of X took Y ms

I've got a warning in my logcat:

Here's the code:

220ms is quite a lot (and I feel like I'm noticing a lag on startup of that Fragment).

I'm using RxJava and retrolambda, but this is not the only spot where this message pops up so I don't think it's directly related.

How can I influence the verification time? Is it even worth it?

It seems like it has something to do with cyclomatic complexity, since I could get rid of the waring by removing the Snackbar.make calls in the if with some more dry code: