Merge "Added tests to CarAudioService"
diff --git a/cpp/evs/apps/default/Android.bp b/cpp/evs/apps/default/Android.bp
index 6d0ca59..1e55d53 100644
--- a/cpp/evs/apps/default/Android.bp
+++ b/cpp/evs/apps/default/Android.bp
@@ -21,108 +21,79 @@
cc_binary {
name: "evs_app",
-
- srcs: [
- "evs_app.cpp",
- "EvsStateControl.cpp",
- "EvsStats.cpp",
- "RenderBase.cpp",
- "RenderDirectView.cpp",
- "RenderTopView.cpp",
- "ConfigManager.cpp",
- "glError.cpp",
- "shader.cpp",
- "TexWrapper.cpp",
- "VideoTex.cpp",
- "StreamHandler.cpp",
- "FormatConvert.cpp",
- "RenderPixelCopy.cpp",
+ defaults: [
+ "android.hardware.graphics.common-ndk_shared",
+ "vhalclient_defaults",
],
-
+ local_include_dirs: ["inc"],
+ srcs: ["src/*.cpp"],
shared_libs: [
+ "android.hardware.automotive.vehicle@2.0",
+ "android.hardware.camera.device@3.2",
+ "libEGL",
+ "libGLESv2",
"libbase",
"libbinder",
"libbinder_ndk",
+ "libcamera_metadata",
+ "libcartelemetry-evs-proto",
"libcutils",
- "libutils",
- "libui",
- "libhidlbase",
- "libEGL",
- "libGLESv2",
"libhardware",
"libpng",
- "libcamera_metadata",
- "android.frameworks.automotive.telemetry-V1-ndk",
- "android.hardware.camera.device@3.2",
- "android.hardware.automotive.evs@1.0",
- "android.hardware.automotive.evs@1.1",
- "android.hardware.automotive.vehicle@2.0",
- "libcartelemetry-evs-proto",
"libprotobuf-cpp-lite",
+ "libui",
+ "libutils",
],
-
static_libs: [
+ "android.frameworks.automotive.telemetry-V1-ndk",
+ "android.hardware.automotive.evs-V1-ndk",
+ "android.hardware.common-V2-ndk",
+ "libaidlcommonsupport",
"libmath",
"libjsoncpp",
"libvhalclient",
],
-
required: [
"config.json",
"CarFromTop.png",
"LabeledChecker.png",
],
-
init_rc: ["evs_app.rc"],
-
- defaults: ["vhalclient_defaults"],
-
- cflags: ["-DLOG_TAG=\"EvsApp\""] + [
+ cflags: [
+ "-DLOG_TAG=\"EvsApp\"",
"-DGL_GLEXT_PROTOTYPES",
"-DEGL_EGLEXT_PROTOTYPES",
- ] + [
"-Wall",
"-Werror",
"-Wunused",
"-Wunreachable-code",
],
-
}
cc_library {
name: "libcartelemetry-evs-proto",
- srcs: [
- ":cartelemetry-evs-proto-srcs",
- ],
+ srcs: [":cartelemetry-evs-proto-srcs"],
proto: {
export_proto_headers: true,
type: "lite",
},
- shared_libs: [
- "libprotobuf-cpp-lite",
- ],
+ shared_libs: ["libprotobuf-cpp-lite"],
}
prebuilt_etc {
name: "config.json",
-
- src: "config.json",
+ src: "res/config.json",
sub_dir: "automotive/evs",
-
}
prebuilt_etc {
name: "CarFromTop.png",
-
- src: "CarFromTop.png",
+ src: "res/CarFromTop.png",
sub_dir: "automotive/evs",
-
}
prebuilt_etc {
name: "LabeledChecker.png",
-
- src: "LabeledChecker.png",
+ src: "res/LabeledChecker.png",
sub_dir: "automotive/evs",
-
}
diff --git a/cpp/evs/apps/default/StreamHandler.h b/cpp/evs/apps/default/StreamHandler.h
deleted file mode 100644
index 1089046..0000000
--- a/cpp/evs/apps/default/StreamHandler.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef EVS_VTS_STREAMHANDLER_H
-#define EVS_VTS_STREAMHANDLER_H
-
-#include "ui/GraphicBuffer.h"
-
-#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
-#include <android/hardware/automotive/evs/1.1/IEvsCameraStream.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-
-#include <queue>
-
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::automotive::evs::V1_1::EvsEventDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsCamera;
-using ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
-using ::android::hardware::automotive::evs::V1_1::IEvsDisplay;
-
-using EvsDisplayState = ::android::hardware::automotive::evs::V1_0::DisplayState;
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
-/*
- * StreamHandler:
- * This class can be used to receive camera imagery from an IEvsCamera implementation. It will
- * hold onto the most recent image buffer, returning older ones.
- * Note that the video frames are delivered on a background thread, while the control interface
- * is actuated from the applications foreground thread.
- */
-class StreamHandler : public IEvsCameraStream {
-public:
- virtual ~StreamHandler() { shutdown(); };
-
- StreamHandler(android::sp<IEvsCamera> pCamera, uint32_t numBuffers = 2,
- bool useOwnBuffers = false,
- android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888, int32_t width = 640,
- int32_t height = 360);
- void shutdown();
-
- bool startStream();
- void asyncStopStream();
- void blockingStopStream();
-
- bool isRunning();
-
- bool newFrameAvailable();
- const BufferDesc_1_1& getNewFrame();
- void doneWithFrame(const BufferDesc_1_1& buffer);
-
-private:
- // Implementation for ::android::hardware::automotive::evs::V1_0::IEvsCameraStream
- Return<void> deliverFrame(const BufferDesc_1_0& buffer) override;
-
- // Implementation for ::android::hardware::automotive::evs::V1_1::IEvsCameraStream
- Return<void> deliverFrame_1_1(const hidl_vec<BufferDesc_1_1>& buffer) override;
- Return<void> notify(const EvsEventDesc& event) override;
-
- // Values initialized as startup
- android::sp<IEvsCamera> mCamera;
-
- // Since we get frames delivered to us asnchronously via the ICarCameraStream interface,
- // we need to protect all member variables that may be modified while we're streaming
- // (ie: those below)
- std::mutex mLock;
- std::condition_variable mSignal;
-
- bool mRunning = false;
-
- BufferDesc_1_1 mBuffers[2];
- int mHeldBuffer = -1; // Index of the one currently held by the client
- int mReadyBuffer = -1; // Index of the newest available buffer
- hidl_vec<BufferDesc_1_1> mOwnBuffers;
- bool mUseOwnBuffers;
-};
-
-#endif // EVS_VTS_STREAMHANDLER_H
diff --git a/cpp/evs/apps/default/VideoTex.h b/cpp/evs/apps/default/VideoTex.h
deleted file mode 100644
index 4d82950..0000000
--- a/cpp/evs/apps/default/VideoTex.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-#ifndef VIDEOTEX_H
-#define VIDEOTEX_H
-
-#include "StreamHandler.h"
-#include "TexWrapper.h"
-
-#include <EGL/egl.h>
-#include <EGL/eglext.h>
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#include <GLES3/gl3.h>
-#include <GLES3/gl3ext.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
-
-#include <system/graphics-base.h>
-
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsCamera;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-using ::android::hardware::camera::device::V3_2::Stream;
-
-class VideoTex : public TexWrapper {
- friend VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* evsCameraId,
- std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
- bool useExternalMemory, android_pixel_format_t format);
-
-public:
- VideoTex() = delete;
- virtual ~VideoTex();
-
- bool refresh(); // returns true if the texture contents were updated
-
-private:
- VideoTex(android::sp<IEvsEnumerator> pEnum, android::sp<IEvsCamera> pCamera,
- android::sp<StreamHandler> pStreamHandler, EGLDisplay glDisplay);
-
- android::sp<IEvsEnumerator> mEnumerator;
- android::sp<IEvsCamera> mCamera;
- android::sp<StreamHandler> mStreamHandler;
- BufferDesc mImageBuffer;
-
- EGLDisplay mDisplay;
- EGLImageKHR mKHRimage = EGL_NO_IMAGE_KHR;
-};
-
-// Creates a video texture to draw the camera preview. format is effective only
-// when useExternalMemory is true.
-VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* deviceName,
- std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
- bool useExternalMemory = false,
- android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888);
-
-#endif // VIDEOTEX_H
diff --git a/cpp/evs/apps/default/ConfigManager.h b/cpp/evs/apps/default/inc/ConfigManager.h
similarity index 99%
rename from cpp/evs/apps/default/ConfigManager.h
rename to cpp/evs/apps/default/inc/ConfigManager.h
index 6251b6b..8df0c4c 100644
--- a/cpp/evs/apps/default/ConfigManager.h
+++ b/cpp/evs/apps/default/inc/ConfigManager.h
@@ -22,7 +22,7 @@
#include <system/graphics-base.h>
-class ConfigManager {
+class ConfigManager final {
public:
struct CameraInfo {
std::string cameraId = ""; // The name of the camera from the point of view of the HAL
diff --git a/cpp/evs/apps/default/EvsStateControl.h b/cpp/evs/apps/default/inc/EvsStateControl.h
similarity index 76%
rename from cpp/evs/apps/default/EvsStateControl.h
rename to cpp/evs/apps/default/inc/EvsStateControl.h
index e852a8d..cbc7c0a 100644
--- a/cpp/evs/apps/default/EvsStateControl.h
+++ b/cpp/evs/apps/default/inc/EvsStateControl.h
@@ -22,34 +22,28 @@
#include "RenderBase.h"
#include "StreamHandler.h"
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropValues.h>
-#include <android/hardware/automotive/evs/1.1/IEvsCamera.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
#include <IVhalClient.h>
#include <thread>
-using ::android::hardware::hidl_handle;
-using ::android::hardware::hidl_vec;
-using ::android::hardware::Return;
-using ::android::hardware::Void;
-using ::android::hardware::automotive::evs::V1_1::CameraDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsDisplay;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-using ::android::hardware::camera::device::V3_2::Stream;
-
/*
* This class runs the main update loop for the EVS application. It will sleep when it has
* nothing to do. It provides a thread safe way for other threads to wake it and pass commands
* to it.
*/
-class EvsStateControl {
+class EvsStateControl final {
public:
- EvsStateControl(std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> pVnet,
- android::sp<IEvsEnumerator> pEvs, android::sp<IEvsDisplay> pDisplay,
- const ConfigManager& config);
+ EvsStateControl(
+ std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> pVnet,
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> pEvs,
+ const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsDisplay>& pDisplay,
+ const ConfigManager& config);
enum State {
OFF = 0,
@@ -89,8 +83,8 @@
bool configureEvsPipeline(State desiredState); // Only call from one thread!
std::shared_ptr<android::frameworks::automotive::vhal::IVhalClient> mVehicle;
- android::sp<IEvsEnumerator> mEvs;
- android::wp<IEvsDisplay> mDisplay;
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEvs;
+ std::weak_ptr<aidl::android::hardware::automotive::evs::IEvsDisplay> mDisplay;
const ConfigManager& mConfig;
aidl::android::hardware::automotive::vehicle::VehiclePropValue mGearValue;
@@ -104,7 +98,7 @@
std::vector<ConfigManager::CameraInfo> mCameraList[NUM_STATES];
std::unique_ptr<RenderBase> mCurrentRenderer;
std::unique_ptr<RenderBase> mDesiredRenderer;
- std::vector<CameraDesc> mCameraDescList[NUM_STATES];
+ std::vector<aidl::android::hardware::automotive::evs::CameraDesc> mCameraDescList[NUM_STATES];
std::thread mRenderThread; // The thread that runs the main rendering loop
diff --git a/cpp/evs/apps/default/EvsStats.h b/cpp/evs/apps/default/inc/EvsStats.h
similarity index 99%
rename from cpp/evs/apps/default/EvsStats.h
rename to cpp/evs/apps/default/inc/EvsStats.h
index 0d9d47f..2e3416b 100644
--- a/cpp/evs/apps/default/EvsStats.h
+++ b/cpp/evs/apps/default/inc/EvsStats.h
@@ -29,7 +29,7 @@
//
// Not thread-safe. Methods `startComputingFirstFrameLatency`, `finishComputingFirstFrameLatency`
// and `sendCollectedDataBlocking` must be called from the same thread.
-class EvsStats {
+class EvsStats final {
public:
// Instantiates EvsStats.
static EvsStats build();
diff --git a/cpp/evs/apps/default/EvsVehicleListener.h b/cpp/evs/apps/default/inc/EvsVehicleListener.h
similarity index 95%
rename from cpp/evs/apps/default/EvsVehicleListener.h
rename to cpp/evs/apps/default/inc/EvsVehicleListener.h
index 9269e8e..f804395 100644
--- a/cpp/evs/apps/default/EvsVehicleListener.h
+++ b/cpp/evs/apps/default/inc/EvsVehicleListener.h
@@ -28,7 +28,8 @@
* applications is active, it can poll the vehicle state directly. However, when it goes to
* sleep, we need these notifications to bring it active again.
*/
-class EvsVehicleListener : public android::frameworks::automotive::vhal::ISubscriptionCallback {
+class EvsVehicleListener final :
+ public android::frameworks::automotive::vhal::ISubscriptionCallback {
public:
void onPropertyEvent([[maybe_unused]] const std::vector<
std::unique_ptr<android::frameworks::automotive::vhal::IHalPropValue>>&
diff --git a/cpp/evs/apps/default/FormatConvert.h b/cpp/evs/apps/default/inc/FormatConvert.h
similarity index 87%
rename from cpp/evs/apps/default/FormatConvert.h
rename to cpp/evs/apps/default/inc/FormatConvert.h
index c506b88..2993a34 100644
--- a/cpp/evs/apps/default/FormatConvert.h
+++ b/cpp/evs/apps/default/inc/FormatConvert.h
@@ -17,16 +17,10 @@
#ifndef EVS_VTS_FORMATCONVERT_H
#define EVS_VTS_FORMATCONVERT_H
-#include <android/hardware/automotive/evs/1.0/types.h>
-#include <android/hardware/automotive/evs/1.1/types.h>
-
#include <stdint.h>
#include <queue>
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
// Given an image buffer in NV21 format (HAL_PIXEL_FORMAT_YCRCB_420_SP), output 32bit RGBx values.
// The NV21 format provides a Y array of 8bit values, followed by a 1/2 x 1/2 interleaved
// U/V array. It assumes an even width and height for the overall image, and a horizontal
@@ -56,7 +50,4 @@
unsigned srcStridePixels, void* dst, unsigned dstStridePixels,
unsigned pixelSize);
-// Fill BufferDesc v1.1 with a given BufferDesc v1.0 data.
-BufferDesc_1_1 convertBufferDesc(const BufferDesc_1_0& src);
-
#endif // EVS_VTS_FORMATCONVERT_H
diff --git a/cpp/evs/apps/default/RenderBase.h b/cpp/evs/apps/default/inc/RenderBase.h
similarity index 84%
rename from cpp/evs/apps/default/RenderBase.h
rename to cpp/evs/apps/default/inc/RenderBase.h
index e15f705..8f594a1 100644
--- a/cpp/evs/apps/default/RenderBase.h
+++ b/cpp/evs/apps/default/inc/RenderBase.h
@@ -23,9 +23,7 @@
#include <GLES2/gl2ext.h>
#include <GLES3/gl3.h>
#include <GLES3/gl3ext.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
/*
* Abstract base class for the workhorse classes that handle the user interaction and display for
@@ -38,12 +36,14 @@
virtual bool activate() = 0;
virtual void deactivate() = 0;
- virtual bool drawFrame(const BufferDesc& tgtBuffer) = 0;
+ virtual bool drawFrame(
+ const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer) = 0;
protected:
static bool prepareGL();
- static bool attachRenderTarget(const BufferDesc& tgtBuffer);
+ static bool attachRenderTarget(
+ const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
static void detachRenderTarget();
// OpenGL state shared among all renderers
diff --git a/cpp/evs/apps/default/RenderDirectView.h b/cpp/evs/apps/default/inc/RenderDirectView.h
similarity index 62%
rename from cpp/evs/apps/default/RenderDirectView.h
rename to cpp/evs/apps/default/inc/RenderDirectView.h
index 151e148..4eb47b3 100644
--- a/cpp/evs/apps/default/RenderDirectView.h
+++ b/cpp/evs/apps/default/inc/RenderDirectView.h
@@ -21,30 +21,30 @@
#include "RenderBase.h"
#include "VideoTex.h"
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
#include <math/mat2.h>
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-using ::android::hardware::automotive::evs::V1_1::CameraDesc;
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
-
/*
* Renders the view from a single specified camera directly to the full display.
*/
-class RenderDirectView : public RenderBase {
+class RenderDirectView final : public RenderBase {
public:
- RenderDirectView(android::sp<IEvsEnumerator> enumerator, const CameraDesc& camDesc,
- const ConfigManager& config);
+ RenderDirectView(
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+ const aidl::android::hardware::automotive::evs::CameraDesc& camDesc,
+ const ConfigManager& config);
virtual bool activate() override;
virtual void deactivate() override;
- virtual bool drawFrame(const BufferDesc& tgtBuffer);
+ virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
protected:
- android::sp<IEvsEnumerator> mEnumerator;
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
ConfigManager::CameraInfo mCameraInfo;
- CameraDesc mCameraDesc;
+ aidl::android::hardware::automotive::evs::CameraDesc mCameraDesc;
const ConfigManager& mConfig;
std::unique_ptr<VideoTex> mTexture;
diff --git a/cpp/evs/apps/default/RenderPixelCopy.h b/cpp/evs/apps/default/inc/RenderPixelCopy.h
similarity index 64%
rename from cpp/evs/apps/default/RenderPixelCopy.h
rename to cpp/evs/apps/default/inc/RenderPixelCopy.h
index 283b9c8..f8da412 100644
--- a/cpp/evs/apps/default/RenderPixelCopy.h
+++ b/cpp/evs/apps/default/inc/RenderPixelCopy.h
@@ -21,27 +21,28 @@
#include "RenderBase.h"
#include "VideoTex.h"
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-
-using ::android::hardware::automotive::evs::V1_1::IEvsEnumerator;
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
/*
* Renders the view from a single specified camera directly to the full display.
*/
-class RenderPixelCopy : public RenderBase {
+class RenderPixelCopy final : public RenderBase {
public:
- RenderPixelCopy(android::sp<IEvsEnumerator> enumerator, const ConfigManager::CameraInfo& cam);
+ RenderPixelCopy(
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+ const ConfigManager::CameraInfo& cam);
virtual bool activate() override;
virtual void deactivate() override;
- virtual bool drawFrame(const BufferDesc& tgtBuffer);
+ virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
protected:
- android::sp<IEvsEnumerator> mEnumerator;
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
ConfigManager::CameraInfo mCameraInfo;
- android::sp<StreamHandler> mStreamHandler;
+ std::shared_ptr<StreamHandler> mStreamHandler;
};
#endif // CAR_EVS_APP_RENDERPIXELCOPY_H
diff --git a/cpp/evs/apps/default/RenderTopView.h b/cpp/evs/apps/default/inc/RenderTopView.h
similarity index 74%
rename from cpp/evs/apps/default/RenderTopView.h
rename to cpp/evs/apps/default/inc/RenderTopView.h
index cd9ca30..d9cccc6 100644
--- a/cpp/evs/apps/default/RenderTopView.h
+++ b/cpp/evs/apps/default/inc/RenderTopView.h
@@ -21,24 +21,23 @@
#include "RenderBase.h"
#include "VideoTex.h"
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
#include <math/mat4.h>
-using ::android::hardware::automotive::evs::V1_1::BufferDesc;
-
/*
* Combines the views from all available cameras into one reprojected top down view.
*/
-class RenderTopView : public RenderBase {
+class RenderTopView final : public RenderBase {
public:
- RenderTopView(android::sp<IEvsEnumerator> enumerator,
- const std::vector<ConfigManager::CameraInfo>& camList,
- const ConfigManager& config);
+ RenderTopView(
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> enumerator,
+ const std::vector<ConfigManager::CameraInfo>& camList, const ConfigManager& config);
virtual bool activate() override;
virtual void deactivate() override;
- virtual bool drawFrame(const BufferDesc& tgtBuffer);
+ virtual bool drawFrame(const aidl::android::hardware::automotive::evs::BufferDesc& tgtBuffer);
protected:
struct ActiveCamera {
@@ -51,7 +50,7 @@
void renderCarTopView();
void renderCameraOntoGroundPlane(const ActiveCamera& cam);
- android::sp<IEvsEnumerator> mEnumerator;
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
const ConfigManager& mConfig;
std::vector<ActiveCamera> mActiveCameras;
diff --git a/cpp/evs/apps/default/inc/StreamHandler.h b/cpp/evs/apps/default/inc/StreamHandler.h
new file mode 100644
index 0000000..3d291e2
--- /dev/null
+++ b/cpp/evs/apps/default/inc/StreamHandler.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef EVS_VTS_STREAMHANDLER_H
+#define EVS_VTS_STREAMHANDLER_H
+
+#include <aidl/android/hardware/automotive/evs/BnEvsCameraStream.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/DisplayState.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/graphics/common/HardwareBuffer.h>
+#include <ui/GraphicBuffer.h>
+
+#include <queue>
+
+/*
+ * StreamHandler:
+ * This class can be used to receive camera imagery from an IEvsCamera implementation. It will
+ * hold onto the most recent image buffer, returning older ones.
+ * Note that the video frames are delivered on a background thread, while the control interface
+ * is actuated from the applications foreground thread.
+ */
+class StreamHandler final : public aidl::android::hardware::automotive::evs::BnEvsCameraStream {
+public:
+ virtual ~StreamHandler() { shutdown(); };
+
+ StreamHandler(
+ const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera>& cameraObj,
+ uint32_t numBuffers = 2, bool useOwnBuffers = false,
+ android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888, int32_t width = 640,
+ int32_t height = 360);
+ void shutdown();
+
+ bool startStream();
+ void asyncStopStream();
+ void blockingStopStream();
+
+ bool isRunning();
+
+ bool newFrameAvailable();
+ const aidl::android::hardware::automotive::evs::BufferDesc& getNewFrame();
+ void doneWithFrame(const aidl::android::hardware::automotive::evs::BufferDesc& buffer);
+
+private:
+ // Implementation for aidl::android::hardware::automotive::evs::IEvsCameraStream
+ ndk::ScopedAStatus deliverFrame(
+ const std::vector<aidl::android::hardware::automotive::evs::BufferDesc>& buffers)
+ override;
+ ndk::ScopedAStatus notify(
+ const aidl::android::hardware::automotive::evs::EvsEventDesc& event) override;
+
+ // Values initialized as startup
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> mCamera;
+
+ // Since we get frames delivered to us asnchronously via the IEvsCameraStream interface,
+ // we need to protect all member variables that may be modified while we're streaming
+ // (i.e.: those below)
+ std::mutex mLock;
+ std::condition_variable mSignal;
+
+ bool mRunning = false;
+
+ aidl::android::hardware::automotive::evs::BufferDesc mBuffers[2];
+ int mHeldBuffer = -1; // Index of the one currently held by the client
+ int mReadyBuffer = -1; // Index of the newest available buffer
+ std::vector<aidl::android::hardware::automotive::evs::BufferDesc> mOwnBuffers;
+ bool mUseOwnBuffers;
+};
+
+#endif // EVS_VTS_STREAMHANDLER_H
diff --git a/cpp/evs/apps/default/TexWrapper.h b/cpp/evs/apps/default/inc/TexWrapper.h
similarity index 100%
rename from cpp/evs/apps/default/TexWrapper.h
rename to cpp/evs/apps/default/inc/TexWrapper.h
diff --git a/cpp/evs/apps/default/inc/Utils.h b/cpp/evs/apps/default/inc/Utils.h
new file mode 100644
index 0000000..ed17d00
--- /dev/null
+++ b/cpp/evs/apps/default/inc/Utils.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <cutils/native_handle.h>
+
+aidl::android::hardware::automotive::evs::BufferDesc dupBufferDesc(
+ const aidl::android::hardware::automotive::evs::BufferDesc& src);
+native_handle_t* getNativeHandle(
+ const aidl::android::hardware::automotive::evs::BufferDesc& buffer);
diff --git a/cpp/evs/apps/default/inc/VideoTex.h b/cpp/evs/apps/default/inc/VideoTex.h
new file mode 100644
index 0000000..0667bc0
--- /dev/null
+++ b/cpp/evs/apps/default/inc/VideoTex.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#ifndef VIDEOTEX_H
+#define VIDEOTEX_H
+
+#include "StreamHandler.h"
+#include "TexWrapper.h"
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES2/gl2.h>
+#include <GLES2/gl2ext.h>
+#include <GLES3/gl3.h>
+#include <GLES3/gl3ext.h>
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+
+#include <system/graphics-base.h>
+
+class VideoTex final : public TexWrapper {
+ friend VideoTex* createVideoTexture(
+ const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator>& pEnum,
+ const char* evsCameraId,
+ std::unique_ptr<aidl::android::hardware::automotive::evs::Stream> streamCfg,
+ EGLDisplay glDisplay, bool useExternalMemory, android_pixel_format_t format);
+
+public:
+ VideoTex() = delete;
+ virtual ~VideoTex();
+
+ bool refresh(); // returns true if the texture contents were updated
+
+private:
+ VideoTex(std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> pEnum,
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> pCamera,
+ std::shared_ptr<StreamHandler> pStreamHandler, EGLDisplay glDisplay);
+
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator> mEnumerator;
+ std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsCamera> mCamera;
+ std::shared_ptr<StreamHandler> mStreamHandler;
+ aidl::android::hardware::automotive::evs::BufferDesc mImageBuffer;
+
+ EGLDisplay mDisplay;
+ EGLImageKHR mKHRimage = EGL_NO_IMAGE_KHR;
+};
+
+// Creates a video texture to draw the camera preview. format is effective only
+// when useExternalMemory is true.
+VideoTex* createVideoTexture(
+ const std::shared_ptr<aidl::android::hardware::automotive::evs::IEvsEnumerator>& pEnum,
+ const char* deviceName,
+ std::unique_ptr<aidl::android::hardware::automotive::evs::Stream> streamCfg,
+ EGLDisplay glDisplay, bool useExternalMemory = false,
+ android_pixel_format_t format = HAL_PIXEL_FORMAT_RGBA_8888);
+
+#endif // VIDEOTEX_H
diff --git a/cpp/evs/apps/default/glError.h b/cpp/evs/apps/default/inc/glError.h
similarity index 100%
rename from cpp/evs/apps/default/glError.h
rename to cpp/evs/apps/default/inc/glError.h
diff --git a/cpp/evs/apps/default/shader.h b/cpp/evs/apps/default/inc/shader.h
similarity index 100%
rename from cpp/evs/apps/default/shader.h
rename to cpp/evs/apps/default/inc/shader.h
diff --git a/cpp/evs/apps/default/shader_projectedTex.h b/cpp/evs/apps/default/inc/shader_projectedTex.h
similarity index 100%
rename from cpp/evs/apps/default/shader_projectedTex.h
rename to cpp/evs/apps/default/inc/shader_projectedTex.h
diff --git a/cpp/evs/apps/default/shader_simpleTex.h b/cpp/evs/apps/default/inc/shader_simpleTex.h
similarity index 100%
rename from cpp/evs/apps/default/shader_simpleTex.h
rename to cpp/evs/apps/default/inc/shader_simpleTex.h
diff --git a/cpp/evs/apps/default/CarFromTop.png b/cpp/evs/apps/default/res/CarFromTop.png
similarity index 100%
rename from cpp/evs/apps/default/CarFromTop.png
rename to cpp/evs/apps/default/res/CarFromTop.png
Binary files differ
diff --git a/cpp/evs/apps/default/LabeledChecker.png b/cpp/evs/apps/default/res/LabeledChecker.png
similarity index 100%
rename from cpp/evs/apps/default/LabeledChecker.png
rename to cpp/evs/apps/default/res/LabeledChecker.png
Binary files differ
diff --git a/cpp/evs/apps/default/config.json b/cpp/evs/apps/default/res/config.json
similarity index 100%
rename from cpp/evs/apps/default/config.json
rename to cpp/evs/apps/default/res/config.json
diff --git a/cpp/evs/apps/default/config.json.readme b/cpp/evs/apps/default/res/config.json.readme
similarity index 100%
rename from cpp/evs/apps/default/config.json.readme
rename to cpp/evs/apps/default/res/config.json.readme
diff --git a/cpp/evs/apps/default/ConfigManager.cpp b/cpp/evs/apps/default/src/ConfigManager.cpp
similarity index 100%
rename from cpp/evs/apps/default/ConfigManager.cpp
rename to cpp/evs/apps/default/src/ConfigManager.cpp
diff --git a/cpp/evs/apps/default/EvsStateControl.cpp b/cpp/evs/apps/default/src/EvsStateControl.cpp
similarity index 74%
rename from cpp/evs/apps/default/EvsStateControl.cpp
rename to cpp/evs/apps/default/src/EvsStateControl.cpp
index e2cdba4..dbcd58a 100644
--- a/cpp/evs/apps/default/EvsStateControl.cpp
+++ b/cpp/evs/apps/default/src/EvsStateControl.cpp
@@ -20,6 +20,10 @@
#include "RenderPixelCopy.h"
#include "RenderTopView.h"
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/DisplayState.h>
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleGear.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <aidl/android/hardware/automotive/vehicle/VehiclePropertyType.h>
@@ -32,23 +36,25 @@
#include <stdio.h>
#include <string.h>
-using ::aidl::android::hardware::automotive::vehicle::VehicleGear;
-using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
-using ::aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
-using ::aidl::android::hardware::automotive::vehicle::VehiclePropValue;
-using ::aidl::android::hardware::automotive::vehicle::VehicleTurnSignal;
-using ::android::base::Result;
-using ::android::frameworks::automotive::vhal::ErrorCode;
-using ::android::frameworks::automotive::vhal::IHalPropValue;
-using ::android::frameworks::automotive::vhal::IVhalClient;
-using ::android::frameworks::automotive::vhal::VhalClientResult;
-using ::android::hardware::automotive::evs::V1_0::EvsResult;
-using EvsDisplayState = ::android::hardware::automotive::evs::V1_0::DisplayState;
-using BufferDesc_1_0 = ::android::hardware::automotive::evs::V1_0::BufferDesc;
-using BufferDesc_1_1 = ::android::hardware::automotive::evs::V1_1::BufferDesc;
+namespace {
-static bool isSfReady() {
- return ::ndk::SpAIBinder(::AServiceManager_getService("SurfaceFlinger")).get() != nullptr;
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::CameraDesc;
+using aidl::android::hardware::automotive::evs::DisplayState;
+using aidl::android::hardware::automotive::evs::IEvsDisplay;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::vehicle::VehicleGear;
+using aidl::android::hardware::automotive::vehicle::VehicleProperty;
+using aidl::android::hardware::automotive::vehicle::VehiclePropertyType;
+using aidl::android::hardware::automotive::vehicle::VehiclePropValue;
+using aidl::android::hardware::automotive::vehicle::VehicleTurnSignal;
+using android::frameworks::automotive::vhal::ErrorCode;
+using android::frameworks::automotive::vhal::IHalPropValue;
+using android::frameworks::automotive::vhal::IVhalClient;
+using android::frameworks::automotive::vhal::VhalClientResult;
+
+bool isSfReady() {
+ return ndk::SpAIBinder(AServiceManager_getService("SurfaceFlinger")).get() != nullptr;
}
inline constexpr VehiclePropertyType getPropType(VehicleProperty prop) {
@@ -56,9 +62,12 @@
static_cast<int32_t>(VehiclePropertyType::MASK));
}
+} // namespace
+
EvsStateControl::EvsStateControl(std::shared_ptr<IVhalClient> pVnet,
- android::sp<IEvsEnumerator> pEvs,
- android::sp<IEvsDisplay> pDisplay, const ConfigManager& config) :
+ std::shared_ptr<IEvsEnumerator> pEvs,
+ const std::shared_ptr<IEvsDisplay>& pDisplay,
+ const ConfigManager& config) :
mVehicle(pVnet),
mEvs(pEvs),
mDisplay(pDisplay),
@@ -77,48 +86,52 @@
// This way we only ever deal with cameras which exist in the system
// Build our set of cameras for the states we support
LOG(DEBUG) << "Requesting camera list";
- mEvs->getCameraList_1_1([this, &config](hidl_vec<CameraDesc> cameraList) {
- LOG(INFO) << "Camera list callback received " << cameraList.size() << "cameras.";
- for (auto&& cam : cameraList) {
- LOG(DEBUG) << "Found camera " << cam.v1.cameraId;
- bool cameraConfigFound = false;
+ std::vector<CameraDesc> cameraList;
+ if (auto status = mEvs->getCameraList(&cameraList); !status.isOk()) {
+ LOG(ERROR) << "Failed to get the camera list.";
+ return;
+ }
- // Check our configuration for information about this camera
- // Note that a camera can have a compound function string
- // such that a camera can be "right/reverse" and be used for both.
- // If more than one camera is listed for a given function, we'll
- // list all of them and let the UX/rendering logic use one, some
- // or all of them as appropriate.
- for (auto&& info : config.getCameras()) {
- if (cam.v1.cameraId == info.cameraId) {
- // We found a match!
- if (info.function.find("reverse") != std::string::npos) {
- mCameraList[State::REVERSE].emplace_back(info);
- mCameraDescList[State::REVERSE].emplace_back(cam);
- }
- if (info.function.find("right") != std::string::npos) {
- mCameraList[State::RIGHT].emplace_back(info);
- mCameraDescList[State::RIGHT].emplace_back(cam);
- }
- if (info.function.find("left") != std::string::npos) {
- mCameraList[State::LEFT].emplace_back(info);
- mCameraDescList[State::LEFT].emplace_back(cam);
- }
- if (info.function.find("park") != std::string::npos) {
- mCameraList[State::PARKING].emplace_back(info);
- mCameraDescList[State::PARKING].emplace_back(cam);
- }
- cameraConfigFound = true;
- break;
+ LOG(INFO) << "Camera list callback received " << cameraList.size() << "cameras.";
+ for (auto&& cam : cameraList) {
+ LOG(DEBUG) << "Found camera " << cam.id;
+ bool cameraConfigFound = false;
+
+ // Check our configuration for information about this camera
+ // Note that a camera can have a compound function string
+ // such that a camera can be "right/reverse" and be used for both.
+ // If more than one camera is listed for a given function, we'll
+ // list all of them and let the UX/rendering logic use one, some
+ // or all of them as appropriate.
+ for (auto&& info : config.getCameras()) {
+ if (cam.id == info.cameraId) {
+ // We found a match!
+ if (info.function.find("reverse") != std::string::npos) {
+ mCameraList[State::REVERSE].emplace_back(info);
+ mCameraDescList[State::REVERSE].emplace_back(cam);
}
- }
- if (!cameraConfigFound) {
- LOG(WARNING) << "No config information for hardware camera " << cam.v1.cameraId;
+ if (info.function.find("right") != std::string::npos) {
+ mCameraList[State::RIGHT].emplace_back(info);
+ mCameraDescList[State::RIGHT].emplace_back(cam);
+ }
+ if (info.function.find("left") != std::string::npos) {
+ mCameraList[State::LEFT].emplace_back(info);
+ mCameraDescList[State::LEFT].emplace_back(cam);
+ }
+ if (info.function.find("park") != std::string::npos) {
+ mCameraList[State::PARKING].emplace_back(info);
+ mCameraDescList[State::PARKING].emplace_back(cam);
+ }
+ cameraConfigFound = true;
+ break;
}
}
- });
+ if (!cameraConfigFound) {
+ LOG(WARNING) << "No config information for hardware camera " << cam.id;
+ }
+ }
- LOG(DEBUG) << "State controller ready";
+ LOG(INFO) << "State controller ready";
}
bool EvsStateControl::startUpdateLoop() {
@@ -158,9 +171,9 @@
bool run = true;
while (run) {
// Process incoming commands
- android::sp<IEvsDisplay> displayHandle;
+ std::shared_ptr<IEvsDisplay> displayHandle;
{
- std::lock_guard<std::mutex> lock(mLock);
+ std::lock_guard lock(mLock);
while (!mCommandQueue.empty()) {
const Command& cmd = mCommandQueue.front();
switch (cmd.operation) {
@@ -177,7 +190,7 @@
mCommandQueue.pop();
}
- displayHandle = mDisplay.promote();
+ displayHandle = mDisplay.lock();
}
if (!displayHandle) {
@@ -194,16 +207,13 @@
// If we have an active renderer, give it a chance to draw
if (mCurrentRenderer) {
// Get the output buffer we'll use to display the imagery
- BufferDesc_1_0 tgtBuffer = {};
- displayHandle->getTargetBuffer(
- [&tgtBuffer](const BufferDesc_1_0& buff) { tgtBuffer = buff; });
-
- if (tgtBuffer.memHandle == nullptr) {
+ BufferDesc tgtBuffer;
+ if (auto status = displayHandle->getTargetBuffer(&tgtBuffer); !status.isOk()) {
LOG(ERROR) << "Didn't get requested output buffer -- skipping this frame.";
run = false;
} else {
// Generate our output image
- if (!mCurrentRenderer->drawFrame(convertBufferDesc(tgtBuffer))) {
+ if (!mCurrentRenderer->drawFrame(tgtBuffer)) {
// If drawing failed, we want to exit quickly so an app restart can happen
run = false;
}
@@ -365,20 +375,20 @@
}
// Since we're changing states, shut down the current renderer
- if (mCurrentRenderer != nullptr) {
+ if (mCurrentRenderer) {
mCurrentRenderer->deactivate();
- mCurrentRenderer = nullptr; // It's a smart pointer, so destructs on assignment to null
+ mCurrentRenderer.reset();
}
// Now set the display state based on whether we have a video feed to show
- android::sp<IEvsDisplay> displayHandle = mDisplay.promote();
+ std::shared_ptr<IEvsDisplay> displayHandle = mDisplay.lock();
if (!displayHandle) {
return false;
}
- if (mDesiredRenderer == nullptr) {
+ if (!mDesiredRenderer) {
LOG(DEBUG) << "Turning off the display";
- displayHandle->setDisplayState(EvsDisplayState::NOT_VISIBLE);
+ displayHandle->setDisplayState(DisplayState::NOT_VISIBLE);
} else {
mCurrentRenderer = std::move(mDesiredRenderer);
@@ -393,10 +403,9 @@
// Activate the display
LOG(DEBUG) << "EvsActivateDisplayTiming start time: " << android::elapsedRealtime()
<< " ms.";
- Return<EvsResult> result =
- displayHandle->setDisplayState(EvsDisplayState::VISIBLE_ON_NEXT_FRAME);
- if (result != EvsResult::OK) {
- LOG(ERROR) << "setDisplayState returned an error " << result.description();
+ if (auto status = displayHandle->setDisplayState(DisplayState::VISIBLE_ON_NEXT_FRAME);
+ !status.isOk()) {
+ LOG(ERROR) << "Failed to set a display state as VISIBLE_ON_NEXT_FRAME.";
return false;
}
}
@@ -407,7 +416,7 @@
mFirstFrameIsDisplayed = false; // Got a new renderer, mark first frame is not displayed.
- if (mCurrentRenderer != nullptr && desiredState == State::REVERSE) {
+ if (mCurrentRenderer && desiredState == State::REVERSE) {
// Start computing the latency when the evs state changes.
mEvsStats.startComputingFirstFrameLatency(desiredStateTimeMillis);
}
diff --git a/cpp/evs/apps/default/EvsStats.cpp b/cpp/evs/apps/default/src/EvsStats.cpp
similarity index 100%
rename from cpp/evs/apps/default/EvsStats.cpp
rename to cpp/evs/apps/default/src/EvsStats.cpp
diff --git a/cpp/evs/apps/default/FormatConvert.cpp b/cpp/evs/apps/default/src/FormatConvert.cpp
similarity index 91%
rename from cpp/evs/apps/default/FormatConvert.cpp
rename to cpp/evs/apps/default/src/FormatConvert.cpp
index 499d405..768c489 100644
--- a/cpp/evs/apps/default/FormatConvert.cpp
+++ b/cpp/evs/apps/default/src/FormatConvert.cpp
@@ -152,20 +152,3 @@
dst = (uint8_t*)dst + dstStridePixels * pixelSize;
}
}
-
-BufferDesc_1_1 convertBufferDesc(const BufferDesc_1_0& src) {
- BufferDesc_1_1 dst = {};
- AHardwareBuffer_Desc* pDesc = reinterpret_cast<AHardwareBuffer_Desc*>(&dst.buffer.description);
- pDesc->width = src.width;
- pDesc->height = src.height;
- pDesc->layers = 1;
- pDesc->format = src.format;
- pDesc->usage = static_cast<uint64_t>(src.usage);
- pDesc->stride = src.stride;
-
- dst.buffer.nativeHandle = src.memHandle;
- dst.pixelSize = src.pixelSize;
- dst.bufferId = src.bufferId;
-
- return dst;
-}
diff --git a/cpp/evs/apps/default/RenderBase.cpp b/cpp/evs/apps/default/src/RenderBase.cpp
similarity index 90%
rename from cpp/evs/apps/default/RenderBase.cpp
rename to cpp/evs/apps/default/src/RenderBase.cpp
index f4728a4..4d009f6 100644
--- a/cpp/evs/apps/default/RenderBase.cpp
+++ b/cpp/evs/apps/default/src/RenderBase.cpp
@@ -16,16 +16,26 @@
#include "RenderBase.h"
+#include "Utils.h"
#include "glError.h"
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
+#include <android-base/scopeguard.h>
#include <ui/GraphicBuffer.h>
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+
// Eventually we shouldn't need this dependency, but for now the
// graphics allocator interface isn't fully supported on all platforms
// and this is our work around.
using ::android::GraphicBuffer;
+} // namespace
+
// OpenGL state shared among all renderers
EGLDisplay RenderBase::sDisplay = EGL_NO_DISPLAY;
EGLContext RenderBase::sContext = EGL_NO_CONTEXT;
@@ -131,6 +141,14 @@
}
bool RenderBase::attachRenderTarget(const BufferDesc& tgtBuffer) {
+ native_handle_t* nativeHandle = getNativeHandle(tgtBuffer);
+ if (nativeHandle == nullptr) {
+ LOG(ERROR) << "Target buffer is invalid.";
+ return false;
+ }
+
+ const auto handleGuard =
+ android::base::make_scope_guard([nativeHandle] { free(nativeHandle); });
const AHardwareBuffer_Desc* pDesc =
reinterpret_cast<const AHardwareBuffer_Desc*>(&tgtBuffer.buffer.description);
// Hardcoded to RGBx for now
@@ -141,9 +159,9 @@
// create a GraphicBuffer from the existing handle
android::sp<GraphicBuffer> pGfxBuffer =
- new GraphicBuffer(tgtBuffer.buffer.nativeHandle, GraphicBuffer::CLONE_HANDLE,
- pDesc->width, pDesc->height, pDesc->format, pDesc->layers,
- GRALLOC_USAGE_HW_RENDER, pDesc->stride);
+ new GraphicBuffer(nativeHandle, GraphicBuffer::CLONE_HANDLE, pDesc->width,
+ pDesc->height, pDesc->format, pDesc->layers, GRALLOC_USAGE_HW_RENDER,
+ pDesc->stride);
if (pGfxBuffer.get() == nullptr) {
LOG(ERROR) << "Failed to allocate GraphicBuffer to wrap image handle";
return false;
diff --git a/cpp/evs/apps/default/RenderDirectView.cpp b/cpp/evs/apps/default/src/RenderDirectView.cpp
similarity index 90%
rename from cpp/evs/apps/default/RenderDirectView.cpp
rename to cpp/evs/apps/default/src/RenderDirectView.cpp
index 5df2db1..806b559 100644
--- a/cpp/evs/apps/default/RenderDirectView.cpp
+++ b/cpp/evs/apps/default/src/RenderDirectView.cpp
@@ -21,13 +21,20 @@
#include "shader.h"
#include "shader_simpleTex.h"
+#include <aidl/android/hardware/automotive/evs/CameraDesc.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+#include <aidl/android/hardware/graphics/common/PixelFormat.h>
#include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
#include <math/mat4.h>
#include <system/camera_metadata.h>
-using ::android::hardware::camera::device::V3_2::Stream;
-using ::android::hardware::graphics::common::V1_0::PixelFormat;
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::CameraDesc;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
typedef struct {
int32_t id;
@@ -40,14 +47,16 @@
const size_t kStreamCfgSz = sizeof(RawStreamConfig) / sizeof(int32_t);
-RenderDirectView::RenderDirectView(android::sp<IEvsEnumerator> enumerator,
+} // namespace
+
+RenderDirectView::RenderDirectView(std::shared_ptr<IEvsEnumerator> enumerator,
const CameraDesc& camDesc, const ConfigManager& config) :
mEnumerator(enumerator), mCameraDesc(camDesc), mConfig(config) {
// Find and store the target camera configuration
const auto& camList = mConfig.getCameras();
const auto target = std::find_if(camList.begin(), camList.end(),
[this](const ConfigManager::CameraInfo& info) {
- return info.cameraId == mCameraDesc.v1.cameraId;
+ return info.cameraId == mCameraDesc.id;
});
if (target != camList.end()) {
// Store the info
@@ -114,15 +123,15 @@
}
// This client always wants below input data format
- targetCfg->format = static_cast<PixelFormat>(HAL_PIXEL_FORMAT_RGBA_8888);
+ targetCfg->format = aidl::android::hardware::graphics::common::PixelFormat::RGBA_8888;
// Construct our video texture
- mTexture.reset(createVideoTexture(mEnumerator, mCameraDesc.v1.cameraId.c_str(),
+ mTexture.reset(createVideoTexture(mEnumerator, mCameraDesc.id.c_str(),
foundCfg ? std::move(targetCfg) : nullptr, sDisplay,
mConfig.getUseExternalMemory(),
mConfig.getExternalMemoryFormat()));
if (!mTexture) {
- LOG(ERROR) << "Failed to set up video texture for " << mCameraDesc.v1.cameraId;
+ LOG(ERROR) << "Failed to set up video texture for " << mCameraDesc.id;
// TODO(b/237904870): We may want to return false here.
}
diff --git a/cpp/evs/apps/default/RenderPixelCopy.cpp b/cpp/evs/apps/default/src/RenderPixelCopy.cpp
similarity index 72%
rename from cpp/evs/apps/default/RenderPixelCopy.cpp
rename to cpp/evs/apps/default/src/RenderPixelCopy.cpp
index e264e1e..04b7f36 100644
--- a/cpp/evs/apps/default/RenderPixelCopy.cpp
+++ b/cpp/evs/apps/default/src/RenderPixelCopy.cpp
@@ -17,10 +17,26 @@
#include "RenderPixelCopy.h"
#include "FormatConvert.h"
+#include "Utils.h"
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidl/android/hardware/automotive/evs/Stream.h>
+#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
+#include <android-base/scopeguard.h>
+#include <android/binder_manager.h>
-RenderPixelCopy::RenderPixelCopy(android::sp<IEvsEnumerator> enumerator,
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
+
+} // namespace
+
+RenderPixelCopy::RenderPixelCopy(std::shared_ptr<IEvsEnumerator> enumerator,
const ConfigManager::CameraInfo& cam) {
mEnumerator = enumerator;
mCameraInfo = cam;
@@ -28,18 +44,18 @@
bool RenderPixelCopy::activate() {
// Set up the camera to feed this texture
- android::sp<IEvsCamera> pCamera =
- IEvsCamera::castFrom(mEnumerator->openCamera(mCameraInfo.cameraId.c_str()))
- .withDefault(nullptr);
-
- if (pCamera.get() == nullptr) {
+ Stream emptyConfig;
+ std::shared_ptr<IEvsCamera> pCamera;
+ if (auto status = mEnumerator->openCamera(mCameraInfo.cameraId.c_str(), emptyConfig, &pCamera);
+ !status.isOk()) {
LOG(ERROR) << "Failed to allocate new EVS Camera interface";
return false;
}
// Initialize the stream that will help us update this texture's contents
- android::sp<StreamHandler> pStreamHandler = new StreamHandler(pCamera);
- if (pStreamHandler.get() == nullptr) {
+ std::shared_ptr<StreamHandler> pStreamHandler =
+ ndk::SharedRefBase::make<StreamHandler>(pCamera);
+ if (!pStreamHandler) {
LOG(ERROR) << "Failed to allocate FrameHandler";
return false;
}
@@ -51,21 +67,27 @@
}
mStreamHandler = pStreamHandler;
-
return true;
}
void RenderPixelCopy::deactivate() {
- mStreamHandler = nullptr;
+ mStreamHandler.reset();
}
bool RenderPixelCopy::drawFrame(const BufferDesc& tgtBuffer) {
bool success = true;
+ native_handle_t* targetBufferNativeHandle = getNativeHandle(tgtBuffer);
+ if (targetBufferNativeHandle == nullptr) {
+ LOG(ERROR) << "Target buffer has an invalid native handle.";
+ return false;
+ }
+
+ const auto handleGuard = android::base::make_scope_guard(
+ [targetBufferNativeHandle] { free(targetBufferNativeHandle); });
const AHardwareBuffer_Desc* pTgtDesc =
reinterpret_cast<const AHardwareBuffer_Desc*>(&tgtBuffer.buffer.description);
-
android::sp<android::GraphicBuffer> tgt =
- new android::GraphicBuffer(tgtBuffer.buffer.nativeHandle,
+ new android::GraphicBuffer(targetBufferNativeHandle,
android::GraphicBuffer::CLONE_HANDLE, pTgtDesc->width,
pTgtDesc->height, pTgtDesc->format, pTgtDesc->layers,
pTgtDesc->usage, pTgtDesc->stride);
@@ -83,6 +105,14 @@
// Make sure we have the latest frame data
if (mStreamHandler->newFrameAvailable()) {
const BufferDesc& srcBuffer = mStreamHandler->getNewFrame();
+ native_handle_t* srcBufferNativeHandle = getNativeHandle(srcBuffer);
+ if (srcBufferNativeHandle == nullptr) {
+ LOG(ERROR) << "Target buffer has an invalid native handle.";
+ return false;
+ }
+
+ const auto handleGuard = android::base::make_scope_guard(
+ [srcBufferNativeHandle] { free(srcBufferNativeHandle); });
const AHardwareBuffer_Desc* pSrcDesc =
reinterpret_cast<const AHardwareBuffer_Desc*>(
&srcBuffer.buffer.description);
@@ -90,7 +120,7 @@
// Lock our source buffer for reading (current expectation are for this to be NV21
// format)
android::sp<android::GraphicBuffer> src =
- new android::GraphicBuffer(srcBuffer.buffer.nativeHandle,
+ new android::GraphicBuffer(srcBufferNativeHandle,
android::GraphicBuffer::CLONE_HANDLE,
pSrcDesc->width, pSrcDesc->height,
pSrcDesc->format, pSrcDesc->layers,
@@ -113,7 +143,7 @@
} else if (pSrcDesc->format == pTgtDesc->format) { // 32bit RGBA
copyMatchedInterleavedFormats(width, height, srcPixels, pSrcDesc->stride,
tgtPixels, pTgtDesc->stride,
- tgtBuffer.pixelSize);
+ tgtBuffer.pixelSizeBytes);
}
} else {
LOG(ERROR) << "Failed to get pointer into src image data";
diff --git a/cpp/evs/apps/default/RenderTopView.cpp b/cpp/evs/apps/default/src/RenderTopView.cpp
similarity index 95%
rename from cpp/evs/apps/default/RenderTopView.cpp
rename to cpp/evs/apps/default/src/RenderTopView.cpp
index b8afd9d..398cfb8 100644
--- a/cpp/evs/apps/default/RenderTopView.cpp
+++ b/cpp/evs/apps/default/src/RenderTopView.cpp
@@ -23,20 +23,21 @@
#include "shader_simpleTex.h"
#include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
#include <math/mat4.h>
#include <math/vec3.h>
-using ::android::hardware::camera::device::V3_2::Stream;
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
// Simple aliases to make geometric math using vectors more readable
-static const unsigned X = 0;
-static const unsigned Y = 1;
-static const unsigned Z = 2;
-// static const unsigned W = 3;
+const unsigned X = 0;
+const unsigned Y = 1;
+const unsigned Z = 2;
// Since we assume no roll in these views, we can simplify the required math
-static android::vec3 unitVectorFromPitchAndYaw(float pitch, float yaw) {
+android::vec3 unitVectorFromPitchAndYaw(float pitch, float yaw) {
float sinPitch, cosPitch;
sincosf(pitch, &sinPitch, &cosPitch);
float sinYaw, cosYaw;
@@ -46,7 +47,7 @@
// Helper function to set up a perspective matrix with independent horizontal and vertical
// angles of view.
-static android::mat4 perspective(float hfov, float vfov, float near, float far) {
+android::mat4 perspective(float hfov, float vfov, float near, float far) {
const float tanHalfFovX = tanf(hfov * 0.5f);
const float tanHalfFovY = tanf(vfov * 0.5f);
@@ -62,7 +63,7 @@
// Helper function to set up a view matrix for a camera given it's yaw & pitch & location
// Yes, with a bit of work, we could use lookAt, but it does a lot of extra work
// internally that we can short cut.
-static android::mat4 cameraLookMatrix(const ConfigManager::CameraInfo& cam) {
+android::mat4 cameraLookMatrix(const ConfigManager::CameraInfo& cam) {
float sinYaw, cosYaw;
sincosf(cam.yaw, &sinYaw, &cosYaw);
@@ -88,7 +89,9 @@
return Result;
}
-RenderTopView::RenderTopView(android::sp<IEvsEnumerator> enumerator,
+} // namespace
+
+RenderTopView::RenderTopView(std::shared_ptr<IEvsEnumerator> enumerator,
const std::vector<ConfigManager::CameraInfo>& camList,
const ConfigManager& mConfig) :
mEnumerator(enumerator), mConfig(mConfig) {
diff --git a/cpp/evs/apps/default/StreamHandler.cpp b/cpp/evs/apps/default/src/StreamHandler.cpp
similarity index 61%
rename from cpp/evs/apps/default/StreamHandler.cpp
rename to cpp/evs/apps/default/src/StreamHandler.cpp
index 28b3b9a..f37ecf5 100644
--- a/cpp/evs/apps/default/StreamHandler.cpp
+++ b/cpp/evs/apps/default/src/StreamHandler.cpp
@@ -16,6 +16,12 @@
#include "StreamHandler.h"
+#include "Utils.h"
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventDesc.h>
+#include <aidl/android/hardware/automotive/evs/EvsEventType.h>
+#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
#include <cutils/native_handle.h>
#include <ui/GraphicBufferAllocator.h>
@@ -23,12 +29,16 @@
#include <stdio.h>
#include <string.h>
-using ::android::hardware::automotive::evs::V1_0::EvsResult;
-using ::android::hardware::automotive::evs::V1_1::EvsEventType;
-using ::android::hardware::automotive::evs::V1_1::IEvsCameraStream;
+namespace {
-buffer_handle_t memHandle = nullptr;
-StreamHandler::StreamHandler(android::sp<IEvsCamera> pCamera, uint32_t numBuffers,
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::EvsEventDesc;
+using aidl::android::hardware::automotive::evs::EvsEventType;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+
+} // namespace
+
+StreamHandler::StreamHandler(const std::shared_ptr<IEvsCamera>& pCamera, uint32_t numBuffers,
bool useOwnBuffers, android_pixel_format_t format, int32_t width,
int32_t height) :
mCamera(pCamera), mUseOwnBuffers(useOwnBuffers) {
@@ -40,6 +50,7 @@
mOwnBuffers.resize(numBuffers);
// Acquire the graphics buffer allocator
+ buffer_handle_t memHandle = nullptr;
android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
const auto usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_RARELY |
GRALLOC_USAGE_SW_WRITE_OFTEN;
@@ -50,7 +61,7 @@
if (result != android::NO_ERROR) {
LOG(ERROR) << __FUNCTION__ << " failed to allocate memory.";
} else {
- BufferDesc_1_1 buf;
+ BufferDesc buf;
AHardwareBuffer_Desc* pDesc =
reinterpret_cast<AHardwareBuffer_Desc*>(&buf.buffer.description);
pDesc->width = width;
@@ -60,18 +71,17 @@
pDesc->usage = GRALLOC_USAGE_HW_TEXTURE | GRALLOC_USAGE_SW_READ_RARELY |
GRALLOC_USAGE_SW_WRITE_OFTEN;
pDesc->stride = pixelsPerLine;
- buf.buffer.nativeHandle = memHandle;
+ buf.buffer.handle = android::dupToAidl(memHandle);
buf.bufferId = i; // Unique number to identify this buffer
- mOwnBuffers[i] = buf;
+ mOwnBuffers[i] = std::move(buf);
}
}
int delta = 0;
- EvsResult result = EvsResult::OK;
- pCamera->importExternalBuffers(mOwnBuffers, [&](auto _result, auto _delta) {
- result = _result;
- delta = _delta;
- });
+ if (auto status = pCamera->importExternalBuffers(mOwnBuffers, &delta); !status.isOk()) {
+ PLOG(ERROR) << "Failed to import buffers.";
+ return;
+ }
LOG(INFO) << delta << " buffers are imported by EVS.";
}
@@ -85,37 +95,41 @@
// our remote object references so they can be freed
mCamera = nullptr;
- if (mUseOwnBuffers) {
- android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
- for (auto& b : mOwnBuffers) {
- alloc.free(b.buffer.nativeHandle);
- }
-
- mOwnBuffers.resize(0);
+ if (!mUseOwnBuffers) {
+ return;
}
+
+ android::GraphicBufferAllocator& alloc(android::GraphicBufferAllocator::get());
+ for (auto& b : mOwnBuffers) {
+ alloc.free(android::makeFromAidl(b.buffer.handle));
+ }
+
+ mOwnBuffers.resize(0);
}
bool StreamHandler::startStream() {
- std::unique_lock<std::mutex> lock(mLock);
-
- if (!mRunning) {
- // Tell the camera to start streaming
- Return<EvsResult> result = mCamera->startVideoStream(this);
- if (result != EvsResult::OK) {
- return false;
- }
-
- // Mark ourselves as running
- mRunning = true;
+ std::lock_guard lock(mLock);
+ if (mRunning) {
+ return true;
}
+ // Tell the camera to start streaming
+ if (auto status = mCamera->startVideoStream(ref<StreamHandler>()); !status.isOk()) {
+ LOG(ERROR) << "Failed to request a video stream.";
+ return false;
+ }
+
+ // Mark ourselves as running
+ mRunning = true;
return true;
}
void StreamHandler::asyncStopStream() {
// Tell the camera to stop streaming.
// This will result in a null frame being delivered when the stream actually stops.
- mCamera->stopVideoStream();
+ if (auto status = mCamera->stopVideoStream(); !status.isOk()) {
+ LOG(WARNING) << "Failed to stop a video stream.";
+ }
}
void StreamHandler::blockingStopStream() {
@@ -123,24 +137,24 @@
asyncStopStream();
// Wait until the stream has actually stopped
- std::unique_lock<std::mutex> lock(mLock);
+ std::unique_lock lock(mLock);
if (mRunning) {
mSignal.wait(lock, [this]() { return !mRunning; });
}
}
bool StreamHandler::isRunning() {
- std::unique_lock<std::mutex> lock(mLock);
+ std::lock_guard lock(mLock);
return mRunning;
}
bool StreamHandler::newFrameAvailable() {
- std::unique_lock<std::mutex> lock(mLock);
+ std::lock_guard lock(mLock);
return (mReadyBuffer >= 0);
}
-const BufferDesc_1_1& StreamHandler::getNewFrame() {
- std::unique_lock<std::mutex> lock(mLock);
+const BufferDesc& StreamHandler::getNewFrame() {
+ std::lock_guard lock(mLock);
if (mHeldBuffer >= 0) {
LOG(ERROR) << "Ignored call for new frame while still holding the old one.";
@@ -159,20 +173,25 @@
return mBuffers[mHeldBuffer];
}
-void StreamHandler::doneWithFrame(const BufferDesc_1_1& bufDesc_1_1) {
- std::unique_lock<std::mutex> lock(mLock);
+void StreamHandler::doneWithFrame(const BufferDesc& bufDesc) {
+ std::lock_guard lock(mLock);
// We better be getting back the buffer we original delivered!
- if ((mHeldBuffer < 0) || (bufDesc_1_1.bufferId != mBuffers[mHeldBuffer].bufferId)) {
- LOG(ERROR) << "StreamHandler::doneWithFrame got an unexpected bufDesc_1_1!";
+ if (mHeldBuffer < 0) {
+ // Safely ignores a call with an invalid buffer reference.
+ return;
+ }
+
+ if (bufDesc.bufferId != mBuffers[mHeldBuffer].bufferId) {
+ LOG(WARNING) << __FUNCTION__ << " ignores an unexpected buffer; expected = "
+ << mBuffers[mHeldBuffer].bufferId << ", received = " << bufDesc.bufferId;
+ return;
}
// Send the buffer back to the underlying camera
- hidl_vec<BufferDesc_1_1> frames;
- frames.resize(1);
- frames[0] = mBuffers[mHeldBuffer];
- auto ret = mCamera->doneWithFrame_1_1(frames);
- if (!ret.isOk()) {
+ std::vector<BufferDesc> frames(1);
+ frames[0] = std::move(mBuffers[mHeldBuffer]);
+ if (auto status = mCamera->doneWithFrame(frames); !status.isOk()) {
LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
}
@@ -180,59 +199,42 @@
mHeldBuffer = -1;
}
-Return<void> StreamHandler::deliverFrame(const BufferDesc_1_0& bufDesc_1_0) {
- LOG(INFO) << "Ignores a frame delivered from v1.0 EVS service.";
- auto ret = mCamera->doneWithFrame(bufDesc_1_0);
- if (!ret.isOk()) {
- LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
- }
-
- return Void();
-}
-
-Return<void> StreamHandler::deliverFrame_1_1(const hidl_vec<BufferDesc_1_1>& buffers) {
+ndk::ScopedAStatus StreamHandler::deliverFrame(const std::vector<BufferDesc>& buffers) {
LOG(DEBUG) << "Received frames from the camera";
// Take the lock to protect our frame slots and running state variable
- std::unique_lock<std::mutex> lock(mLock);
- BufferDesc_1_1 bufDesc = buffers[0];
- if (bufDesc.buffer.nativeHandle.getNativeHandle() == nullptr) {
- // Signal that the last frame has been received and the stream is stopped
- LOG(WARNING) << "Invalid null frame (id: " << std::hex << bufDesc.bufferId
- << ") is ignored";
- } else {
- // Do we already have a "ready" frame?
- if (mReadyBuffer >= 0) {
- // Send the previously saved buffer back to the camera unused
- hidl_vec<BufferDesc_1_1> frames;
- frames.resize(1);
- frames[0] = mBuffers[mReadyBuffer];
- auto ret = mCamera->doneWithFrame_1_1(frames);
- if (!ret.isOk()) {
- LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
- }
+ std::unique_lock lock(mLock);
+ const BufferDesc& bufferToUse = buffers[0];
- // We'll reuse the same ready buffer index
- } else if (mHeldBuffer >= 0) {
- // The client is holding a buffer, so use the other slot for "on deck"
- mReadyBuffer = 1 - mHeldBuffer;
- } else {
- // This is our first buffer, so just pick a slot
- mReadyBuffer = 0;
+ // Do we already have a "ready" frame?
+ if (mReadyBuffer >= 0) {
+ // Send the previously saved buffer back to the camera unused
+ std::vector<BufferDesc> frames(1);
+ frames[0] = std::move(mBuffers[mReadyBuffer]);
+ if (auto status = mCamera->doneWithFrame(frames); !status.isOk()) {
+ LOG(WARNING) << __FUNCTION__ << " fails to return a buffer";
}
- // Save this frame until our client is interested in it
- mBuffers[mReadyBuffer] = bufDesc;
+ // We'll reuse the same ready buffer index
+ } else if (mHeldBuffer >= 0) {
+ // The client is holding a buffer, so use the other slot for "on deck"
+ mReadyBuffer = 1 - mHeldBuffer;
+ } else {
+ // This is our first buffer, so just pick a slot
+ mReadyBuffer = 0;
}
- // Notify anybody who cares that things have changed
- lock.unlock();
- mSignal.notify_all();
+ // Save this frame until our client is interested in it
+ mBuffers[mReadyBuffer] = dupBufferDesc(bufferToUse);
- return Void();
+ // Notify anybody who cares that things have changed
+ mSignal.notify_all();
+ lock.unlock();
+
+ return ndk::ScopedAStatus::ok();
}
-Return<void> StreamHandler::notify(const EvsEventDesc& event) {
+ndk::ScopedAStatus StreamHandler::notify(const EvsEventDesc& event) {
switch (event.aType) {
case EvsEventType::STREAM_STOPPED: {
{
@@ -264,5 +266,5 @@
break;
}
- return Void();
+ return ndk::ScopedAStatus::ok();
}
diff --git a/cpp/evs/apps/default/TexWrapper.cpp b/cpp/evs/apps/default/src/TexWrapper.cpp
similarity index 100%
rename from cpp/evs/apps/default/TexWrapper.cpp
rename to cpp/evs/apps/default/src/TexWrapper.cpp
diff --git a/cpp/evs/apps/default/src/Utils.cpp b/cpp/evs/apps/default/src/Utils.cpp
new file mode 100644
index 0000000..47e7356
--- /dev/null
+++ b/cpp/evs/apps/default/src/Utils.cpp
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "Utils.h"
+
+#include <aidl/android/hardware/automotive/evs/BufferDesc.h>
+#include <aidlcommonsupport/NativeHandle.h>
+#include <android-base/logging.h>
+
+namespace {
+
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::common::NativeHandle;
+using aidl::android::hardware::graphics::common::HardwareBuffer;
+
+NativeHandle dupNativeHandle(const NativeHandle& handle) {
+ NativeHandle dup;
+
+ dup.fds = std::vector<::ndk::ScopedFileDescriptor>(handle.fds.size());
+ const size_t n = handle.fds.size();
+ for (size_t i = 0; i < n; ++i) {
+ dup.fds[i] = std::move(handle.fds[i].dup());
+ }
+ dup.ints = handle.ints;
+
+ return std::move(dup);
+}
+
+HardwareBuffer dupHardwareBuffer(const HardwareBuffer& buffer) {
+ HardwareBuffer dup = {
+ .description = buffer.description,
+ .handle = dupNativeHandle(buffer.handle),
+ };
+
+ return std::move(dup);
+}
+
+} // namespace
+
+BufferDesc dupBufferDesc(const BufferDesc& src) {
+ BufferDesc dup = {
+ .buffer = dupHardwareBuffer(src.buffer),
+ .pixelSizeBytes = src.pixelSizeBytes,
+ .bufferId = src.bufferId,
+ .deviceId = src.deviceId,
+ .timestamp = src.timestamp,
+ .metadata = src.metadata,
+ };
+
+ return std::move(dup);
+}
+
+native_handle_t* getNativeHandle(const BufferDesc& buffer) {
+ native_handle_t* nativeHandle = android::makeFromAidl(buffer.buffer.handle);
+ if (nativeHandle == nullptr ||
+ !std::all_of(nativeHandle->data + 0, nativeHandle->data + nativeHandle->numFds,
+ [](int fd) { return fd >= 0; })) {
+ LOG(ERROR) << "Buffer " << buffer.bufferId << " contains an invalid native handle.";
+ free(nativeHandle);
+ return nullptr;
+ }
+
+ return nativeHandle;
+}
diff --git a/cpp/evs/apps/default/VideoTex.cpp b/cpp/evs/apps/default/src/VideoTex.cpp
similarity index 68%
rename from cpp/evs/apps/default/VideoTex.cpp
rename to cpp/evs/apps/default/src/VideoTex.cpp
index df795c5..07abbee 100644
--- a/cpp/evs/apps/default/VideoTex.cpp
+++ b/cpp/evs/apps/default/src/VideoTex.cpp
@@ -15,10 +15,14 @@
*/
#include "VideoTex.h"
+#include "Utils.h"
#include "glError.h"
+#include <aidl/android/hardware/automotive/evs/IEvsCamera.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
+#include <aidlcommonsupport/NativeHandle.h>
#include <android-base/logging.h>
-#include <android/hardware/camera/device/3.2/ICameraDevice.h>
+#include <android-base/scopeguard.h>
#include <ui/GraphicBuffer.h>
#include <alloca.h>
@@ -29,15 +33,18 @@
#include <sys/ioctl.h>
#include <unistd.h>
-#include <vector>
+namespace {
-// Eventually we shouldn't need this dependency, but for now the
-// graphics allocator interface isn't fully supported on all platforms
-// and this is our work around.
-using ::android::GraphicBuffer;
+using aidl::android::hardware::automotive::evs::BufferDesc;
+using aidl::android::hardware::automotive::evs::IEvsCamera;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::evs::Stream;
+using android::GraphicBuffer;
-VideoTex::VideoTex(android::sp<IEvsEnumerator> pEnum, android::sp<IEvsCamera> pCamera,
- android::sp<StreamHandler> pStreamHandler, EGLDisplay glDisplay) :
+} // namespace
+
+VideoTex::VideoTex(std::shared_ptr<IEvsEnumerator> pEnum, std::shared_ptr<IEvsCamera> pCamera,
+ std::shared_ptr<StreamHandler> pStreamHandler, EGLDisplay glDisplay) :
TexWrapper(),
mEnumerator(pEnum),
mCamera(pCamera),
@@ -68,7 +75,7 @@
}
// If we already have an image backing us, then it's time to return it
- if (mImageBuffer.buffer.nativeHandle.getNativeHandle() != nullptr) {
+ if (getNativeHandle(mImageBuffer) != nullptr) {
// Drop our device texture image
if (mKHRimage != EGL_NO_IMAGE_KHR) {
eglDestroyImageKHR(mDisplay, mKHRimage);
@@ -80,17 +87,25 @@
}
// Get the new image we want to use as our contents
- mImageBuffer = mStreamHandler->getNewFrame();
+ mImageBuffer = dupBufferDesc(mStreamHandler->getNewFrame());
// create a GraphicBuffer from the existing handle
+ native_handle_t* nativeHandle = getNativeHandle(mImageBuffer);
+ const auto handleGuard =
+ android::base::make_scope_guard([nativeHandle] { free(nativeHandle); });
+ if (nativeHandle == nullptr) {
+ // New frame contains an invalid native handle.
+ return false;
+ }
+
const AHardwareBuffer_Desc* pDesc =
reinterpret_cast<const AHardwareBuffer_Desc*>(&mImageBuffer.buffer.description);
- android::sp<GraphicBuffer> pGfxBuffer =
- new GraphicBuffer(mImageBuffer.buffer.nativeHandle, GraphicBuffer::CLONE_HANDLE,
- pDesc->width, pDesc->height, pDesc->format,
+ android::sp<GraphicBuffer> pGfxBuffer = // AHardwareBuffer_to_GraphicBuffer?
+ new GraphicBuffer(nativeHandle, GraphicBuffer::CLONE_HANDLE, pDesc->width,
+ pDesc->height, pDesc->format,
1, // pDesc->layers,
GRALLOC_USAGE_HW_TEXTURE, pDesc->stride);
- if (pGfxBuffer.get() == nullptr) {
+ if (!pGfxBuffer) {
LOG(ERROR) << "Failed to allocate GraphicBuffer to wrap image handle";
// Returning "true" in this error condition because we already released the
// previous image (if any) and so the texture may change in unpredictable ways now!
@@ -124,35 +139,27 @@
return true;
}
-VideoTex* createVideoTexture(android::sp<IEvsEnumerator> pEnum, const char* evsCameraId,
+VideoTex* createVideoTexture(const std::shared_ptr<IEvsEnumerator>& pEnum, const char* evsCameraId,
std::unique_ptr<Stream> streamCfg, EGLDisplay glDisplay,
bool useExternalMemory, android_pixel_format_t format) {
// Set up the camera to feed this texture
- android::sp<IEvsCamera> pCamera = nullptr;
- android::sp<StreamHandler> pStreamHandler = nullptr;
- if (streamCfg != nullptr) {
- pCamera = pEnum->openCamera_1_1(evsCameraId, *streamCfg);
-
- // Initialize the stream that will help us update this texture's contents
- pStreamHandler =
- new StreamHandler(pCamera,
- 2, // number of buffers
- useExternalMemory, format, streamCfg->width, streamCfg->height);
- } else {
- pCamera = IEvsCamera::castFrom(pEnum->openCamera(evsCameraId)).withDefault(nullptr);
-
- // Initialize the stream with the default resolution
- pStreamHandler = new StreamHandler(pCamera,
- 2, // number of buffers
- useExternalMemory, format);
- }
-
- if (pCamera == nullptr) {
- LOG(ERROR) << "Failed to allocate new EVS Camera interface for " << evsCameraId;
+ std::shared_ptr<IEvsCamera> pCamera;
+ std::shared_ptr<StreamHandler> pStreamHandler;
+ if (!streamCfg) {
+ LOG(ERROR) << "Given stream configuration is invalid.";
return nullptr;
}
- if (pStreamHandler == nullptr) {
+ if (auto status = pEnum->openCamera(evsCameraId, *streamCfg, &pCamera); !status.isOk()) {
+ LOG(ERROR) << "Failed to open a camera " << evsCameraId;
+ return nullptr;
+ }
+
+ // Initialize the stream that will help us update this texture's contents
+ pStreamHandler =
+ ndk::SharedRefBase::make<StreamHandler>(pCamera, /* numBuffers= */ 2, useExternalMemory,
+ format, streamCfg->width, streamCfg->height);
+ if (!pStreamHandler) {
LOG(ERROR) << "Failed to allocate FrameHandler";
return nullptr;
}
diff --git a/cpp/evs/apps/default/evs_app.cpp b/cpp/evs/apps/default/src/evs_app.cpp
similarity index 82%
rename from cpp/evs/apps/default/evs_app.cpp
rename to cpp/evs/apps/default/src/evs_app.cpp
index 27bca9f..d4385d5 100644
--- a/cpp/evs/apps/default/evs_app.cpp
+++ b/cpp/evs/apps/default/src/evs_app.cpp
@@ -18,17 +18,16 @@
#include "EvsStateControl.h"
#include "EvsVehicleListener.h"
+#include <aidl/android/hardware/automotive/evs/IEvsDisplay.h>
+#include <aidl/android/hardware/automotive/evs/IEvsEnumerator.h>
#include <aidl/android/hardware/automotive/vehicle/SubscribeOptions.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleGear.h>
#include <aidl/android/hardware/automotive/vehicle/VehicleProperty.h>
#include <android-base/logging.h>
-#include <android-base/macros.h> // arraysize
#include <android-base/strings.h>
-#include <android/hardware/automotive/evs/1.1/IEvsDisplay.h>
-#include <android/hardware/automotive/evs/1.1/IEvsEnumerator.h>
-#include <hidl/HidlTransportSupport.h>
-#include <hwbinder/IPCThreadState.h>
-#include <hwbinder/ProcessState.h>
+#include <android/binder_ibinder.h>
+#include <android/binder_manager.h>
+#include <android/binder_process.h>
#include <utils/Errors.h>
#include <utils/Log.h>
#include <utils/StrongPointer.h>
@@ -39,27 +38,23 @@
namespace {
-using ::aidl::android::hardware::automotive::vehicle::VehicleGear;
-using ::aidl::android::hardware::automotive::vehicle::VehicleProperty;
-using ::android::base::EqualsIgnoreCase;
+using aidl::android::hardware::automotive::evs::IEvsDisplay;
+using aidl::android::hardware::automotive::evs::IEvsEnumerator;
+using aidl::android::hardware::automotive::vehicle::VehicleGear;
+using aidl::android::hardware::automotive::vehicle::VehicleProperty;
+using android::base::EqualsIgnoreCase;
+using android::frameworks::automotive::vhal::ISubscriptionClient;
+using android::frameworks::automotive::vhal::IVhalClient;
-// libhidl:
-using ::android::frameworks::automotive::vhal::ISubscriptionClient;
-using ::android::frameworks::automotive::vhal::IVhalClient;
-using ::android::hardware::configureRpcThreadpool;
-using ::android::hardware::joinRpcThreadpool;
+const char CONFIG_DEFAULT_PATH[] = "/system/etc/automotive/evs/config.json";
+const char CONFIG_OVERRIDE_PATH[] = "/system/etc/automotive/evs/config_override.json";
-const char* CONFIG_DEFAULT_PATH = "/system/etc/automotive/evs/config.json";
-const char* CONFIG_OVERRIDE_PATH = "/system/etc/automotive/evs/config_override.json";
-
-android::sp<IEvsEnumerator> pEvs;
-android::sp<IEvsDisplay> pDisplay;
+std::shared_ptr<IEvsEnumerator> pEvsService;
+std::shared_ptr<IEvsDisplay> pDisplay;
EvsStateControl* pStateController;
-} // namespace
-
-// Helper to subscribe to VHal notifications
-static bool subscribeToVHal(ISubscriptionClient* client, VehicleProperty propertyId) {
+// Helper to subscribe to Vhal notifications
+bool subscribeToVHal(ISubscriptionClient* client, VehicleProperty propertyId) {
assert(pVnet != nullptr);
assert(listener != nullptr);
@@ -80,7 +75,7 @@
return true;
}
-static bool convertStringToFormat(const char* str, android_pixel_format_t* output) {
+bool convertStringToFormat(const char* str, android_pixel_format_t* output) {
bool result = true;
if (EqualsIgnoreCase(str, "RGBA8888")) {
*output = HAL_PIXEL_FORMAT_RGBA_8888;
@@ -97,6 +92,8 @@
return result;
}
+} // namespace
+
// Main entry point
int main(int argc, char** argv) {
LOG(INFO) << "EVS app starting";
@@ -192,16 +189,28 @@
// This pool will handle the EvsCameraStream callbacks.
// Note: This _will_ run in parallel with the EvsListener run() loop below which
// runs the application logic that reacts to the async events.
- configureRpcThreadpool(1, false /* callerWillJoin */);
+ if (!ABinderProcess_setThreadPoolMaxThreadCount(/* numThreads= */ 1)) {
+ LOG(ERROR) << "Failed to confgiure the binder thread pool.";
+ return EXIT_FAILURE;
+ }
+ ABinderProcess_startThreadPool();
// Construct our async helper object
std::shared_ptr<EvsVehicleListener> pEvsListener = std::make_shared<EvsVehicleListener>();
// Get the EVS manager service
LOG(INFO) << "Acquiring EVS Enumerator";
- pEvs = IEvsEnumerator::getService(evsServiceName);
- if (pEvs.get() == nullptr) {
- LOG(ERROR) << "getService(" << evsServiceName << ") returned NULL. Exiting.";
+ std::string serviceName =
+ std::string(IEvsEnumerator::descriptor) + "/" + std::string(evsServiceName);
+ if (!AServiceManager_isDeclared(serviceName.c_str())) {
+ LOG(ERROR) << serviceName << " is not declared. Exiting.";
+ return EXIT_FAILURE;
+ }
+
+ pEvsService = IEvsEnumerator::fromBinder(
+ ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str())));
+ if (!pEvsService) {
+ LOG(ERROR) << "Failed to get " << serviceName << ". Exiting.";
return EXIT_FAILURE;
}
@@ -215,8 +224,7 @@
return EXIT_FAILURE;
}
- pDisplay = pEvs->openDisplay_1_1(displayId);
- if (pDisplay.get() == nullptr) {
+ if (auto status = pEvsService->openDisplay(displayId, &pDisplay); !status.isOk()) {
LOG(ERROR) << "EVS Display unavailable. Exiting.";
return EXIT_FAILURE;
}
@@ -253,7 +261,7 @@
// Configure ourselves for the current vehicle state at startup
LOG(INFO) << "Constructing state controller";
- pStateController = new EvsStateControl(pVnet, pEvs, pDisplay, config);
+ pStateController = new EvsStateControl(pVnet, pEvsService, pDisplay, config);
if (!pStateController->startUpdateLoop()) {
LOG(ERROR) << "Initial configuration failed. Exiting.";
return EXIT_FAILURE;
diff --git a/cpp/evs/apps/default/glError.cpp b/cpp/evs/apps/default/src/glError.cpp
similarity index 100%
rename from cpp/evs/apps/default/glError.cpp
rename to cpp/evs/apps/default/src/glError.cpp
diff --git a/cpp/evs/apps/default/shader.cpp b/cpp/evs/apps/default/src/shader.cpp
similarity index 85%
rename from cpp/evs/apps/default/shader.cpp
rename to cpp/evs/apps/default/src/shader.cpp
index aa993c0..90fd1d0 100644
--- a/cpp/evs/apps/default/shader.cpp
+++ b/cpp/evs/apps/default/src/shader.cpp
@@ -100,27 +100,30 @@
return 0;
}
-#if 0 // Debug output to diagnose shader parameters
+#if defined(DEBUG) // Debug output to diagnose shader parameters
GLint numShaderParams;
GLchar paramName[128];
GLint paramSize;
GLenum paramType;
- const char *typeName = "?";
+ const char* typeName = "?";
printf("Shader parameters for %s:\n", name);
glGetProgramiv(program, GL_ACTIVE_UNIFORMS, &numShaderParams);
- for (GLint i=0; i<numShaderParams; i++) {
- glGetActiveUniform(program,
- i,
- sizeof(paramName),
- nullptr,
- ¶mSize,
- ¶mType,
+ for (GLint i = 0; i < numShaderParams; i++) {
+ glGetActiveUniform(program, i, sizeof(paramName), nullptr, ¶mSize, ¶mType,
paramName);
switch (paramType) {
- case GL_FLOAT: typeName = "GL_FLOAT"; break;
- case GL_FLOAT_VEC4: typeName = "GL_FLOAT_VEC4"; break;
- case GL_FLOAT_MAT4: typeName = "GL_FLOAT_MAT4"; break;
- case GL_SAMPLER_2D: typeName = "GL_SAMPLER_2D"; break;
+ case GL_FLOAT:
+ typeName = "GL_FLOAT";
+ break;
+ case GL_FLOAT_VEC4:
+ typeName = "GL_FLOAT_VEC4";
+ break;
+ case GL_FLOAT_MAT4:
+ typeName = "GL_FLOAT_MAT4";
+ break;
+ case GL_SAMPLER_2D:
+ typeName = "GL_SAMPLER_2D";
+ break;
}
printf(" %2d: %s\t (%d) of type %s(%d)\n", i, paramName, paramSize, typeName, paramType);
diff --git a/cpp/watchdog/server/src/WatchdogProcessService.cpp b/cpp/watchdog/server/src/WatchdogProcessService.cpp
index 914d462..01c746e 100644
--- a/cpp/watchdog/server/src/WatchdogProcessService.cpp
+++ b/cpp/watchdog/server/src/WatchdogProcessService.cpp
@@ -71,6 +71,7 @@
using ::android::binder::Status;
using ::android::frameworks::automotive::vhal::HalPropError;
using ::android::frameworks::automotive::vhal::IHalPropValue;
+using ::android::frameworks::automotive::vhal::ISubscriptionClient;
using ::android::frameworks::automotive::vhal::IVhalClient;
using ::android::hardware::hidl_vec;
using ::android::hardware::interfacesEqual;
@@ -535,39 +536,45 @@
}
void WatchdogProcessService::terminate() {
- Mutex::Autolock lock(mMutex);
- if (!mServiceStarted) {
- return;
- }
- for (auto& [_, clients] : mClientsByTimeout) {
- for (auto& [_, client] : clients) {
- client.unlinkToDeath(mBinderDeathRecipient.get());
+ std::unique_ptr<ISubscriptionClient> propertySubscriptionClient;
+ {
+ Mutex::Autolock lock(mMutex);
+ if (!mServiceStarted) {
+ return;
}
- clients.clear();
+ for (auto& [_, clients] : mClientsByTimeout) {
+ for (auto& [_, client] : clients) {
+ client.unlinkToDeath(mBinderDeathRecipient.get());
+ }
+ clients.clear();
+ }
+ mClientsByTimeout.clear();
+ mWatchdogServiceHelper.clear();
+ if (mMonitor != nullptr) {
+ AIBinder* aiBinder = mMonitor->asBinder().get();
+ mDeathRegistrationWrapper->unlinkToDeath(aiBinder, mBinderDeathRecipient.get(),
+ static_cast<void*>(aiBinder));
+ mMonitor.reset();
+ }
+ mHandlerLooper->removeMessages(mMessageHandler, MSG_VHAL_HEALTH_CHECK);
+ mServiceStarted = false;
+ if (mVhalService == nullptr) {
+ return;
+ }
+ if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) == 0) {
+ propertySubscriptionClient =
+ mVhalService->getSubscriptionClient(mPropertyChangeListener);
+ }
+ mVhalService->removeOnBinderDiedCallback(mOnBinderDiedCallback);
+ mVhalService.reset();
}
- mClientsByTimeout.clear();
- mWatchdogServiceHelper.clear();
- if (mMonitor != nullptr) {
- AIBinder* aiBinder = mMonitor->asBinder().get();
- mDeathRegistrationWrapper->unlinkToDeath(aiBinder, mBinderDeathRecipient.get(),
- static_cast<void*>(aiBinder));
- mMonitor.reset();
- }
- mHandlerLooper->removeMessages(mMessageHandler, MSG_VHAL_HEALTH_CHECK);
- mServiceStarted = false;
- if (mVhalService == nullptr) {
- return;
- }
- if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) == 0) {
+ if (propertySubscriptionClient != nullptr) {
std::vector<int32_t> propIds = {static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT)};
- auto result =
- mVhalService->getSubscriptionClient(mPropertyChangeListener)->unsubscribe(propIds);
+ auto result = propertySubscriptionClient->unsubscribe(propIds);
if (!result.ok()) {
ALOGW("Failed to unsubscribe from VHAL_HEARTBEAT.");
}
}
- mVhalService->removeOnBinderDiedCallback(mOnBinderDiedCallback);
- mVhalService.reset();
}
ScopedAStatus WatchdogProcessService::registerClient(const ClientInfo& clientInfo,
@@ -839,25 +846,29 @@
}
Result<void> WatchdogProcessService::updateVhal(const VehiclePropValue& value) {
- Mutex::Autolock lock(mMutex);
- const auto& connectRet = connectToVhalLocked();
+ const auto& connectRet = connectToVhal();
if (!connectRet.ok()) {
std::string errorMsg = "VHAL is not connected: " + connectRet.error().message();
ALOGW("%s", errorMsg.c_str());
return Error() << errorMsg;
}
int32_t propId = value.prop;
- if (mNotSupportedVhalProperties.count(static_cast<VehicleProperty>(propId)) > 0) {
- std::string errorMsg = StringPrintf("VHAL doesn't support property(id: %d)", propId);
- ALOGW("%s", errorMsg.c_str());
- return Error() << errorMsg;
+ std::shared_ptr<IVhalClient> vhalService;
+ {
+ Mutex::Autolock lock(mMutex);
+ if (mNotSupportedVhalProperties.count(static_cast<VehicleProperty>(propId)) > 0) {
+ std::string errorMsg = StringPrintf("VHAL doesn't support property(id: %d)", propId);
+ ALOGW("%s", errorMsg.c_str());
+ return Error() << errorMsg;
+ }
+ vhalService = mVhalService;
}
- auto halPropValue = mVhalService->createHalPropValue(propId);
+ auto halPropValue = vhalService->createHalPropValue(propId);
halPropValue->setInt32Values(value.value.int32Values);
halPropValue->setInt64Values(value.value.int64Values);
halPropValue->setStringValue(value.value.stringValue);
- if (auto result = mVhalService->setValueSync(*halPropValue); !result.ok()) {
+ if (auto result = vhalService->setValueSync(*halPropValue); !result.ok()) {
return Error() << "Failed to set propValue(" << propId
<< ") to VHAL, error: " << result.error().message();
}
@@ -876,55 +887,65 @@
return Error() << "Failed to read " << cmdLinePath;
}
-Result<void> WatchdogProcessService::connectToVhalLocked() {
- if (mVhalService != nullptr) {
- return {};
+Result<void> WatchdogProcessService::connectToVhal() {
+ {
+ Mutex::Autolock lock(mMutex);
+ if (mVhalService != nullptr) {
+ return {};
+ }
+ mVhalService = IVhalClient::tryCreate();
+ if (mVhalService == nullptr) {
+ return Error() << "Failed to connect to VHAL.";
+ }
+ mVhalService->addOnBinderDiedCallback(mOnBinderDiedCallback);
}
- mVhalService = IVhalClient::tryCreate();
- if (mVhalService == nullptr) {
- return Error() << "Failed to connect to VHAL.";
- }
- mVhalService->addOnBinderDiedCallback(mOnBinderDiedCallback);
- queryVhalPropertiesLocked();
- subscribeToVhalHeartBeatLocked();
+ queryVhalProperties();
+ subscribeToVhalHeartBeat();
ALOGI("Successfully connected to VHAL.");
return {};
}
-void WatchdogProcessService::queryVhalPropertiesLocked() {
- mNotSupportedVhalProperties.clear();
+void WatchdogProcessService::queryVhalProperties() {
+ std::shared_ptr<IVhalClient> vhalService;
+ {
+ Mutex::Autolock lock(mMutex);
+ vhalService = mVhalService;
+ }
+ std::unordered_set<VehicleProperty> notSupportedProperties;
std::vector<VehicleProperty> propIds = {VehicleProperty::WATCHDOG_ALIVE,
VehicleProperty::WATCHDOG_TERMINATED_PROCESS,
VehicleProperty::VHAL_HEARTBEAT};
for (const auto& propId : propIds) {
- if (!isVhalPropertySupportedLocked(propId)) {
- mNotSupportedVhalProperties.insert(propId);
+ if (auto result = vhalService->getPropConfigs({static_cast<int32_t>(propId)});
+ !result.ok()) {
+ notSupportedProperties.insert(propId);
}
}
-}
-
-bool WatchdogProcessService::isVhalPropertySupportedLocked(VehicleProperty propId) {
- auto result = mVhalService->getPropConfigs({static_cast<int32_t>(propId)});
- return result.ok();
-}
-
-void WatchdogProcessService::subscribeToVhalHeartBeatLocked() {
- if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) > 0) {
- ALOGW("VHAL doesn't support VHAL_HEARTBEAT. Checking VHAL health is disabled.");
- return;
+ {
+ Mutex::Autolock lock(mMutex);
+ mNotSupportedVhalProperties = std::move(notSupportedProperties);
}
+}
- mVhalHeartBeat = {
- .eventTime = 0,
- .value = 0,
- };
+void WatchdogProcessService::subscribeToVhalHeartBeat() {
+ std::unique_ptr<ISubscriptionClient> propertySubscriptionClient;
+ {
+ Mutex::Autolock lock(mMutex);
+ if (mNotSupportedVhalProperties.count(VehicleProperty::VHAL_HEARTBEAT) > 0) {
+ ALOGW("VHAL doesn't support VHAL_HEARTBEAT. Checking VHAL health is disabled.");
+ return;
+ }
+ mVhalHeartBeat = {
+ .eventTime = 0,
+ .value = 0,
+ };
+ propertySubscriptionClient = mVhalService->getSubscriptionClient(mPropertyChangeListener);
+ }
std::vector<SubscribeOptions> options = {
{.propId = static_cast<int32_t>(VehicleProperty::VHAL_HEARTBEAT), .areaIds = {}},
};
- if (auto result =
- mVhalService->getSubscriptionClient(mPropertyChangeListener)->subscribe(options);
- !result.ok()) {
+ if (auto result = propertySubscriptionClient->subscribe(options); !result.ok()) {
ALOGW("Failed to subscribe to VHAL_HEARTBEAT. Checking VHAL health is disabled. '%s'",
result.error().message().c_str());
return;
diff --git a/cpp/watchdog/server/src/WatchdogProcessService.h b/cpp/watchdog/server/src/WatchdogProcessService.h
index 5a942e0..d76f235 100644
--- a/cpp/watchdog/server/src/WatchdogProcessService.h
+++ b/cpp/watchdog/server/src/WatchdogProcessService.h
@@ -249,8 +249,8 @@
int32_t getNewSessionId();
android::base::Result<void> updateVhal(
const aidl::android::hardware::automotive::vehicle::VehiclePropValue& value);
- android::base::Result<void> connectToVhalLocked();
- void subscribeToVhalHeartBeatLocked();
+ android::base::Result<void> connectToVhal();
+ void subscribeToVhalHeartBeat();
std::optional<aidl::android::automotive::watchdog::internal::ProcessIdentifier>
cacheVhalProcessIdentifier();
void reportWatchdogAliveToVhal();
@@ -259,9 +259,7 @@
processesNotResponding);
android::base::Result<std::string> readProcCmdLine(int32_t pid);
void handleVhalDeath();
- void queryVhalPropertiesLocked();
- bool isVhalPropertySupportedLocked(
- aidl::android::hardware::automotive::vehicle::VehicleProperty propId);
+ void queryVhalProperties();
void updateVhalHeartBeat(int64_t value);
void checkVhalHealth();
void terminateVhal();
diff --git a/service-builtin/src/com/android/car/CarService.java b/service-builtin/src/com/android/car/CarService.java
index 30f57b9..42c3636 100644
--- a/service-builtin/src/com/android/car/CarService.java
+++ b/service-builtin/src/com/android/car/CarService.java
@@ -18,10 +18,19 @@
import android.content.Intent;
+import com.android.internal.os.BinderInternal;
+
/** Proxy service for CarServciceImpl */
public class CarService extends ServiceProxy {
+
+ // Binder threads are set to 31. system_server is also using 31.
+ // check sMaxBinderThreads in SystemServer.java
+ private static final int MAX_BINDER_THREADS = 31;
+
public CarService() {
super(UpdatablePackageDependency.CAR_SERVICE_IMPL_CLASS);
+ // Increase the number of binder threads in car service
+ BinderInternal.setMaxThreads(MAX_BINDER_THREADS);
}
@Override
diff --git a/service/res/values/config.xml b/service/res/values/config.xml
index f701543..82b530a 100644
--- a/service/res/values/config.xml
+++ b/service/res/values/config.xml
@@ -529,4 +529,9 @@
<!-- Related to OEM customization service. Default timeout for critical calls made by CarService
to OEM service. After this timeout, CarService would itself and OEM Service. -->
<integer name="config_oemCarService_crashCall_timeout_ms">10000</integer>
+
+ <!-- Related to OEM customization service. Default thread pool size for communicating with the
+ OEM Service. The value can only be between 8 and 16. If value is higher than 16, thread
+ pool size will be 16. If value is lower than 8, thread pool size will be 8.-->
+ <integer name="config_oemCarService_thread_pool_size">8</integer>
</resources>
diff --git a/service/res/values/overlayable.xml b/service/res/values/overlayable.xml
index 7b95ed1..7925093 100644
--- a/service/res/values/overlayable.xml
+++ b/service/res/values/overlayable.xml
@@ -115,6 +115,7 @@
<item type="integer" name="config_oemCarService_serviceReady_timeout_ms"/>
<item type="integer" name="config_oemCarService_regularCall_timeout_ms"/>
<item type="integer" name="config_oemCarService_crashCall_timeout_ms"/>
+ <item type="integer" name="config_oemCarService_thread_pool_size"/>
<!-- Params from config.xml that can be overlaid -->
<!-- XML files that can be overlaid -->
diff --git a/service/src/com/android/car/oem/CarOemProxyService.java b/service/src/com/android/car/oem/CarOemProxyService.java
index 6db8436..380270d 100644
--- a/service/src/com/android/car/oem/CarOemProxyService.java
+++ b/service/src/com/android/car/oem/CarOemProxyService.java
@@ -46,6 +46,7 @@
import com.android.car.R;
import com.android.car.internal.util.IndentingPrintWriter;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
@@ -132,7 +133,17 @@
private final IOemCarServiceCallback mOemCarServiceCallback = new IOemCarServiceCallbackImpl();
+ @VisibleForTesting
public CarOemProxyService(Context context) {
+ this(context, null);
+ }
+
+ @VisibleForTesting
+ public CarOemProxyService(Context context, CarOemProxyServiceHelper helper) {
+ this(context, helper, null);
+ }
+
+ public CarOemProxyService(Context context, CarOemProxyServiceHelper helper, Handler handler) {
// Bind to the OemCarService
mContext = context;
Resources res = mContext.getResources();
@@ -177,7 +188,7 @@
Slogf.i(TAG, "Binding to Oem Service with intent: %s", intent);
mHandlerThread = CarServiceUtils.getHandlerThread("car_oem_service");
- mHandler = new Handler(mHandlerThread.getLooper());
+ mHandler = handler == null ? new Handler(mHandlerThread.getLooper()) : handler;
mIsOemServiceBound = mContext.bindServiceAsUser(intent, mCarOemServiceConnection,
Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT, UserHandle.SYSTEM);
@@ -190,7 +201,7 @@
Slogf.e(TAG,
"Couldn't bound to OemCarService. Oem service feature is marked disabled.");
}
- mHelper = new CarOemProxyServiceHelper(mContext);
+ mHelper = helper == null ? new CarOemProxyServiceHelper(mContext) : helper;
}
private boolean isInvalidComponentName(Context context, String componentName) {
@@ -410,7 +421,7 @@
if (!mIsOemServiceConnected) {
Slogf.e(TAG, "OEM Service is not connected within: %dms, calling to crash CarService",
mOemServiceConnectionTimeoutMs);
- mHelper.crashCarService("Timeout Exception");
+ mHelper.crashCarService("OEM Service not connected");
}
}
@@ -437,7 +448,7 @@
if (!mIsOemServiceReady) {
Slogf.e(TAG, "OEM Service is not ready within: " + mOemServiceReadyTimeoutMs
+ "ms, calling to crash CarService");
- mHelper.crashCarService("Service not ready");
+ mHelper.crashCarService("OEM Service not ready");
}
}
Slogf.i(TAG, "OEM Service is ready.");
diff --git a/service/src/com/android/car/oem/CarOemProxyServiceHelper.java b/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
index ba19c94..1360435 100644
--- a/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
+++ b/service/src/com/android/car/oem/CarOemProxyServiceHelper.java
@@ -63,15 +63,22 @@
private static final int MAX_CIRCULAR_CALLS_PER_CALLER = 5;
private static final int MAX_CIRCULAR_CALL_TOTAL = 10;
+ private static final int MAX_THREAD_POOL_SIZE = 16;
+ private static final int MIN_THREAD_POOL_SIZE = 18;
private final Object mLock = new Object();
- // TODO(b/239607518):Resize threadpool using system property or dynamically if too many calls
- // are getting timed out.
- private static final int THREAD_POOL_SIZE = 5;
-
private final int mRegularCallTimeoutMs;
private final int mCrashCallTimeoutMs;
+ // Kept for dumping
+ private final int mThreadPoolSizeFromRRO;
+
+ // Thread pool size will be read from resource overlay. The default value is 8. The maximum
+ // and minimum thread pool size can be MAX_THREAD_POOL_SIZE and MIN_THREAD_POOL_SIZE
+ // respectively. If resource overlay value is more than MAX_THREAD_POOL_SIZE, then thread
+ // pool size will be MAX_THREAD_POOL_SIZE. If resource overlay value is less than
+ // MIN_THREAD_POOL_SIZE, then thread pool size will be MIN_THREAD_POOL_SIZE.
+ private final int mBinderDispatchThreadPoolSize;
/**
* This map would keep track of possible circular calls
@@ -102,13 +109,26 @@
private int mOemCarServicePid;
public CarOemProxyServiceHelper(Context context) {
- Slogf.i(TAG, "Creating thread pool of size %d", THREAD_POOL_SIZE);
- mThreadPool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
Resources res = context.getResources();
mRegularCallTimeoutMs = res
.getInteger(R.integer.config_oemCarService_regularCall_timeout_ms);
mCrashCallTimeoutMs = res
.getInteger(R.integer.config_oemCarService_crashCall_timeout_ms);
+ mThreadPoolSizeFromRRO = res
+ .getInteger(R.integer.config_oemCarService_thread_pool_size);
+ if (mThreadPoolSizeFromRRO > MAX_THREAD_POOL_SIZE) {
+ mBinderDispatchThreadPoolSize = MAX_THREAD_POOL_SIZE;
+ } else if (mThreadPoolSizeFromRRO < MIN_THREAD_POOL_SIZE) {
+ mBinderDispatchThreadPoolSize = MIN_THREAD_POOL_SIZE;
+ } else {
+ mBinderDispatchThreadPoolSize = mThreadPoolSizeFromRRO;
+ }
+
+ mThreadPool = Executors.newFixedThreadPool(mBinderDispatchThreadPoolSize);
+
+ Slogf.i(TAG, "RegularCallTimeoutMs: %d, CrashCallTimeoutMs: %d, ThreadPoolSizeFromRRO: %d,"
+ + " ThreadPoolSize: %d.", mRegularCallTimeoutMs,
+ mCrashCallTimeoutMs, mThreadPoolSizeFromRRO, mBinderDispatchThreadPoolSize);
}
/**
@@ -244,8 +264,6 @@
Slogf.e(TAG, "Current Circular Calls for %s is %d which is more than the limit %d."
+ " Calling to crash CarService", callerTag, (currentCircularCallForTag + 1),
MAX_CIRCULAR_CALLS_PER_CALLER);
- // TODO(b/239607309): Research how to dump stack on OEM service for debugging if
- // possible. One way is to get the OEM service stack as string from OEM service.
crashCarService("Max Circular call for " + callerTag);
}
@@ -418,6 +436,10 @@
}
writer.decreaseIndent();
}
+ writer.printf("mRegularCallTimeoutMs: %d\n", mRegularCallTimeoutMs);
+ writer.printf("mCrashCallTimeoutMs: %d\n", mCrashCallTimeoutMs);
+ writer.printf("mBinderDispatchThreadPoolSize: %d\n", mBinderDispatchThreadPoolSize);
+ writer.printf("ThreadPoolSizeFromRRO: %d\n", mThreadPoolSizeFromRRO);
}
writer.decreaseIndent();
}
diff --git a/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java b/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java
new file mode 100644
index 0000000..e9d2072
--- /dev/null
+++ b/tests/carservice_unit_test/src/com/android/car/oem/CarOemProxyServiceTest.java
@@ -0,0 +1,266 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.car.oem;
+
+import static com.android.compatibility.common.util.SystemUtil.eventually;
+import static com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import static org.junit.Assert.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.car.CarVersion;
+import android.car.builtin.content.pm.PackageManagerHelper;
+import android.car.oem.IOemCarAudioFocusService;
+import android.car.oem.IOemCarService;
+import android.car.oem.IOemCarServiceCallback;
+import android.car.test.mocks.AbstractExtendedMockitoTestCase;
+import android.car.test.mocks.JavaMockitoHelper;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.ServiceConnection;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.content.res.Resources;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.RemoteException;
+
+import com.android.car.R;
+import com.android.internal.annotations.GuardedBy;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+
+import java.io.FileDescriptor;
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+
+public final class CarOemProxyServiceTest extends AbstractExtendedMockitoTestCase {
+
+ private static final String COMPONENT_NAME = "android.car.test/unittest";
+
+ @Mock
+ private Context mContext;
+ @Mock
+ private Resources mResources;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private CarOemProxyServiceHelper mCarOemProxyServiceHelper;
+ @Captor
+ ArgumentCaptor<String> mReasonCapture;
+ @Captor
+ ArgumentCaptor<ServiceConnection> mConnectionCapture;
+
+ private final TestOemCarService mTestOemCarService = new TestOemCarService();
+
+ private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+ @Override
+ protected void onSessionBuilder(CustomMockitoSessionBuilder session) {
+ session.spyStatic(PackageManagerHelper.class);
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ when(mContext.getResources()).thenReturn(mResources);
+ when(mContext.getPackageManager()).thenReturn(mPackageManager);
+ mockCallTimeout(/* timeoutMs= */ 5000);
+ }
+
+ @Test
+ public void testFeatureDisabled() throws Exception {
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+
+ assertThat(carOemProxyService.isOemServiceEnabled()).isFalse();
+ }
+
+ @Test
+ public void testFeatureEnabled() throws Exception {
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+
+ assertThat(carOemProxyService.isOemServiceEnabled()).isTrue();
+ assertThat(carOemProxyService.getOemServiceName()).isEqualTo(COMPONENT_NAME);
+ }
+
+ @Test
+ public void testOemServiceCalledPriorToInit() throws Exception {
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+ mockServiceConnection();
+
+ assertThrows(IllegalStateException.class,
+ () -> carOemProxyService.getCarOemAudioFocusService());
+ }
+
+ @Test
+ public void testCarServiceCrash_oemNotConnected() throws Exception {
+ mockCallTimeout(/* timeoutMs= */ 100);
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext,
+ mCarOemProxyServiceHelper, mHandler);
+
+ //call will wait for OEM service connected
+ carOemProxyService.onInitComplete();
+ waitForHandlerThreadToFinish();
+
+ // First it will call crash with "OEM Service not connected", as it is mocked, it would
+ // continue with other calls.
+ verify(mCarOemProxyServiceHelper, times(2)).crashCarService(mReasonCapture.capture());
+ assertThat(mReasonCapture.getAllValues()).containsExactly("OEM Service not connected",
+ "OEM Service not ready");
+ }
+
+ @Test
+ public void testCarServiceCrash_oemNotReady() throws Exception {
+ mockCallTimeout(/* timeoutMs= */ 100);
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext,
+ mCarOemProxyServiceHelper, mHandler);
+ mockServiceConnection();
+
+ //call will wait for OEM service ready
+ carOemProxyService.onInitComplete();
+ waitForHandlerThreadToFinish();
+
+ verify(mCarOemProxyServiceHelper).crashCarService("OEM Service not ready");
+ }
+
+ @Test
+ public void testOemServiceIsReady() throws Exception {
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+ mockServiceConnection();
+ mockServiceReady();
+ carOemProxyService.onInitComplete();
+
+ eventually(() -> assertWithMessage("Oem Service not ready.")
+ .that(carOemProxyService.isOemServiceReady()).isTrue());
+
+ assertThat(carOemProxyService.getCarOemAudioFocusService()).isNull();
+ }
+
+ @Test
+ public void testCallbackWhenOemServiceIsReady() throws Exception {
+ CountDownLatch latch = new CountDownLatch(1);
+ mockOemCarServiceComponent();
+ CarOemProxyService carOemProxyService = new CarOemProxyService(mContext);
+ mockServiceConnection();
+ mockServiceReady();
+
+ carOemProxyService.registerCallback(() -> latch.countDown());
+ carOemProxyService.onInitComplete();
+
+ JavaMockitoHelper.await(latch, 5000);
+ }
+
+ private void waitForHandlerThreadToFinish() {
+ int timeoutMs = 2000;
+ assertWithMessage("handler not idle in %sms", timeoutMs)
+ .that(mHandler.runWithScissors(() -> {}, timeoutMs)).isTrue();
+ }
+
+ private void mockServiceConnection() {
+ verify(mContext).bindServiceAsUser(any(), mConnectionCapture.capture(), anyInt(), any());
+ ServiceConnection connection = mConnectionCapture.getValue();
+ connection.onServiceConnected(ComponentName.unflattenFromString(COMPONENT_NAME),
+ mTestOemCarService);
+ }
+
+ private void mockOemCarServiceComponent() throws Exception {
+ when(mResources.getString(R.string.config_oemCarService)).thenReturn(COMPONENT_NAME);
+ // make it a valid component.
+ String packageName = ComponentName.unflattenFromString(COMPONENT_NAME).getPackageName();
+ PackageInfo packageInfo = new PackageInfo();
+ packageInfo.applicationInfo = new ApplicationInfo();
+ when(mPackageManager.getPackageInfo(packageName, 0)).thenReturn(packageInfo);
+ doReturn(true).when(() -> PackageManagerHelper.isSystemApp(any()));
+ when(mContext.bindServiceAsUser(any(), any(), anyInt(), any())).thenReturn(true);
+ }
+
+ private void mockCallTimeout(int timeoutMs) {
+ when(mResources.getInteger(R.integer.config_oemCarService_connection_timeout_ms))
+ .thenReturn(timeoutMs);
+ when(mResources.getInteger(R.integer.config_oemCarService_serviceReady_timeout_ms))
+ .thenReturn(timeoutMs);
+ }
+
+ private void mockServiceReady() throws Exception {
+ mTestOemCarService.mockServiceReady();
+ }
+
+ private final class TestOemCarService extends IOemCarService.Stub {
+
+ private final Object mLock = new Object();
+
+ @GuardedBy("mLock")
+ private boolean mMockedServiceReady;
+
+ public void mockServiceReady() {
+ synchronized (mLock) {
+ mMockedServiceReady = true;
+ }
+ }
+
+ @Override
+ public IOemCarAudioFocusService getOemAudioFocusService() {
+ return null;
+ }
+
+ @Override
+ public void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
+ }
+
+ @Override
+ public CarVersion getSupportedCarVersion() {
+ return CarVersion.VERSION_CODES.TIRAMISU_2;
+ }
+
+ @Override
+ public void onCarServiceReady(IOemCarServiceCallback callback) throws RemoteException {
+ boolean mockedServiceReady;
+ synchronized (mLock) {
+ mockedServiceReady = mMockedServiceReady;
+ }
+ if (mockedServiceReady) {
+ callback.sendOemCarServiceReady();
+ }
+ }
+
+ @Override
+ public String getAllStackTraces() {
+ return "";
+ }
+
+ @Override
+ public boolean isOemServiceReady() {
+ return true;
+ }
+ }
+}
diff --git a/tools/telemetry/lua-interpreter/data/anr_occurred.json b/tools/telemetry/lua-interpreter/data/anr_occurred.json
index f944256..66b7c10 100644
--- a/tools/telemetry/lua-interpreter/data/anr_occurred.json
+++ b/tools/telemetry/lua-interpreter/data/anr_occurred.json
@@ -58,5 +58,14 @@
],
"stats.process_name": [
"com.android.systemui"
+ ],
+ "stats.is_incremental": [
+ false
+ ],
+ "stats.read_logs_enabled": [
+ false
+ ],
+ "stats.loading_progress": [
+ 1.0
]
}
diff --git a/tools/telemetry/lua-interpreter/data/app_crash_occurred.json b/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
index 2642bfa..83fda11 100644
--- a/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
+++ b/tools/telemetry/lua-interpreter/data/app_crash_occurred.json
@@ -58,5 +58,14 @@
],
"stats.process_name": [
"com.android.calendar"
+ ],
+ "stats.is_incremental": [
+ false
+ ],
+ "stats.read_logs_enabled": [
+ false
+ ],
+ "stats.loading_progress": [
+ 1.0
]
}
diff --git a/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json b/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json
new file mode 100644
index 0000000..96698c1
--- /dev/null
+++ b/tools/telemetry/lua-interpreter/data/process_memory_snapshot.json
@@ -0,0 +1,5513 @@
+{
+ "stats.pid": [
+ 1810,
+ 421,
+ 3668,
+ 556,
+ 1930,
+ 1270,
+ 505,
+ 1275,
+ 1030,
+ 4438,
+ 501,
+ 1808,
+ 1659,
+ 4118,
+ 457,
+ 565,
+ 1041,
+ 10673,
+ 966,
+ 1346,
+ 5382,
+ 1077,
+ 567,
+ 3333,
+ 2039,
+ 1011,
+ 2270,
+ 1027,
+ 975,
+ 1327,
+ 2036,
+ 1,
+ 455,
+ 1363,
+ 1260,
+ 456,
+ 499,
+ 1345,
+ 568,
+ 1348,
+ 487,
+ 5443,
+ 10775,
+ 1258,
+ 1026,
+ 554,
+ 1103,
+ 10773,
+ 1202,
+ 2846,
+ 2229,
+ 484,
+ 4277,
+ 2573,
+ 1259,
+ 520,
+ 485,
+ 558,
+ 504,
+ 1310,
+ 449,
+ 1100,
+ 557,
+ 1019,
+ 1022,
+ 2766,
+ 1055,
+ 1014,
+ 976,
+ 1340,
+ 965,
+ 1012,
+ 1025,
+ 3249,
+ 10712,
+ 506,
+ 1047,
+ 517,
+ 1220,
+ 569,
+ 1817,
+ 2514,
+ 1681,
+ 1050,
+ 1031,
+ 516,
+ 1056,
+ 427,
+ 1215,
+ 1078,
+ 1292,
+ 964,
+ 4145,
+ 2216,
+ 439,
+ 2181,
+ 1362,
+ 519,
+ 357,
+ 631,
+ 10648,
+ 1015,
+ 10724,
+ 4830,
+ 1738,
+ 1342,
+ 1424,
+ 458,
+ 1017,
+ 1255,
+ 1279,
+ 1343,
+ 1018,
+ 2953,
+ 3692,
+ 482,
+ 1829,
+ 5311,
+ 500,
+ 518,
+ 1324,
+ 1338,
+ 1219,
+ 1013,
+ 1267,
+ 3158,
+ 483,
+ 2658,
+ 10900,
+ 1761,
+ 536,
+ 1024,
+ 6801,
+ 2782,
+ 1097,
+ 1218,
+ 1086,
+ 3976,
+ 3446,
+ 3756,
+ 6780,
+ 3373,
+ 3824,
+ 1058,
+ 3038,
+ 1036,
+ 2473,
+ 1928,
+ 2161,
+ 1028,
+ 1029,
+ 5118,
+ 1040,
+ 2260,
+ 3116,
+ 2428,
+ 1079,
+ 4463,
+ 3212,
+ 3416,
+ 1023,
+ 526,
+ 5479,
+ 1016,
+ 2737,
+ 20161,
+ 20337,
+ 420,
+ 420,
+ 3000,
+ 3000,
+ 1769,
+ 1769,
+ 1328,
+ 1328,
+ 503,
+ 503,
+ 19498,
+ 1329,
+ 1329,
+ 1042,
+ 1042,
+ 500,
+ 500,
+ 1768,
+ 1768,
+ 1659,
+ 1659,
+ 4092,
+ 4092,
+ 456,
+ 456,
+ 562,
+ 562,
+ 1057,
+ 1057,
+ 9691,
+ 9691,
+ 973,
+ 973,
+ 553,
+ 553,
+ 1929,
+ 1929,
+ 563,
+ 563,
+ 3286,
+ 3286,
+ 2040,
+ 2040,
+ 1018,
+ 1018,
+ 2329,
+ 2329,
+ 1039,
+ 1039,
+ 983,
+ 983,
+ 1346,
+ 1346,
+ 2039,
+ 2039,
+ 11896,
+ 1,
+ 1,
+ 454,
+ 454,
+ 1381,
+ 1381,
+ 1293,
+ 1293,
+ 455,
+ 455,
+ 498,
+ 498,
+ 1356,
+ 1356,
+ 564,
+ 564,
+ 19113,
+ 19113,
+ 1358,
+ 1358,
+ 485,
+ 485,
+ 18890,
+ 18890,
+ 1235,
+ 1235,
+ 1357,
+ 1357,
+ 1080,
+ 1080,
+ 19452,
+ 1038,
+ 1038,
+ 552,
+ 552,
+ 1103,
+ 1103,
+ 18888,
+ 18888,
+ 1211,
+ 1211,
+ 2631,
+ 2631,
+ 2252,
+ 2252,
+ 483,
+ 483,
+ 3720,
+ 3720,
+ 2826,
+ 2826,
+ 1291,
+ 1291,
+ 521,
+ 521,
+ 484,
+ 484,
+ 555,
+ 555,
+ 502,
+ 502,
+ 1343,
+ 1343,
+ 453,
+ 453,
+ 1101,
+ 1101,
+ 554,
+ 554,
+ 1026,
+ 1026,
+ 1028,
+ 1028,
+ 2232,
+ 2232,
+ 1063,
+ 1063,
+ 1021,
+ 1021,
+ 984,
+ 984,
+ 20056,
+ 1350,
+ 1350,
+ 11916,
+ 11916,
+ 972,
+ 972,
+ 1019,
+ 1019,
+ 1032,
+ 1032,
+ 3346,
+ 3346,
+ 18828,
+ 18828,
+ 505,
+ 505,
+ 1059,
+ 1059,
+ 516,
+ 516,
+ 1226,
+ 1226,
+ 565,
+ 565,
+ 1771,
+ 1771,
+ 2475,
+ 2475,
+ 1683,
+ 1683,
+ 1060,
+ 1060,
+ 1049,
+ 1049,
+ 515,
+ 515,
+ 1066,
+ 1066,
+ 438,
+ 438,
+ 1221,
+ 1221,
+ 1081,
+ 1081,
+ 1342,
+ 1342,
+ 971,
+ 971,
+ 15243,
+ 15243,
+ 2213,
+ 2213,
+ 1040,
+ 1040,
+ 1041,
+ 1041,
+ 452,
+ 452,
+ 2162,
+ 2162,
+ 1379,
+ 1379,
+ 1022,
+ 1022,
+ 518,
+ 518,
+ 357,
+ 357,
+ 631,
+ 631,
+ 18798,
+ 18798,
+ 1432,
+ 1432,
+ 457,
+ 457,
+ 1024,
+ 1024,
+ 1229,
+ 1229,
+ 1335,
+ 1335,
+ 1352,
+ 1352,
+ 1025,
+ 1025,
+ 2639,
+ 2639,
+ 3682,
+ 3682,
+ 481,
+ 481,
+ 19925,
+ 1790,
+ 1790,
+ 4969,
+ 4969,
+ 499,
+ 499,
+ 517,
+ 517,
+ 1345,
+ 1345,
+ 1348,
+ 1348,
+ 1740,
+ 1740,
+ 4606,
+ 4606,
+ 18840,
+ 18840,
+ 1351,
+ 1351,
+ 1225,
+ 1225,
+ 1020,
+ 1020,
+ 1323,
+ 1323,
+ 20223,
+ 19075,
+ 19075,
+ 482,
+ 482,
+ 3190,
+ 3190,
+ 19010,
+ 20831,
+ 1730,
+ 1730,
+ 529,
+ 529,
+ 1031,
+ 1031,
+ 6818,
+ 6818,
+ 19951,
+ 2256,
+ 2256,
+ 1094,
+ 1094,
+ 1224,
+ 1224,
+ 1088,
+ 1088,
+ 3892,
+ 3892,
+ 14974,
+ 14974,
+ 3383,
+ 3383,
+ 3753,
+ 3753,
+ 1069,
+ 1069,
+ 4631,
+ 4631,
+ 1052,
+ 1052,
+ 2577,
+ 2577,
+ 1924,
+ 1924,
+ 2184,
+ 2184,
+ 1055,
+ 1055,
+ 2264,
+ 2264,
+ 2862,
+ 2862,
+ 2543,
+ 2543,
+ 1082,
+ 1082,
+ 2957,
+ 2957,
+ 3210,
+ 3210,
+ 19570,
+ 3420,
+ 3420,
+ 1030,
+ 1030,
+ 524,
+ 524,
+ 15228,
+ 15228,
+ 3544,
+ 3544,
+ 1023,
+ 1023,
+ 2804,
+ 2804
+ ],
+ "stats.uid": [
+ 1001,
+ 1000,
+ 1010151,
+ 1000,
+ 10060,
+ 0,
+ 1000,
+ 1040,
+ 9999,
+ 1010171,
+ 1041,
+ 1068,
+ 1010,
+ 10058,
+ 1000,
+ 0,
+ 1000,
+ 1010141,
+ 0,
+ 1000,
+ 1010096,
+ 1000,
+ 1000,
+ 1010145,
+ 1000,
+ 1041,
+ 1010093,
+ 0,
+ 0,
+ 1046,
+ 9999,
+ 0,
+ 1000,
+ 1021,
+ 1047,
+ 0,
+ 1000,
+ 0,
+ 1054,
+ 0,
+ 1000,
+ 10152,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 2903,
+ 0,
+ 1000,
+ 10187,
+ 1010139,
+ 1000,
+ 1010103,
+ 1010151,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 0,
+ 1000,
+ 1000,
+ 1017,
+ 1000,
+ 1000,
+ 0,
+ 1000,
+ 1002,
+ 0,
+ 1000,
+ 0,
+ 1000,
+ 1000,
+ 1010057,
+ 0,
+ 1000,
+ 1000,
+ 1000,
+ 9999,
+ 1000,
+ 10165,
+ 1010148,
+ 1000,
+ 1000,
+ 1041,
+ 1000,
+ 1046,
+ 1000,
+ 1000,
+ 1000,
+ 1013,
+ 1066,
+ 1000,
+ 1001000,
+ 1013,
+ 1001002,
+ 1021,
+ 1003,
+ 0,
+ 1058,
+ 1010090,
+ 1013,
+ 1010070,
+ 1010084,
+ 1053,
+ 1001,
+ 1000,
+ 1092,
+ 1013,
+ 0,
+ 1013,
+ 1021,
+ 1021,
+ 10151,
+ 1001000,
+ 1036,
+ 10151,
+ 1010058,
+ 1041,
+ 1062,
+ 1010,
+ 1046,
+ 9999,
+ 1054,
+ 1067,
+ 10176,
+ 1069,
+ 1010177,
+ 1010147,
+ 1073,
+ 0,
+ 1000,
+ 10087,
+ 10151,
+ 1072,
+ 1019,
+ 1076,
+ 10152,
+ 1010063,
+ 10171,
+ 1010061,
+ 1010138,
+ 1010061,
+ 2906,
+ 1010152,
+ 1000,
+ 1010145,
+ 10148,
+ 1010151,
+ 1010,
+ 1041,
+ 1010152,
+ 1000,
+ 1010165,
+ 1010151,
+ 1010102,
+ 1041,
+ 1010150,
+ 1010187,
+ 1010159,
+ 1000,
+ 1062,
+ 1001000,
+ 1013,
+ 1010161,
+ 10090,
+ 1010081,
+ 1000,
+ 1000,
+ 1010151,
+ 1010151,
+ 1001,
+ 1001,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1010171,
+ 1040,
+ 1040,
+ 9999,
+ 9999,
+ 1041,
+ 1041,
+ 1068,
+ 1068,
+ 1010,
+ 1010,
+ 10058,
+ 10058,
+ 1000,
+ 1000,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1010141,
+ 1010141,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 10060,
+ 10060,
+ 1000,
+ 1000,
+ 1010145,
+ 1010145,
+ 1000,
+ 1000,
+ 1041,
+ 1041,
+ 1010093,
+ 1010093,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1046,
+ 1046,
+ 9999,
+ 9999,
+ 10144,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1021,
+ 1021,
+ 1047,
+ 1047,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 0,
+ 0,
+ 1054,
+ 1054,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 0,
+ 0,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1010151,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 2903,
+ 2903,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 10187,
+ 10187,
+ 1010139,
+ 1010139,
+ 1000,
+ 1000,
+ 1010103,
+ 1010103,
+ 1010151,
+ 1010151,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1017,
+ 1017,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1002,
+ 1002,
+ 0,
+ 0,
+ 1010089,
+ 1000,
+ 1000,
+ 1010144,
+ 1010144,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1010057,
+ 1010057,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 9999,
+ 9999,
+ 1000,
+ 1000,
+ 10165,
+ 10165,
+ 1010148,
+ 1010148,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1041,
+ 1041,
+ 1000,
+ 1000,
+ 1046,
+ 1046,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1000,
+ 1013,
+ 1013,
+ 1066,
+ 1066,
+ 1000,
+ 1000,
+ 1001000,
+ 1001000,
+ 1010,
+ 1010,
+ 1041,
+ 1041,
+ 1013,
+ 1013,
+ 1001002,
+ 1001002,
+ 1021,
+ 1021,
+ 1013,
+ 1013,
+ 1003,
+ 1003,
+ 0,
+ 0,
+ 1058,
+ 1058,
+ 1010090,
+ 1010090,
+ 1000,
+ 1000,
+ 1092,
+ 1092,
+ 1013,
+ 1013,
+ 0,
+ 0,
+ 1013,
+ 1013,
+ 1021,
+ 1021,
+ 1021,
+ 1021,
+ 10151,
+ 10151,
+ 1001000,
+ 1001000,
+ 1036,
+ 1036,
+ 1010108,
+ 10151,
+ 10151,
+ 1010058,
+ 1010058,
+ 1041,
+ 1041,
+ 1062,
+ 1062,
+ 1010,
+ 1010,
+ 1046,
+ 1046,
+ 1053,
+ 1053,
+ 1010084,
+ 1010084,
+ 1010070,
+ 1010070,
+ 1001,
+ 1001,
+ 9999,
+ 9999,
+ 1054,
+ 1054,
+ 1067,
+ 1067,
+ 1010088,
+ 10176,
+ 10176,
+ 1069,
+ 1069,
+ 1010177,
+ 1010177,
+ 1010147,
+ 1010147,
+ 1073,
+ 1073,
+ 0,
+ 0,
+ 1000,
+ 1000,
+ 10087,
+ 10087,
+ 1010095,
+ 10151,
+ 10151,
+ 1072,
+ 1072,
+ 1019,
+ 1019,
+ 1076,
+ 1076,
+ 10152,
+ 10152,
+ 1010061,
+ 1010061,
+ 1010138,
+ 1010138,
+ 1010061,
+ 1010061,
+ 2906,
+ 2906,
+ 1010152,
+ 1010152,
+ 1000,
+ 1000,
+ 1010145,
+ 1010145,
+ 10148,
+ 10148,
+ 1010151,
+ 1010151,
+ 1000,
+ 1000,
+ 1010165,
+ 1010165,
+ 1010151,
+ 1010151,
+ 1010102,
+ 1010102,
+ 1041,
+ 1041,
+ 1010150,
+ 1010150,
+ 1010187,
+ 1010187,
+ 1010140,
+ 1010159,
+ 1010159,
+ 1000,
+ 1000,
+ 1062,
+ 1062,
+ 1001000,
+ 1001000,
+ 1010063,
+ 1010063,
+ 1013,
+ 1013,
+ 1010161,
+ 1010161
+ ],
+ "stats.gpu_memory_kb": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "stats.swap_in_kilobytes": [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "stats.process_name": [
+ "com.android.phone",
+ "/system/vendor/bin/ais_server",
+ "com.google.process.gapps",
+ "/system/bin/carpowerpolicyd",
+ "com.android.car.cartelemetryapp",
+ "/system/bin/installd",
+ "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+ "media.extractor",
+ "/vendor/bin/hw/android.hardware.memtrack-service.example",
+ "com.google.android.permissioncontroller",
+ "/vendor/bin/audioextplugind",
+ "com.android.se",
+ "/vendor/bin/hw/wpa_supplicant",
+ "com.android.car.messenger",
+ "/system/bin/android.automotive.telemetryd@1.0",
+ "/vendor/bin/hw/android.hardware.boot@1.2-service",
+ "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+ "com.google.android.car.setupwizard",
+ "zygote64",
+ "/system/bin/gatekeeperd",
+ "com.android.car.dialer",
+ "/vendor/bin/pd-mapper",
+ "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+ "com.google.android.carassistant:search",
+ "com.android.experimentalcar",
+ "/vendor/bin/hw/android.hardware.audio.service",
+ "com.google.android.embedded.projection",
+ "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+ "/system/bin/iptables-restore",
+ "media.codec",
+ "/system/bin/com.android.car.procfsinspector",
+ "/system/bin/init",
+ "/vendor/bin/timedaemon",
+ "xtra-daemon",
+ "/system/bin/cameraserver",
+ "/vendor/bin/ipcdaemon",
+ "/vendor/bin/audio_hal_plugin_service",
+ "/vendor/bin/update_agent",
+ "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+ "/system/bin/update_engine",
+ "/vendor/bin/vndservicemanager",
+ "com.android.vending:background",
+ "app_process",
+ "/vendor/bin/thermal-engine",
+ "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+ "/system/bin/hw/android.system.suspend-service",
+ "/vendor/bin/tftp_server",
+ "/system/bin/sh",
+ "/vendor/bin/diag-router",
+ "com.google.android.providers.media.module",
+ ".qtidataservices",
+ "/system/bin/servicemanager",
+ "com.google.android.car.netdbug",
+ "com.google.android.gms",
+ "/vendor/bin/cdsprpcd",
+ "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+ "/system/bin/hwservicemanager",
+ "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+ "/system/bin/carwatchdogd",
+ "/system/bin/storaged",
+ "/vendor/bin/audiod",
+ "/system/bin/surfaceflinger",
+ "/system/bin/keystore2",
+ "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+ "/vendor/bin/hw/android.hardware.health@2.1-service",
+ "/vendor/bin/car_power_daemon",
+ "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+ "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+ "/system/bin/ip6tables-restore",
+ "/system/vendor/bin/cnss-daemon",
+ "/system/bin/netd",
+ "/system/bin/hw/android.hidl.allocator@1.0-service",
+ "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+ "com.android.car.media",
+ "/apex/com.android.adbd/bin/adbd",
+ "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+ "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+ "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+ "/system/bin/traced",
+ "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+ "com.android.systemui",
+ "com.google.android.companiondevicesupport",
+ "com.android.car",
+ "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+ "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+ "/vendor/bin/qseecomd",
+ "media.hwcodec",
+ "/vendor/bin/adsprpcd",
+ "/vendor/bin/pm-proxy",
+ "/vendor/bin/pm-service",
+ "/system/bin/mediaserver",
+ "/apex/com.android.os.statsd/bin/statsd",
+ "com.android.car.developeroptions",
+ "com.android.car",
+ "/vendor/bin/adsprpcd",
+ "com.google.android.bluetooth",
+ "lowi-server",
+ "/system/bin/android.frameworks.automotive.display@1.0-service",
+ "/system/bin/ueventd",
+ "/system/bin/tombstoned",
+ "com.google.android.car.kitchensink",
+ "/vendor/bin/hw/android.hardware.cas@1.2-service",
+ "android.process.media",
+ "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+ "webview_zygote",
+ "/vendor/bin/ssgqmigd",
+ "system",
+ "/system/bin/prng_seeder",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+ "/vendor/bin/keyhandler",
+ "media.metrics",
+ "/system/vendor/bin/loc_launcher",
+ "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+ "com.google.process.gservices",
+ "com.qualcomm.qti.services.secureui:sui_service",
+ "/system/bin/logd",
+ "com.google.android.gms.persistent",
+ "com.android.car.messenger",
+ "/vendor/bin/I2CAbs_serverd",
+ "/system/bin/evsmanagerd",
+ "/system/bin/wificond",
+ "media.swcodec",
+ "/system/bin/traced_probes",
+ "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+ "/system/bin/incidentd",
+ "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+ "/system/bin/lmkd",
+ "com.google.android.ext.services",
+ "com.google.android.apps.maps",
+ "com.android.networkstack.process",
+ "/system/bin/vold",
+ "/vendor/bin/hw/android.hardware.power-service",
+ "android.car.cluster",
+ "com.google.android.gms",
+ "/system/bin/gpuservice",
+ "/system/bin/drmserver",
+ "/system/bin/credstore",
+ "com.android.vending",
+ "com.android.car.carlauncher",
+ "com.google.android.permissioncontroller",
+ "com.android.car.radio:appService",
+ "com.android.car.custominput.sample",
+ "com.android.car.radio",
+ "/vendor/bin/qrtr-ns",
+ "com.android.vending",
+ "/vendor/bin/hw/vendor.display.color@1.0-service",
+ "com.google.android.carassistant:interactor",
+ "com.google.android.companiondevicesupport",
+ "com.google.android.gms.persistent",
+ "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+ "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+ "com.android.vending:background",
+ "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+ "com.android.systemui",
+ "com.google.process.gservices",
+ "com.android.car.rotary",
+ "/system/bin/audioserver",
+ "com.google.android.apps.automotive.templates.host:renderer_service",
+ "com.google.android.providers.media.module",
+ "com.google.android.tts",
+ "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+ "/vendor/bin/evs_pasa_app",
+ "com.android.car.developeroptions",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+ "com.google.android.apps.automotive.inputmethod",
+ "com.google.android.car.kitchensink",
+ "com.google.android.gms.vehicle.testapp",
+ "/system/vendor/bin/ais_server",
+ "/system/vendor/bin/ais_server",
+ "com.google.process.gapps",
+ "com.google.process.gapps",
+ "com.android.phone",
+ "com.android.phone",
+ "/system/bin/installd",
+ "/system/bin/installd",
+ "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+ "/vendor/bin/hw/android.hardware.keymaster@4.1-service-qti",
+ "com.google.android.permissioncontroller",
+ "media.extractor",
+ "media.extractor",
+ "/vendor/bin/hw/android.hardware.memtrack-service.example",
+ "/vendor/bin/hw/android.hardware.memtrack-service.example",
+ "/vendor/bin/audioextplugind",
+ "/vendor/bin/audioextplugind",
+ "com.android.se",
+ "com.android.se",
+ "/vendor/bin/hw/wpa_supplicant",
+ "/vendor/bin/hw/wpa_supplicant",
+ "com.android.car.messenger",
+ "com.android.car.messenger",
+ "/system/bin/android.automotive.telemetryd@1.0",
+ "/system/bin/android.automotive.telemetryd@1.0",
+ "/vendor/bin/hw/android.hardware.boot@1.2-service",
+ "/vendor/bin/hw/android.hardware.boot@1.2-service",
+ "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+ "/vendor/bin/hw/vendor.qti.hardware.capabilityconfigstore@1.0-service",
+ "com.google.android.car.setupwizard",
+ "com.google.android.car.setupwizard",
+ "zygote64",
+ "zygote64",
+ "/system/bin/carpowerpolicyd",
+ "/system/bin/carpowerpolicyd",
+ "com.android.car.cartelemetryapp",
+ "com.android.car.cartelemetryapp",
+ "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+ "/vendor/bin/hw/android.hardware.gatekeeper@1.0-service-qti",
+ "com.google.android.carassistant:search",
+ "com.google.android.carassistant:search",
+ "com.android.experimentalcar",
+ "com.android.experimentalcar",
+ "/vendor/bin/hw/android.hardware.audio.service",
+ "/vendor/bin/hw/android.hardware.audio.service",
+ "com.google.android.embedded.projection",
+ "com.google.android.embedded.projection",
+ "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+ "/vendor/bin/hw/android.hardware.usb@1.2-service-qti",
+ "/system/bin/iptables-restore",
+ "/system/bin/iptables-restore",
+ "media.codec",
+ "media.codec",
+ "/system/bin/com.android.car.procfsinspector",
+ "/system/bin/com.android.car.procfsinspector",
+ "com.google.android.configupdater",
+ "/system/bin/init",
+ "/system/bin/init",
+ "/vendor/bin/timedaemon",
+ "/vendor/bin/timedaemon",
+ "xtra-daemon",
+ "xtra-daemon",
+ "/system/bin/cameraserver",
+ "/system/bin/cameraserver",
+ "/vendor/bin/ipcdaemon",
+ "/vendor/bin/ipcdaemon",
+ "/vendor/bin/audio_hal_plugin_service",
+ "/vendor/bin/audio_hal_plugin_service",
+ "/vendor/bin/update_agent",
+ "/vendor/bin/update_agent",
+ "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+ "/vendor/bin/hw/android.hardware.automotive.vehicle@V1-pasa-service",
+ "-/system/bin/sh",
+ "-/system/bin/sh",
+ "/system/bin/update_engine",
+ "/system/bin/update_engine",
+ "/vendor/bin/vndservicemanager",
+ "/vendor/bin/vndservicemanager",
+ "app_process",
+ "app_process",
+ "/vendor/bin/thermal-engine",
+ "/vendor/bin/thermal-engine",
+ "/system/bin/gatekeeperd",
+ "/system/bin/gatekeeperd",
+ "/vendor/bin/pd-mapper",
+ "/vendor/bin/pd-mapper",
+ "com.google.android.gms.unstable",
+ "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+ "/vendor/bin/hw/android.hardware.thermal@2.0-service.mock",
+ "/system/bin/hw/android.system.suspend-service",
+ "/system/bin/hw/android.system.suspend-service",
+ "/vendor/bin/tftp_server",
+ "/vendor/bin/tftp_server",
+ "/system/bin/sh",
+ "/system/bin/sh",
+ "/vendor/bin/diag-router",
+ "/vendor/bin/diag-router",
+ "com.google.android.providers.media.module",
+ "com.google.android.providers.media.module",
+ ".qtidataservices",
+ ".qtidataservices",
+ "/system/bin/servicemanager",
+ "/system/bin/servicemanager",
+ "com.google.android.car.netdbug",
+ "com.google.android.car.netdbug",
+ "com.google.android.gms",
+ "com.google.android.gms",
+ "/vendor/bin/cdsprpcd",
+ "/vendor/bin/cdsprpcd",
+ "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+ "/vendor/bin/android.hardware.automotive.evs@1.1-pasa",
+ "/system/bin/hwservicemanager",
+ "/system/bin/hwservicemanager",
+ "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+ "/vendor/bin/hw/android.hardware.atrace@1.0-service",
+ "/system/bin/carwatchdogd",
+ "/system/bin/carwatchdogd",
+ "/system/bin/storaged",
+ "/system/bin/storaged",
+ "/vendor/bin/audiod",
+ "/vendor/bin/audiod",
+ "/system/bin/surfaceflinger",
+ "/system/bin/surfaceflinger",
+ "/system/bin/keystore2",
+ "/system/bin/keystore2",
+ "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+ "/vendor/bin/hw/android.hardware.graphics.composer@2.4-service",
+ "/vendor/bin/hw/android.hardware.health@2.1-service",
+ "/vendor/bin/hw/android.hardware.health@2.1-service",
+ "/vendor/bin/car_power_daemon",
+ "/vendor/bin/car_power_daemon",
+ "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+ "/vendor/bin/hw/vendor.qti.hardware.tui_comm@1.0-service-qti",
+ "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+ "/vendor/bin/hw/android.hardware.bluetooth@1.0-service-qti",
+ "/system/bin/ip6tables-restore",
+ "/system/bin/ip6tables-restore",
+ "com.android.car.ui.paintbooth",
+ "/system/vendor/bin/cnss-daemon",
+ "/system/vendor/bin/cnss-daemon",
+ "com.google.android.configupdater",
+ "com.google.android.configupdater",
+ "/system/bin/netd",
+ "/system/bin/netd",
+ "/system/bin/hw/android.hidl.allocator@1.0-service",
+ "/system/bin/hw/android.hidl.allocator@1.0-service",
+ "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+ "/vendor/bin/hw/android.hardware.sensors@1.0-service",
+ "com.android.car.media",
+ "com.android.car.media",
+ "/apex/com.android.adbd/bin/adbd",
+ "/apex/com.android.adbd/bin/adbd",
+ "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+ "/vendor/bin/hw/android.hardware.security.keymint-service-qti",
+ "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+ "/vendor/bin/hw/vendor.qti.hardware.display.allocator-service",
+ "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+ "/vendor/bin/hw/vendor.qti.hardware.qseecom@1.0-service",
+ "/system/bin/traced",
+ "/system/bin/traced",
+ "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+ "/vendor/bin/hw/vendor.qti.hardware.qteeconnector@1.0-service",
+ "com.android.systemui",
+ "com.android.systemui",
+ "com.google.android.companiondevicesupport",
+ "com.google.android.companiondevicesupport",
+ "com.android.car",
+ "com.android.car",
+ "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+ "/vendor/bin/hw/vendor.qti.hardware.soter@1.0-service",
+ "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+ "/vendor/bin/panasonic.hardware.broadcastradio.pasa@2.0-service",
+ "/vendor/bin/qseecomd",
+ "/vendor/bin/qseecomd",
+ "media.hwcodec",
+ "media.hwcodec",
+ "/vendor/bin/adsprpcd",
+ "/vendor/bin/adsprpcd",
+ "/vendor/bin/pm-proxy",
+ "/vendor/bin/pm-proxy",
+ "/vendor/bin/pm-service",
+ "/vendor/bin/pm-service",
+ "/system/bin/mediaserver",
+ "/system/bin/mediaserver",
+ "/apex/com.android.os.statsd/bin/statsd",
+ "/apex/com.android.os.statsd/bin/statsd",
+ "com.android.car.developeroptions",
+ "com.android.car.developeroptions",
+ "com.android.car",
+ "com.android.car",
+ "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+ "/vendor/bin/hw/android.hardware.wifi@1.0-service",
+ "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+ "/vendor/bin/hw/android.hardware.automotive.audiocontrol-service.example",
+ "/vendor/bin/adsprpcd",
+ "/vendor/bin/adsprpcd",
+ "com.google.android.bluetooth",
+ "com.google.android.bluetooth",
+ "lowi-server",
+ "lowi-server",
+ "/vendor/bin/hw/android.hardware.cas@1.2-service",
+ "/vendor/bin/hw/android.hardware.cas@1.2-service",
+ "/system/bin/android.frameworks.automotive.display@1.0-service",
+ "/system/bin/android.frameworks.automotive.display@1.0-service",
+ "/system/bin/ueventd",
+ "/system/bin/ueventd",
+ "/system/bin/tombstoned",
+ "/system/bin/tombstoned",
+ "com.google.android.car.kitchensink",
+ "com.google.android.car.kitchensink",
+ "system",
+ "system",
+ "/system/bin/prng_seeder",
+ "/system/bin/prng_seeder",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.widevine",
+ "/vendor/bin/keyhandler",
+ "/vendor/bin/keyhandler",
+ "media.metrics",
+ "media.metrics",
+ "/system/vendor/bin/loc_launcher",
+ "/system/vendor/bin/loc_launcher",
+ "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+ "/vendor/bin/hw/android.hardware.gnss@2.1-service-qti",
+ "com.google.process.gservices",
+ "com.google.process.gservices",
+ "com.qualcomm.qti.services.secureui:sui_service",
+ "com.qualcomm.qti.services.secureui:sui_service",
+ "/system/bin/logd",
+ "/system/bin/logd",
+ "com.android.car.calendar",
+ "com.google.android.gms.persistent",
+ "com.google.android.gms.persistent",
+ "com.android.car.messenger",
+ "com.android.car.messenger",
+ "/vendor/bin/I2CAbs_serverd",
+ "/vendor/bin/I2CAbs_serverd",
+ "/system/bin/evsmanagerd",
+ "/system/bin/evsmanagerd",
+ "/system/bin/wificond",
+ "/system/bin/wificond",
+ "media.swcodec",
+ "media.swcodec",
+ "webview_zygote",
+ "webview_zygote",
+ "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+ "com.google.android.apps.automotive.sensing.sensorreplay.recordingapp",
+ "android.process.media",
+ "android.process.media",
+ "/vendor/bin/ssgqmigd",
+ "/vendor/bin/ssgqmigd",
+ "/system/bin/traced_probes",
+ "/system/bin/traced_probes",
+ "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+ "/vendor/bin/hw/android.hardware.automotive.can@1.0-service",
+ "/system/bin/incidentd",
+ "/system/bin/incidentd",
+ "com.google.android.apps.geo.autograph.vms.client.console.car",
+ "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+ "com.android.car.scriptexecutor:com.android.car.scriptexecutor.ScriptExecutor",
+ "/system/bin/lmkd",
+ "/system/bin/lmkd",
+ "com.google.android.ext.services",
+ "com.google.android.ext.services",
+ "com.google.android.apps.maps",
+ "com.google.android.apps.maps",
+ "com.android.networkstack.process",
+ "com.android.networkstack.process",
+ "/system/bin/vold",
+ "/system/bin/vold",
+ "/vendor/bin/hw/android.hardware.power-service",
+ "/vendor/bin/hw/android.hardware.power-service",
+ "android.car.cluster",
+ "android.car.cluster",
+ "com.android.providers.calendar",
+ "com.google.android.gms",
+ "com.google.android.gms",
+ "/system/bin/gpuservice",
+ "/system/bin/gpuservice",
+ "/system/bin/drmserver",
+ "/system/bin/drmserver",
+ "/system/bin/credstore",
+ "/system/bin/credstore",
+ "com.android.vending",
+ "com.android.vending",
+ "com.android.car.radio:appService",
+ "com.android.car.radio:appService",
+ "com.android.car.custominput.sample",
+ "com.android.car.custominput.sample",
+ "com.android.car.radio",
+ "com.android.car.radio",
+ "/vendor/bin/qrtr-ns",
+ "/vendor/bin/qrtr-ns",
+ "com.android.vending",
+ "com.android.vending",
+ "/vendor/bin/hw/vendor.display.color@1.0-service",
+ "/vendor/bin/hw/vendor.display.color@1.0-service",
+ "com.google.android.carassistant:interactor",
+ "com.google.android.carassistant:interactor",
+ "com.google.android.companiondevicesupport",
+ "com.google.android.companiondevicesupport",
+ "com.google.android.gms.persistent",
+ "com.google.android.gms.persistent",
+ "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+ "/vendor/bin/hw/vendor.qti.automotive.qcarcam@1.0-service",
+ "com.android.systemui",
+ "com.android.systemui",
+ "com.google.process.gservices",
+ "com.google.process.gservices",
+ "com.android.car.rotary",
+ "com.android.car.rotary",
+ "/system/bin/audioserver",
+ "/system/bin/audioserver",
+ "com.google.android.apps.automotive.templates.host:renderer_service",
+ "com.google.android.apps.automotive.templates.host:renderer_service",
+ "com.google.android.providers.media.module",
+ "com.google.android.providers.media.module",
+ "com.google.android.partnersetup",
+ "com.google.android.tts",
+ "com.google.android.tts",
+ "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+ "/vendor/bin/hw/android.hardware.neuralnetworks@1.3-service-qti",
+ "/vendor/bin/evs_pasa_app",
+ "/vendor/bin/evs_pasa_app",
+ "com.android.car.developeroptions",
+ "com.android.car.developeroptions",
+ "com.android.car.carlauncher",
+ "com.android.car.carlauncher",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+ "/vendor/bin/hw/android.hardware.drm@1.4-service.clearkey",
+ "com.google.android.apps.automotive.inputmethod",
+ "com.google.android.apps.automotive.inputmethod"
+ ],
+ "stats.elapsed_timestamp_nanos": [
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 944668609012,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951,
+ 2797710058984,
+ 3020312433951
+ ],
+ "stats.rss_in_kilobytes": [
+ 129580,
+ 40648,
+ 100748,
+ 5120,
+ 94216,
+ 7328,
+ 5696,
+ 29332,
+ 4704,
+ 106680,
+ 9592,
+ 95560,
+ 11104,
+ 97588,
+ 3892,
+ 4580,
+ 5008,
+ 104292,
+ 173916,
+ 6268,
+ 97464,
+ 4068,
+ 4988,
+ 248216,
+ 91948,
+ 29060,
+ 108020,
+ 5292,
+ 3444,
+ 11180,
+ 4088,
+ 13868,
+ 5412,
+ 9688,
+ 26596,
+ 2076,
+ 4036,
+ 4884,
+ 5508,
+ 10240,
+ 3664,
+ 134704,
+ 123708,
+ 5356,
+ 4932,
+ 5172,
+ 3060,
+ 3136,
+ 6852,
+ 120140,
+ 91772,
+ 5348,
+ 94224,
+ 173616,
+ 5376,
+ 33984,
+ 5956,
+ 3700,
+ 6796,
+ 5756,
+ 9300,
+ 51664,
+ 14464,
+ 21796,
+ 5024,
+ 6736,
+ 5108,
+ 6724,
+ 3372,
+ 5248,
+ 10560,
+ 3968,
+ 5824,
+ 101612,
+ 10508,
+ 7628,
+ 8644,
+ 4560,
+ 3940,
+ 6104,
+ 235072,
+ 109868,
+ 122004,
+ 5880,
+ 6636,
+ 4956,
+ 22364,
+ 4428,
+ 4416,
+ 4660,
+ 26080,
+ 6424,
+ 117576,
+ 101860,
+ 4468,
+ 121616,
+ 6648,
+ 8260,
+ 8984,
+ 2192,
+ 169308,
+ 4988,
+ 97980,
+ 96160,
+ 84204,
+ 2412,
+ 386552,
+ 6032,
+ 9864,
+ 5036,
+ 8112,
+ 4524,
+ 17768,
+ 99124,
+ 90332,
+ 7292,
+ 187564,
+ 97992,
+ 1988,
+ 6632,
+ 7044,
+ 21660,
+ 3848,
+ 4848,
+ 5428,
+ 88420,
+ 2632,
+ 89836,
+ 172968,
+ 106336,
+ 9424,
+ 5232,
+ 120584,
+ 169900,
+ 8440,
+ 7892,
+ 8140,
+ 178348,
+ 182868,
+ 104920,
+ 107640,
+ 88720,
+ 95832,
+ 2944,
+ 183184,
+ 7448,
+ 162236,
+ 112912,
+ 186168,
+ 15588,
+ 5688,
+ 134844,
+ 4988,
+ 153224,
+ 99776,
+ 122064,
+ 31104,
+ 157180,
+ 121484,
+ 221260,
+ 21608,
+ 10772,
+ 115964,
+ 8484,
+ 138928,
+ 169288,
+ 158284,
+ 40156,
+ 40156,
+ 101708,
+ 101708,
+ 130920,
+ 131192,
+ 7236,
+ 7236,
+ 4648,
+ 4648,
+ 134988,
+ 29188,
+ 29188,
+ 4680,
+ 4680,
+ 9524,
+ 9524,
+ 95808,
+ 95808,
+ 11012,
+ 11012,
+ 99476,
+ 99476,
+ 3908,
+ 3908,
+ 4336,
+ 4336,
+ 5004,
+ 5004,
+ 99832,
+ 99832,
+ 174704,
+ 174868,
+ 4700,
+ 4700,
+ 94208,
+ 94208,
+ 4968,
+ 4968,
+ 247452,
+ 247452,
+ 92516,
+ 92516,
+ 29188,
+ 29188,
+ 108864,
+ 108864,
+ 5088,
+ 5088,
+ 3464,
+ 3464,
+ 11192,
+ 11192,
+ 4172,
+ 4172,
+ 90128,
+ 13908,
+ 13908,
+ 5288,
+ 5288,
+ 9768,
+ 9768,
+ 26832,
+ 26832,
+ 2000,
+ 2000,
+ 3776,
+ 3776,
+ 4924,
+ 4924,
+ 5328,
+ 5328,
+ 3204,
+ 3204,
+ 10300,
+ 10300,
+ 4160,
+ 4160,
+ 123376,
+ 126028,
+ 5368,
+ 5368,
+ 6224,
+ 6224,
+ 4100,
+ 4100,
+ 152960,
+ 4776,
+ 4776,
+ 4860,
+ 4860,
+ 3016,
+ 3016,
+ 3328,
+ 3328,
+ 6992,
+ 6992,
+ 121204,
+ 121204,
+ 92120,
+ 92120,
+ 5444,
+ 5444,
+ 96352,
+ 96352,
+ 170884,
+ 171608,
+ 5312,
+ 5312,
+ 33556,
+ 33556,
+ 5924,
+ 5924,
+ 3608,
+ 3608,
+ 6712,
+ 6736,
+ 5700,
+ 5700,
+ 9008,
+ 9008,
+ 52932,
+ 55384,
+ 14036,
+ 14248,
+ 21500,
+ 21864,
+ 5100,
+ 5100,
+ 6680,
+ 6680,
+ 5224,
+ 5224,
+ 6816,
+ 6816,
+ 3280,
+ 3280,
+ 153084,
+ 5300,
+ 5300,
+ 90076,
+ 90076,
+ 10260,
+ 10288,
+ 3556,
+ 3556,
+ 5724,
+ 5724,
+ 103384,
+ 103384,
+ 11440,
+ 11552,
+ 7416,
+ 7416,
+ 8524,
+ 8632,
+ 4432,
+ 4432,
+ 3708,
+ 3844,
+ 5796,
+ 5796,
+ 219540,
+ 233712,
+ 111600,
+ 111600,
+ 122440,
+ 123540,
+ 5860,
+ 5860,
+ 6856,
+ 6856,
+ 5064,
+ 5064,
+ 23044,
+ 23888,
+ 4328,
+ 4328,
+ 4620,
+ 4620,
+ 4712,
+ 4712,
+ 24636,
+ 24636,
+ 6620,
+ 6656,
+ 122316,
+ 122316,
+ 100868,
+ 100868,
+ 16480,
+ 16560,
+ 5584,
+ 5584,
+ 4380,
+ 4380,
+ 122516,
+ 122516,
+ 6524,
+ 6520,
+ 4928,
+ 4928,
+ 7876,
+ 7876,
+ 9040,
+ 9040,
+ 2232,
+ 2232,
+ 170328,
+ 166160,
+ 354656,
+ 394084,
+ 6076,
+ 6076,
+ 9672,
+ 9672,
+ 5116,
+ 5116,
+ 8492,
+ 8492,
+ 4932,
+ 4932,
+ 17688,
+ 17664,
+ 99456,
+ 99456,
+ 90772,
+ 90772,
+ 7260,
+ 7288,
+ 152436,
+ 185168,
+ 188556,
+ 98056,
+ 98056,
+ 1836,
+ 1836,
+ 6492,
+ 6492,
+ 7264,
+ 7264,
+ 21976,
+ 21976,
+ 83920,
+ 83920,
+ 97720,
+ 97720,
+ 99616,
+ 99616,
+ 2384,
+ 2384,
+ 3736,
+ 3736,
+ 5016,
+ 5016,
+ 5588,
+ 5588,
+ 162932,
+ 85828,
+ 85828,
+ 2604,
+ 2604,
+ 87400,
+ 87400,
+ 159516,
+ 158640,
+ 106936,
+ 106892,
+ 9508,
+ 9520,
+ 5160,
+ 5160,
+ 124104,
+ 124588,
+ 96940,
+ 168880,
+ 168904,
+ 8336,
+ 8336,
+ 7852,
+ 7852,
+ 7412,
+ 7412,
+ 168528,
+ 168528,
+ 107964,
+ 107964,
+ 90296,
+ 90296,
+ 97900,
+ 97900,
+ 2960,
+ 2960,
+ 168864,
+ 168864,
+ 7420,
+ 7420,
+ 162908,
+ 165912,
+ 109752,
+ 109752,
+ 189336,
+ 191356,
+ 5112,
+ 5112,
+ 150656,
+ 151264,
+ 101168,
+ 100232,
+ 120372,
+ 122668,
+ 31384,
+ 31448,
+ 158128,
+ 158128,
+ 120152,
+ 120152,
+ 92484,
+ 217308,
+ 217308,
+ 21480,
+ 21480,
+ 10544,
+ 10544,
+ 122240,
+ 122240,
+ 170428,
+ 234808,
+ 8392,
+ 8392,
+ 139568,
+ 186048
+ ],
+ "stats.has_foreground_services": [
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ true,
+ true,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false
+ ],
+ "stats.anon_rss_in_kilobytes": [
+ 50728,
+ 26464,
+ 47488,
+ 784,
+ 46724,
+ 1996,
+ 920,
+ 4796,
+ 712,
+ 47592,
+ 1912,
+ 48432,
+ 1268,
+ 46796,
+ 636,
+ 764,
+ 776,
+ 54092,
+ 47536,
+ 900,
+ 46984,
+ 696,
+ 840,
+ 125996,
+ 46552,
+ 17160,
+ 49208,
+ 732,
+ 888,
+ 2104,
+ 636,
+ 5316,
+ 840,
+ 1460,
+ 3820,
+ 460,
+ 704,
+ 776,
+ 1280,
+ 1364,
+ 672,
+ 50232,
+ 30324,
+ 1584,
+ 704,
+ 1072,
+ 528,
+ 668,
+ 2348,
+ 51004,
+ 46676,
+ 1300,
+ 47152,
+ 62336,
+ 768,
+ 5488,
+ 1300,
+ 668,
+ 2232,
+ 848,
+ 3376,
+ 13816,
+ 2652,
+ 4256,
+ 776,
+ 888,
+ 756,
+ 1460,
+ 728,
+ 980,
+ 1824,
+ 708,
+ 884,
+ 47312,
+ 5280,
+ 1152,
+ 1248,
+ 788,
+ 768,
+ 972,
+ 79192,
+ 48884,
+ 50912,
+ 848,
+ 884,
+ 1032,
+ 4428,
+ 752,
+ 692,
+ 736,
+ 4496,
+ 1548,
+ 47220,
+ 48100,
+ 788,
+ 49508,
+ 1472,
+ 1300,
+ 2872,
+ 412,
+ 64952,
+ 728,
+ 46932,
+ 46616,
+ 46840,
+ 416,
+ 122764,
+ 812,
+ 1244,
+ 784,
+ 1984,
+ 676,
+ 2680,
+ 45840,
+ 46580,
+ 3068,
+ 70400,
+ 47088,
+ 512,
+ 996,
+ 1084,
+ 3648,
+ 720,
+ 704,
+ 880,
+ 46880,
+ 472,
+ 46604,
+ 68776,
+ 49624,
+ 2184,
+ 760,
+ 48376,
+ 60572,
+ 1356,
+ 1200,
+ 1144,
+ 68356,
+ 60268,
+ 47448,
+ 47688,
+ 46776,
+ 46628,
+ 508,
+ 74100,
+ 996,
+ 65360,
+ 48936,
+ 67588,
+ 5728,
+ 856,
+ 50300,
+ 792,
+ 57472,
+ 46316,
+ 48344,
+ 6432,
+ 51404,
+ 51856,
+ 133636,
+ 3532,
+ 1632,
+ 47204,
+ 1096,
+ 51624,
+ 52880,
+ 58800,
+ 26472,
+ 26472,
+ 47904,
+ 47904,
+ 50840,
+ 51112,
+ 1884,
+ 1884,
+ 836,
+ 836,
+ 53184,
+ 4512,
+ 4512,
+ 704,
+ 704,
+ 1888,
+ 1888,
+ 48448,
+ 48420,
+ 1344,
+ 1344,
+ 46996,
+ 46996,
+ 632,
+ 632,
+ 772,
+ 772,
+ 768,
+ 768,
+ 52204,
+ 52204,
+ 47636,
+ 47800,
+ 816,
+ 816,
+ 46856,
+ 46856,
+ 832,
+ 832,
+ 125400,
+ 125400,
+ 46604,
+ 46604,
+ 17168,
+ 17168,
+ 49752,
+ 49752,
+ 736,
+ 736,
+ 888,
+ 888,
+ 2104,
+ 2104,
+ 640,
+ 640,
+ 46768,
+ 5284,
+ 5284,
+ 836,
+ 836,
+ 1456,
+ 1456,
+ 3836,
+ 3836,
+ 460,
+ 460,
+ 708,
+ 708,
+ 768,
+ 768,
+ 1280,
+ 1280,
+ 752,
+ 752,
+ 1356,
+ 1356,
+ 804,
+ 804,
+ 30344,
+ 30944,
+ 1596,
+ 1596,
+ 908,
+ 908,
+ 684,
+ 684,
+ 52792,
+ 708,
+ 708,
+ 1048,
+ 1048,
+ 524,
+ 524,
+ 668,
+ 668,
+ 2392,
+ 2392,
+ 50992,
+ 50992,
+ 46828,
+ 46828,
+ 1304,
+ 1304,
+ 47380,
+ 47380,
+ 59676,
+ 60972,
+ 764,
+ 764,
+ 5472,
+ 5472,
+ 1292,
+ 1292,
+ 676,
+ 676,
+ 2316,
+ 2340,
+ 852,
+ 852,
+ 3368,
+ 3368,
+ 13900,
+ 15476,
+ 2712,
+ 2920,
+ 4296,
+ 4660,
+ 784,
+ 784,
+ 888,
+ 888,
+ 760,
+ 760,
+ 1456,
+ 1456,
+ 716,
+ 716,
+ 57176,
+ 988,
+ 988,
+ 46780,
+ 46780,
+ 1896,
+ 1924,
+ 700,
+ 700,
+ 880,
+ 880,
+ 47284,
+ 47284,
+ 6196,
+ 6308,
+ 1132,
+ 1132,
+ 1256,
+ 1364,
+ 780,
+ 780,
+ 772,
+ 908,
+ 972,
+ 972,
+ 75992,
+ 77580,
+ 49128,
+ 49128,
+ 51964,
+ 52972,
+ 840,
+ 840,
+ 984,
+ 984,
+ 1036,
+ 1036,
+ 4444,
+ 4460,
+ 752,
+ 752,
+ 692,
+ 692,
+ 732,
+ 732,
+ 4012,
+ 4012,
+ 1712,
+ 1740,
+ 47380,
+ 47380,
+ 47772,
+ 47772,
+ 6548,
+ 6628,
+ 848,
+ 848,
+ 784,
+ 784,
+ 49716,
+ 49716,
+ 1392,
+ 1388,
+ 672,
+ 672,
+ 1296,
+ 1296,
+ 2836,
+ 2836,
+ 412,
+ 412,
+ 63952,
+ 58536,
+ 98360,
+ 127632,
+ 812,
+ 812,
+ 1252,
+ 1252,
+ 788,
+ 788,
+ 1776,
+ 1776,
+ 896,
+ 896,
+ 2688,
+ 2664,
+ 46216,
+ 46216,
+ 46708,
+ 46708,
+ 3128,
+ 3156,
+ 53500,
+ 68276,
+ 70644,
+ 46952,
+ 46952,
+ 508,
+ 508,
+ 1012,
+ 1012,
+ 1312,
+ 1312,
+ 3808,
+ 3808,
+ 46956,
+ 46956,
+ 47796,
+ 47796,
+ 47180,
+ 47180,
+ 416,
+ 416,
+ 712,
+ 712,
+ 700,
+ 700,
+ 876,
+ 876,
+ 55600,
+ 46816,
+ 46816,
+ 472,
+ 472,
+ 46708,
+ 46708,
+ 55908,
+ 56324,
+ 49896,
+ 49824,
+ 2188,
+ 2200,
+ 752,
+ 752,
+ 48512,
+ 48932,
+ 46960,
+ 58460,
+ 58484,
+ 1356,
+ 1356,
+ 1200,
+ 1200,
+ 1148,
+ 1148,
+ 61100,
+ 61100,
+ 47848,
+ 47848,
+ 46964,
+ 46964,
+ 46824,
+ 46824,
+ 512,
+ 512,
+ 61532,
+ 61532,
+ 1000,
+ 1000,
+ 65224,
+ 68200,
+ 47352,
+ 47352,
+ 67644,
+ 69380,
+ 792,
+ 792,
+ 56360,
+ 56524,
+ 47812,
+ 46876,
+ 48852,
+ 48888,
+ 6436,
+ 6460,
+ 51752,
+ 51752,
+ 50952,
+ 50952,
+ 46880,
+ 128616,
+ 128616,
+ 3536,
+ 3536,
+ 1628,
+ 1628,
+ 47392,
+ 47392,
+ 58640,
+ 76924,
+ 1096,
+ 1096,
+ 52024,
+ 62968
+ ],
+ "stats.oom_score_adj": [
+ -800,
+ -1001,
+ 925,
+ -1001,
+ 100,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 975,
+ -1001,
+ -800,
+ -1001,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ 925,
+ -1001,
+ -1001,
+ 945,
+ -1001,
+ -1001,
+ 250,
+ 100,
+ -1001,
+ 100,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 965,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -700,
+ 500,
+ -1001,
+ 200,
+ 905,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -800,
+ 100,
+ -800,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 955,
+ 100,
+ -1001,
+ -700,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 0,
+ -1001,
+ 915,
+ 200,
+ -1001,
+ -1001,
+ -900,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 945,
+ 800,
+ -1001,
+ 100,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 100,
+ -1001,
+ 100,
+ 100,
+ -800,
+ -1001,
+ -1001,
+ -700,
+ 905,
+ -1001,
+ -1001,
+ -1001,
+ 935,
+ 600,
+ 955,
+ 200,
+ 100,
+ 200,
+ -1001,
+ 935,
+ -1001,
+ 100,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 975,
+ -1001,
+ 500,
+ 915,
+ 100,
+ -1001,
+ 200,
+ -700,
+ 100,
+ -1001,
+ -1001,
+ 965,
+ -1001,
+ 200,
+ 910,
+ 200,
+ -1001,
+ -1001,
+ 925,
+ 945,
+ -800,
+ -800,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 905,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -800,
+ -800,
+ -1001,
+ -1001,
+ 200,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 945,
+ 955,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 250,
+ 0,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 999,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 935,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -700,
+ -700,
+ 999,
+ 985,
+ -1001,
+ -1001,
+ 200,
+ 200,
+ 905,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 930,
+ -1001,
+ -1001,
+ 999,
+ 975,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 200,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -800,
+ -800,
+ 100,
+ 100,
+ -800,
+ -800,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 965,
+ 955,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -700,
+ -700,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 0,
+ 920,
+ -900,
+ -900,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 955,
+ 915,
+ 999,
+ 985,
+ -1001,
+ -1001,
+ 940,
+ 100,
+ 100,
+ 200,
+ 200,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 200,
+ 200,
+ 905,
+ 945,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 900,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 100,
+ 100,
+ 100,
+ 100,
+ -800,
+ -800,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -700,
+ -700,
+ 925,
+ 905,
+ 905,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 995,
+ 975,
+ 200,
+ 100,
+ 100,
+ 100,
+ 200,
+ 100,
+ -1001,
+ -1001,
+ 985,
+ 965,
+ -1001,
+ -1001,
+ 100,
+ 100,
+ 100,
+ 100,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 905,
+ 905,
+ 915,
+ 925,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ 200,
+ 200,
+ -700,
+ -700,
+ 935,
+ 100,
+ 100,
+ -1001,
+ -1001,
+ -1001,
+ -1001,
+ 975,
+ 965,
+ 600,
+ 0,
+ -1001,
+ -1001,
+ 200,
+ 200
+ ],
+ "stats.anon_rss_and_swap_in_kilobytes": [
+ 50728,
+ 26464,
+ 47488,
+ 784,
+ 46724,
+ 1996,
+ 920,
+ 4796,
+ 712,
+ 47592,
+ 1912,
+ 48432,
+ 1268,
+ 46796,
+ 636,
+ 764,
+ 776,
+ 54092,
+ 47536,
+ 900,
+ 46984,
+ 696,
+ 840,
+ 125996,
+ 46552,
+ 17160,
+ 49208,
+ 732,
+ 888,
+ 2104,
+ 636,
+ 5316,
+ 840,
+ 1460,
+ 3820,
+ 460,
+ 704,
+ 776,
+ 1280,
+ 1364,
+ 672,
+ 50232,
+ 30324,
+ 1584,
+ 704,
+ 1072,
+ 528,
+ 668,
+ 2348,
+ 51004,
+ 46676,
+ 1300,
+ 47152,
+ 62336,
+ 768,
+ 5488,
+ 1300,
+ 668,
+ 2232,
+ 848,
+ 3376,
+ 13816,
+ 2652,
+ 4256,
+ 776,
+ 888,
+ 756,
+ 1460,
+ 728,
+ 980,
+ 1824,
+ 708,
+ 884,
+ 47312,
+ 5280,
+ 1152,
+ 1248,
+ 788,
+ 768,
+ 972,
+ 79192,
+ 48884,
+ 50912,
+ 848,
+ 884,
+ 1032,
+ 4428,
+ 752,
+ 692,
+ 736,
+ 4496,
+ 1548,
+ 47220,
+ 48100,
+ 788,
+ 49508,
+ 1472,
+ 1300,
+ 2872,
+ 412,
+ 64952,
+ 728,
+ 46932,
+ 46616,
+ 46840,
+ 416,
+ 122764,
+ 812,
+ 1244,
+ 784,
+ 1984,
+ 676,
+ 2680,
+ 45840,
+ 46580,
+ 3068,
+ 70400,
+ 47088,
+ 512,
+ 996,
+ 1084,
+ 3648,
+ 720,
+ 704,
+ 880,
+ 46880,
+ 472,
+ 46604,
+ 68776,
+ 49624,
+ 2184,
+ 760,
+ 48376,
+ 60572,
+ 1356,
+ 1200,
+ 1144,
+ 68356,
+ 60268,
+ 47448,
+ 47688,
+ 46776,
+ 46628,
+ 508,
+ 74100,
+ 996,
+ 65360,
+ 48936,
+ 67588,
+ 5728,
+ 856,
+ 50300,
+ 792,
+ 57472,
+ 46316,
+ 48344,
+ 6432,
+ 51404,
+ 51856,
+ 133636,
+ 3532,
+ 1632,
+ 47204,
+ 1096,
+ 51624,
+ 52880,
+ 58800,
+ 26472,
+ 26472,
+ 47904,
+ 47904,
+ 50840,
+ 51112,
+ 1884,
+ 1884,
+ 836,
+ 836,
+ 53184,
+ 4512,
+ 4512,
+ 704,
+ 704,
+ 1888,
+ 1888,
+ 48448,
+ 48420,
+ 1344,
+ 1344,
+ 46996,
+ 46996,
+ 632,
+ 632,
+ 772,
+ 772,
+ 768,
+ 768,
+ 52204,
+ 52204,
+ 47636,
+ 47800,
+ 816,
+ 816,
+ 46856,
+ 46856,
+ 832,
+ 832,
+ 125400,
+ 125400,
+ 46604,
+ 46604,
+ 17168,
+ 17168,
+ 49752,
+ 49752,
+ 736,
+ 736,
+ 888,
+ 888,
+ 2104,
+ 2104,
+ 640,
+ 640,
+ 46768,
+ 5284,
+ 5284,
+ 836,
+ 836,
+ 1456,
+ 1456,
+ 3836,
+ 3836,
+ 460,
+ 460,
+ 708,
+ 708,
+ 768,
+ 768,
+ 1280,
+ 1280,
+ 752,
+ 752,
+ 1356,
+ 1356,
+ 804,
+ 804,
+ 30344,
+ 30944,
+ 1596,
+ 1596,
+ 908,
+ 908,
+ 684,
+ 684,
+ 52792,
+ 708,
+ 708,
+ 1048,
+ 1048,
+ 524,
+ 524,
+ 668,
+ 668,
+ 2392,
+ 2392,
+ 50992,
+ 50992,
+ 46828,
+ 46828,
+ 1304,
+ 1304,
+ 47380,
+ 47380,
+ 59676,
+ 60972,
+ 764,
+ 764,
+ 5472,
+ 5472,
+ 1292,
+ 1292,
+ 676,
+ 676,
+ 2316,
+ 2340,
+ 852,
+ 852,
+ 3368,
+ 3368,
+ 13900,
+ 15476,
+ 2712,
+ 2920,
+ 4296,
+ 4660,
+ 784,
+ 784,
+ 888,
+ 888,
+ 760,
+ 760,
+ 1456,
+ 1456,
+ 716,
+ 716,
+ 57176,
+ 988,
+ 988,
+ 46780,
+ 46780,
+ 1896,
+ 1924,
+ 700,
+ 700,
+ 880,
+ 880,
+ 47284,
+ 47284,
+ 6196,
+ 6308,
+ 1132,
+ 1132,
+ 1256,
+ 1364,
+ 780,
+ 780,
+ 772,
+ 908,
+ 972,
+ 972,
+ 75992,
+ 77580,
+ 49128,
+ 49128,
+ 51964,
+ 52972,
+ 840,
+ 840,
+ 984,
+ 984,
+ 1036,
+ 1036,
+ 4444,
+ 4460,
+ 752,
+ 752,
+ 692,
+ 692,
+ 732,
+ 732,
+ 4012,
+ 4012,
+ 1712,
+ 1740,
+ 47380,
+ 47380,
+ 47772,
+ 47772,
+ 6548,
+ 6628,
+ 848,
+ 848,
+ 784,
+ 784,
+ 49716,
+ 49716,
+ 1392,
+ 1388,
+ 672,
+ 672,
+ 1296,
+ 1296,
+ 2836,
+ 2836,
+ 412,
+ 412,
+ 63952,
+ 58536,
+ 98360,
+ 127632,
+ 812,
+ 812,
+ 1252,
+ 1252,
+ 788,
+ 788,
+ 1776,
+ 1776,
+ 896,
+ 896,
+ 2688,
+ 2664,
+ 46216,
+ 46216,
+ 46708,
+ 46708,
+ 3128,
+ 3156,
+ 53500,
+ 68276,
+ 70644,
+ 46952,
+ 46952,
+ 508,
+ 508,
+ 1012,
+ 1012,
+ 1312,
+ 1312,
+ 3808,
+ 3808,
+ 46956,
+ 46956,
+ 47796,
+ 47796,
+ 47180,
+ 47180,
+ 416,
+ 416,
+ 712,
+ 712,
+ 700,
+ 700,
+ 876,
+ 876,
+ 55600,
+ 46816,
+ 46816,
+ 472,
+ 472,
+ 46708,
+ 46708,
+ 55908,
+ 56324,
+ 49896,
+ 49824,
+ 2188,
+ 2200,
+ 752,
+ 752,
+ 48512,
+ 48932,
+ 46960,
+ 58460,
+ 58484,
+ 1356,
+ 1356,
+ 1200,
+ 1200,
+ 1148,
+ 1148,
+ 61100,
+ 61100,
+ 47848,
+ 47848,
+ 46964,
+ 46964,
+ 46824,
+ 46824,
+ 512,
+ 512,
+ 61532,
+ 61532,
+ 1000,
+ 1000,
+ 65224,
+ 68200,
+ 47352,
+ 47352,
+ 67644,
+ 69380,
+ 792,
+ 792,
+ 56360,
+ 56524,
+ 47812,
+ 46876,
+ 48852,
+ 48888,
+ 6436,
+ 6460,
+ 51752,
+ 51752,
+ 50952,
+ 50952,
+ 46880,
+ 128616,
+ 128616,
+ 3536,
+ 3536,
+ 1628,
+ 1628,
+ 47392,
+ 47392,
+ 58640,
+ 76924,
+ 1096,
+ 1096,
+ 52024,
+ 62968
+ ]
+ }
\ No newline at end of file