我的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的设备,因此测试任何解决方案都会有其自身的复杂性。
由于
答案 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.");
}