支持设备上的ART与预先构建的图像上的ART相比

时间:2014-11-03 14:42:58

标签: android android-runtime

我们在Play商店中有几个应用程序。作为新Lollipop版本的预备测试,我想看看我们的应用程序在哪里。

我采取的第一种方法是使用三星Google Edition S4并告诉它启用并重新启动ART运行时环境(也可在我们的Nexus 5上使用)。这让我了解了一些我可以在Nexus 9发布时正式解决的问题。

然而,然后发布了一个版本,将Lollipop 5.0推向了Nexus 7.推送它给我提供了额外的问题。然而,打印输出似乎仍然与ART有关。如:

11-03 09:22:29.419: E/art(6256): Tried to mark 0xfe80a920 not contained by any spaces
11-03 09:22:29.419: E/art(6256): Attempting see if it's a bad root
11-03 09:22:29.420: A/art(6256): art/runtime/gc/collector/mark_sweep.cc:381] Can't mark invalid object

然后崩溃。

你们是否发现ART的某些特征在与5.0+之间的交互方式与5.0之前的方式之间有不同的交互方式?也许对最近的操作系统有更严格的要求导致这种情况。

我之前没有使用过这些可下载的版本。与未来的实际版本相比,它们是否可靠?

更新

问题已经解决,并且确实有些事情要做,就像从本机代码滥用某些方法调用java对象一样。由于我能够首先解决需要甚至进行这些调用的问题,所以我只是在这个特定的本机代码段中删除了这段代码,而是用Java代替。

在本机代码中似乎没有问题,因为在本机代码之后收到了断点,但显然在某些时候,它会在稍后的某个时间点引起一些未确定的崩溃。也许只是通过设计ART与Dalvik相比如何运作。

1 个答案:

答案 0 :(得分:0)

如果您使用本机C / C#代码检查是否使用GetArrayElements和ReleaseArrayElements并将其替换为:GetArrayRegion:

  

GetArrayElements和。之类的调用还有另一种选择   GetStringChars,当你想要做的就是非常有用   复制数据进出。请考虑以下事项:

jbyte* data = env->GetByteArrayElements(array, NULL);
if (data != NULL) {
    memcpy(buffer, data, len);
    env->ReleaseByteArrayElements(array, data, JNI_ABORT);
} This grabs the array, copies the first len byte elements out of it, and then releases the array. Depending upon the implementation,
     

Get调用将固定或复制数组内容。代码   复制数据(可能是第二次),然后调用Release;在   这种情况JNI_ABORT确保没有第三份副本的可能性。

     

人们可以更简单地完成同样的事情:

env->GetByteArrayRegion(array, 0, len, buffer); This has several advantages:
     

需要一个JNI调用而不是2个,从而减少了开销。不需要   固定或额外的数据副本。降低程序员错误的风险 -   在事情失败后没有忘记调用Release的风险。   同样,您可以使用SetArrayRegion调用将数据复制到   一个数组,以及GetStringRegion或GetStringUTFRegion来复制字符   一个字符串。

更多信息: http://developer.android.com/training/articles/perf-jni.html#region_calls