Process.getExclusiveCores()在某些设备上抛出异常

时间:2018-02-16 13:10:27

标签: android performance crash runtimeexception audio-processing

我的Android应用程序目前处于公测阶段,我收到了我心爱的测试人员的崩溃报告。音频处理是应用程序的主要关注点,因此渲染线程是CPU密集型和时间敏感型。为了尽可能获得最佳性能,我通过调用以下方法为该过程保留独占核心:

int exclusiveCores[] = {};

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        exclusiveCores = android.os.Process.getExclusiveCores();
}

然后通过JNI发送int数组以由引擎处理。

直到最近,我收到崩溃报告,说明在getExclusiveCores()调用中抛出了RuntimeException,这一直工作正常。该设备是运行Android 7.0的三星J7(SM-J727T)。这是迄今为止唯一给我这份报告的设备。

还有其他人遇到过此问题吗?此API不适用于此特定设备吗?在调用getExclusiveCores之前,我应该检查另一个限制吗?

文档说明:

  

支持设备上的独占核心:

     

启用cpusets并配置仅包含顶级前台应用程序的cpuset。

     

确保为此cpuset中的线程保留一个核心(这是独占核心)。

但我无法找到有关如何启用cpusets和配置cpuset的任何其他文档。

任何人都可以提供此实施的示例或指出我正确的方向吗?

此外,我个人没有这个设备,Firebase Testlab没有运行Android 7.0的设备,因此测试任何解决方案都会有其自身的复杂性。

由于

1 个答案:

答案 0 :(得分:0)

我也在运行Android 7.0的三星Galaxy S6上遇到了这个问题。

不幸的是,看起来getExclusiveCores尚未在某些设备上实现(尽管是Android CDD中指定的强制性API)。

最好的建议是将对此方法的调用包装在try / catch块中并捕获RuntimeException

try {
    exclusiveCores = android.os.Process.getExclusiveCores();
} catch (RuntimeException e){
    Log.w(TAG, "getExclusiveCores() is not supported on this device.");
}