diff --git a/camera/Android.bp b/camera/Android.bp new file mode 100644 index 0000000..9d647c9 --- /dev/null +++ b/camera/Android.bp @@ -0,0 +1,20 @@ +package { + default_applicable_licenses: ["Android-Apache-2.0"], +} + +cc_binary { + name: "dump_camera", + srcs: ["dump_camera.cpp"], + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + shared_libs: [ + "libbase", + "libdump", + "liblog", + ], + vendor: true, + relative_install_path: "dump", +} diff --git a/camera/dump.mk b/camera/dump.mk new file mode 100644 index 0000000..a3a5c7a --- /dev/null +++ b/camera/dump.mk @@ -0,0 +1,4 @@ +BOARD_VENDOR_SEPOLICY_DIRS += device/google/gs-common/camera/sepolicy/ + +PRODUCT_PACKAGES_DEBUG += dump_camera + diff --git a/camera/dump_camera.cpp b/camera/dump_camera.cpp new file mode 100644 index 0000000..105c024 --- /dev/null +++ b/camera/dump_camera.cpp @@ -0,0 +1,42 @@ +/* + * Copyright 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 +#include +#include + +int main() { + if (!::android::base::GetBoolProperty("vendor.camera.debug.camera_performance_analyzer.attach_to_bugreport", true)) { + return 0; + } + + static const std::string kCameraLogDir = "/data/vendor/camera/profiler"; + const std::string cameraDestDir = concatenatePath(BUGREPORT_PACKING_DIR, "camera"); + + if (mkdir(cameraDestDir.c_str(), 0777) == -1) { + printf("Unable to create folder: %s\n", cameraDestDir.c_str()); + return 0; + } + + // Attach multiple latest sessions (in case the user is running concurrent + // sessions or starts a new session after the one with performance issues). + dumpLogs(kCameraLogDir.c_str(), cameraDestDir.c_str(), 10, "session-ended-"); + dumpLogs(kCameraLogDir.c_str(), cameraDestDir.c_str(), 5, "high-drop-rate-"); + dumpLogs(kCameraLogDir.c_str(), cameraDestDir.c_str(), 5, "watchdog-"); + dumpLogs(kCameraLogDir.c_str(), cameraDestDir.c_str(), 5, "camera-ended-"); + + return 0; +} + diff --git a/camera/sepolicy/dump_camera.te b/camera/sepolicy/dump_camera.te new file mode 100644 index 0000000..c431184 --- /dev/null +++ b/camera/sepolicy/dump_camera.te @@ -0,0 +1,9 @@ +pixel_bugreport(dump_camera) + +userdebug_or_eng(` + allow dump_camera vendor_camera_data_file:dir r_dir_perms; + allow dump_camera vendor_camera_data_file:file create_file_perms; + allow dump_camera radio_vendor_data_file:dir create_dir_perms; + allow dump_camera radio_vendor_data_file:file create_file_perms; + get_prop(dump_camera, vendor_camera_debug_prop) +') diff --git a/camera/sepolicy/file.te b/camera/sepolicy/file.te new file mode 100644 index 0000000..5f4a142 --- /dev/null +++ b/camera/sepolicy/file.te @@ -0,0 +1,2 @@ +type vendor_camera_data_file, file_type, data_file_type; + diff --git a/camera/sepolicy/file_contexts b/camera/sepolicy/file_contexts new file mode 100644 index 0000000..4bb5308 --- /dev/null +++ b/camera/sepolicy/file_contexts @@ -0,0 +1,5 @@ +/vendor/bin/dump/dump_camera u:object_r:dump_camera_exec:s0 + +# Data +/data/vendor/camera(/.*)? u:object_r:vendor_camera_data_file:s0 + diff --git a/camera/sepolicy/property.te b/camera/sepolicy/property.te new file mode 100644 index 0000000..19d6a2f --- /dev/null +++ b/camera/sepolicy/property.te @@ -0,0 +1,2 @@ +vendor_internal_prop(vendor_camera_debug_prop) + diff --git a/camera/sepolicy/property_contexts b/camera/sepolicy/property_contexts new file mode 100644 index 0000000..5e2c815 --- /dev/null +++ b/camera/sepolicy/property_contexts @@ -0,0 +1,2 @@ +vendor.camera.debug. u:object_r:vendor_camera_debug_prop:s0 +