Upgrade android.hardware.dumpstate from HIDL 1.1 to AIDL 1

lshal is not supported for AIDL, now use dumpsys instead.
Update the debug command as below.
  Old: lshal debug android.hardware.dumpstate@1.1::IDumpstateDevice/default [section]
  New: dumpsys android.hardware.dumpstate.IDumpstateDevice/default [section]

Currently dumpsys does not start the Lazy HAL service, only dumpstate does.
Because we need to run dumpsys for debugging, keep the dumpstate HAL running at boot.
Do not set it to be a lazy HAL.

Test: atest VtsHalDumpstateTargetTest pass
      adb shell dumpsys -t 30 android.hardware.dumpstate.IDumpstateDevice/default all
Bug: 223118410
Change-Id: I7f866a57c3eff8c9783fee89dce205cf9728c459
This commit is contained in:
Alex Hong 2022-03-30 00:40:39 +08:00
parent 101c17fc95
commit cbc81c7f5b
9 changed files with 136 additions and 183 deletions

View file

@ -422,7 +422,7 @@ PRODUCT_PACKAGES += \
# dumpstate HAL # dumpstate HAL
PRODUCT_PACKAGES += \ PRODUCT_PACKAGES += \
android.hardware.dumpstate@1.1-service.gs201 android.hardware.dumpstate-service.gs201
# AoC support # AoC support
include device/google/gs201/aoc/device.mk include device/google/gs201/aoc/device.mk

View file

@ -21,14 +21,6 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<hal format="hidl">
<name>android.hardware.dumpstate</name>
<version>1.1</version>
<interface>
<name>IDumpstateDevice</name>
<instance>default</instance>
</interface>
</hal>
<hal format="aidl"> <hal format="aidl">
<name>android.hardware.gnss</name> <name>android.hardware.gnss</name>
<interface> <interface>

View file

@ -16,7 +16,7 @@
LOCAL_PATH:= $(call my-dir) LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS) include $(CLEAR_VARS)
LOCAL_MODULE := android.hardware.dumpstate@1.1-service.gs201 LOCAL_MODULE := android.hardware.dumpstate-service.gs201
LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0 LOCAL_LICENSE_KINDS := SPDX-license-identifier-Apache-2.0
LOCAL_LICENSE_CONDITIONS := notice LOCAL_LICENSE_CONDITIONS := notice
LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE LOCAL_NOTICE_FILE := $(LOCAL_PATH)/../NOTICE
@ -24,20 +24,17 @@ LOCAL_INIT_RC := android.hardware.dumpstate@1.1-service.gs201.rc
LOCAL_MODULE_RELATIVE_PATH := hw LOCAL_MODULE_RELATIVE_PATH := hw
LOCAL_SRC_FILES := \ LOCAL_SRC_FILES := \
DumpstateDevice.cpp \ Dumpstate.cpp \
service.cpp service.cpp
LOCAL_SHARED_LIBRARIES := \ LOCAL_SHARED_LIBRARIES := \
android.hardware.dumpstate@1.0 \
android.hardware.dumpstate@1.1 \
libbase \ libbase \
libbinder_ndk \
libcutils \ libcutils \
libdumpstateutil \ libdumpstateutil \
libhidlbase \
libhidltransport \
libhwbinder \
liblog \ liblog \
libutils libutils \
android.hardware.dumpstate-V1-ndk
LOCAL_CFLAGS := -Werror -Wall LOCAL_CFLAGS := -Werror -Wall

View file

@ -22,11 +22,10 @@
#include <android-base/stringprintf.h> #include <android-base/stringprintf.h>
#include <android-base/properties.h> #include <android-base/properties.h>
#include <android-base/unique_fd.h> #include <android-base/unique_fd.h>
#include <hidl/HidlBinderSupport.h>
#include <log/log.h> #include <log/log.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "DumpstateDevice.h" #include "Dumpstate.h"
#include "DumpstateUtil.h" #include "DumpstateUtil.h"
@ -56,11 +55,10 @@ using android::os::dumpstate::DumpFileToFd;
using android::os::dumpstate::PropertiesHelper; using android::os::dumpstate::PropertiesHelper;
using android::os::dumpstate::RunCommandToFd; using android::os::dumpstate::RunCommandToFd;
namespace aidl {
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace dumpstate { namespace dumpstate {
namespace V1_1 {
namespace implementation {
#define GPS_LOG_PREFIX "gl-" #define GPS_LOG_PREFIX "gl-"
#define GPS_MCU_LOG_PREFIX "esw-" #define GPS_MCU_LOG_PREFIX "esw-"
@ -74,7 +72,7 @@ typedef std::chrono::time_point<std::chrono::steady_clock> timepoint_t;
const char kVerboseLoggingProperty[] = "persist.vendor.verbose_logging_enabled"; const char kVerboseLoggingProperty[] = "persist.vendor.verbose_logging_enabled";
void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum, void Dumpstate::dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum,
const char *logPrefix) { const char *logPrefix) {
struct dirent **dirent_list = NULL; struct dirent **dirent_list = NULL;
int num_entries = scandir(srcDir.c_str(), int num_entries = scandir(srcDir.c_str(),
@ -120,11 +118,11 @@ void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir,
free(dirent_list); free(dirent_list);
} }
void DumpstateDevice::dumpRilLogs(int fd, std::string destDir) { void Dumpstate::dumpRilLogs(int fd, std::string destDir) {
std::string rilLogDir = std::string rilLogDir =
android::base::GetProperty(RIL_LOG_DIRECTORY_PROPERTY, RIL_LOG_DIRECTORY); ::android::base::GetProperty(RIL_LOG_DIRECTORY_PROPERTY, RIL_LOG_DIRECTORY);
int maxFileNum = android::base::GetIntProperty(RIL_LOG_NUMBER_PROPERTY, 50); int maxFileNum = ::android::base::GetIntProperty(RIL_LOG_NUMBER_PROPERTY, 50);
const std::string currentLogDir = rilLogDir + "/cur"; const std::string currentLogDir = rilLogDir + "/cur";
const std::string previousLogDir = rilLogDir + "/prev"; const std::string previousLogDir = rilLogDir + "/prev";
@ -191,11 +189,11 @@ void dumpModemEFS(std::string destDir) {
} }
} }
void DumpstateDevice::dumpGpsLogs(int fd, const std::string &destDir) { void Dumpstate::dumpGpsLogs(int fd, const std::string &destDir) {
const std::string gpsLogDir = GPS_LOG_DIRECTORY; const std::string gpsLogDir = GPS_LOG_DIRECTORY;
const std::string gpsTmpLogDir = gpsLogDir + "/.tmp"; const std::string gpsTmpLogDir = gpsLogDir + "/.tmp";
const std::string gpsDestDir = destDir + "/gps"; const std::string gpsDestDir = destDir + "/gps";
int maxFileNum = android::base::GetIntProperty(GPS_LOG_NUMBER_PROPERTY, 20); int maxFileNum = ::android::base::GetIntProperty(GPS_LOG_NUMBER_PROPERTY, 20);
RunCommandToFd(fd, "MKDIR GPS LOG", {"/vendor/bin/mkdir", "-p", gpsDestDir.c_str()}, RunCommandToFd(fd, "MKDIR GPS LOG", {"/vendor/bin/mkdir", "-p", gpsDestDir.c_str()},
CommandOptions::WithTimeout(2).Build()); CommandOptions::WithTimeout(2).Build());
@ -205,7 +203,7 @@ void DumpstateDevice::dumpGpsLogs(int fd, const std::string &destDir) {
dumpLogs(fd, gpsLogDir, gpsDestDir, maxFileNum, GPS_LOG_PREFIX); dumpLogs(fd, gpsLogDir, gpsDestDir, maxFileNum, GPS_LOG_PREFIX);
} }
void DumpstateDevice::dumpCameraLogs(int fd, const std::string &destDir) { void Dumpstate::dumpCameraLogs(int fd, const std::string &destDir) {
static const std::string kCameraLogDir = "/data/vendor/camera/profiler"; static const std::string kCameraLogDir = "/data/vendor/camera/profiler";
const std::string cameraDestDir = destDir + "/camera"; const std::string cameraDestDir = destDir + "/camera";
RunCommandToFd(fd, "MKDIR CAMERA LOG", {"/vendor/bin/mkdir", "-p", cameraDestDir.c_str()}, RunCommandToFd(fd, "MKDIR CAMERA LOG", {"/vendor/bin/mkdir", "-p", cameraDestDir.c_str()},
@ -219,7 +217,7 @@ void DumpstateDevice::dumpCameraLogs(int fd, const std::string &destDir) {
} }
timepoint_t startSection(int fd, const std::string &sectionName) { timepoint_t startSection(int fd, const std::string &sectionName) {
android::base::WriteStringToFd( ::android::base::WriteStringToFd(
"\n" "\n"
"------ Section start: " + sectionName + " ------\n" "------ Section start: " + sectionName + " ------\n"
"\n", fd); "\n", fd);
@ -231,7 +229,7 @@ void endSection(int fd, const std::string &sectionName, timepoint_t startTime) {
auto elapsedMsec = std::chrono::duration_cast<std::chrono::milliseconds> auto elapsedMsec = std::chrono::duration_cast<std::chrono::milliseconds>
(endTime - startTime).count(); (endTime - startTime).count();
android::base::WriteStringToFd( ::android::base::WriteStringToFd(
"\n" "\n"
"------ Section end: " + sectionName + " ------\n" "------ Section end: " + sectionName + " ------\n"
"Elapsed msec: " + std::to_string(elapsedMsec) + "\n" "Elapsed msec: " + std::to_string(elapsedMsec) + "\n"
@ -243,13 +241,13 @@ void endSection(int fd, const std::string &sectionName, timepoint_t startTime) {
// related to each other - for instance, for a Foo peripheral - please add them // related to each other - for instance, for a Foo peripheral - please add them
// to a new dump function and include it in this table so it can be accessed from the // to a new dump function and include it in this table so it can be accessed from the
// command line, e.g.: // command line, e.g.:
// lshal debug android.hardware.dumpstate@1.0::IDumpstateDevice/default foo // dumpsys android.hardware.dumpstate.IDumpstateDevice/default foo
// //
// However, if your addition generates attachments and/or binary data for the // However, if your addition generates attachments and/or binary data for the
// bugreport (i.e. if it requires two file descriptors to execute), it must not be // bugreport (i.e. if it requires two file descriptors to execute), it must not be
// added to this table and should instead be added to dumpstateBoard() below. // added to this table and should instead be added to dumpstateBoard() below.
DumpstateDevice::DumpstateDevice() Dumpstate::Dumpstate()
: mTextSections{ : mTextSections{
{ "wlan", [this](int fd) { dumpWlanSection(fd); } }, { "wlan", [this](int fd) { dumpWlanSection(fd); } },
{ "soc", [this](int fd) { dumpSocSection(fd); } }, { "soc", [this](int fd) { dumpSocSection(fd); } },
@ -270,9 +268,9 @@ DumpstateDevice::DumpstateDevice()
} { } {
} }
// Dump data requested by an argument to the "debug" HAL interface, or help info // Dump data requested by an argument to the "dump" interface, or help info
// if the specified section is not supported. // if the specified section is not supported.
void DumpstateDevice::dumpTextSection(int fd, const std::string &sectionName) { void Dumpstate::dumpTextSection(int fd, const std::string &sectionName) {
bool dumpAll = (sectionName == kAllSections); bool dumpAll = (sectionName == kAllSections);
for (const auto &section : mTextSections) { for (const auto &section : mTextSections) {
@ -292,17 +290,17 @@ void DumpstateDevice::dumpTextSection(int fd, const std::string &sectionName) {
} }
// An unsupported section was requested on the command line // An unsupported section was requested on the command line
android::base::WriteStringToFd("Unrecognized text section: " + sectionName + "\n", fd); ::android::base::WriteStringToFd("Unrecognized text section: " + sectionName + "\n", fd);
android::base::WriteStringToFd("Try \"" + kAllSections + "\" or one of the following:", fd); ::android::base::WriteStringToFd("Try \"" + kAllSections + "\" or one of the following:", fd);
for (const auto &section : mTextSections) { for (const auto &section : mTextSections) {
android::base::WriteStringToFd(" " + section.first, fd); ::android::base::WriteStringToFd(" " + section.first, fd);
} }
android::base::WriteStringToFd("\nNote: sections with attachments (e.g. modem) are" ::android::base::WriteStringToFd("\nNote: sections with attachments (e.g. modem) are"
"not avalable from the command line.\n", fd); "not avalable from the command line.\n", fd);
} }
// Dump items related to wlan // Dump items related to wlan
void DumpstateDevice::dumpWlanSection(int fd) { void Dumpstate::dumpWlanSection(int fd) {
RunCommandToFd(fd, "WLAN Debug Dump", {"/vendor/bin/sh", "-c", RunCommandToFd(fd, "WLAN Debug Dump", {"/vendor/bin/sh", "-c",
"cat /sys/wifi/dump_start"}); "cat /sys/wifi/dump_start"});
@ -311,7 +309,7 @@ void DumpstateDevice::dumpWlanSection(int fd) {
} }
// Dump items related to power and battery // Dump items related to power and battery
void DumpstateDevice::dumpPowerSection(int fd) { void Dumpstate::dumpPowerSection(int fd) {
struct stat buffer; struct stat buffer;
RunCommandToFd(fd, "Power Stats Times", {"/vendor/bin/sh", "-c", RunCommandToFd(fd, "Power Stats Times", {"/vendor/bin/sh", "-c",
@ -490,7 +488,7 @@ void DumpstateDevice::dumpPowerSection(int fd) {
} }
// Dump items related to thermal // Dump items related to thermal
void DumpstateDevice::dumpThermalSection(int fd) { void Dumpstate::dumpThermalSection(int fd) {
RunCommandToFd(fd, "Temperatures", {"/vendor/bin/sh", "-c", RunCommandToFd(fd, "Temperatures", {"/vendor/bin/sh", "-c",
"for f in /sys/class/thermal/thermal* ; do " "for f in /sys/class/thermal/thermal* ; do "
"type=`cat $f/type` ; temp=`cat $f/temp` ; echo \"$type: $temp\" ; " "type=`cat $f/type` ; temp=`cat $f/temp` ; echo \"$type: $temp\" ; "
@ -522,7 +520,7 @@ void DumpstateDevice::dumpThermalSection(int fd) {
} }
// Dump items related to touch // Dump items related to touch
void DumpstateDevice::dumpTouchSection(int fd) { void Dumpstate::dumpTouchSection(int fd) {
const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0", const char stm_cmd_path[4][50] = {"/sys/class/spi_master/spi11/spi11.0",
"/proc/fts/driver_test", "/proc/fts/driver_test",
"/sys/class/spi_master/spi6/spi6.0", "/sys/class/spi_master/spi6/spi6.0",
@ -820,7 +818,7 @@ void DumpstateDevice::dumpTouchSection(int fd) {
} }
// Dump items related to SoC // Dump items related to SoC
void DumpstateDevice::dumpSocSection(int fd) { void Dumpstate::dumpSocSection(int fd) {
DumpFileToFd(fd, "AP HW TUNE", "/sys/devices/system/chip-id/ap_hw_tune_str"); DumpFileToFd(fd, "AP HW TUNE", "/sys/devices/system/chip-id/ap_hw_tune_str");
DumpFileToFd(fd, "EVT VERSION", "/sys/devices/system/chip-id/evt_ver"); DumpFileToFd(fd, "EVT VERSION", "/sys/devices/system/chip-id/evt_ver");
DumpFileToFd(fd, "LOT ID", "/sys/devices/system/chip-id/lot_id"); DumpFileToFd(fd, "LOT ID", "/sys/devices/system/chip-id/lot_id");
@ -830,7 +828,7 @@ void DumpstateDevice::dumpSocSection(int fd) {
} }
// Dump items related to CPUs // Dump items related to CPUs
void DumpstateDevice::dumpCpuSection(int fd) { void Dumpstate::dumpCpuSection(int fd) {
DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present"); DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present");
DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online"); DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online");
RunCommandToFd(fd, "CPU time-in-state", {"/vendor/bin/sh", "-c", RunCommandToFd(fd, "CPU time-in-state", {"/vendor/bin/sh", "-c",
@ -850,7 +848,7 @@ void DumpstateDevice::dumpCpuSection(int fd) {
} }
// Dump items related to Devfreq & BTS // Dump items related to Devfreq & BTS
void DumpstateDevice::dumpDevfreqSection(int fd) { void Dumpstate::dumpDevfreqSection(int fd) {
DumpFileToFd(fd, "MIF DVFS", DumpFileToFd(fd, "MIF DVFS",
"/sys/devices/platform/17000010.devfreq_mif/devfreq/17000010.devfreq_mif/time_in_state"); "/sys/devices/platform/17000010.devfreq_mif/devfreq/17000010.devfreq_mif/time_in_state");
DumpFileToFd(fd, "INT DVFS", DumpFileToFd(fd, "INT DVFS",
@ -871,7 +869,7 @@ void DumpstateDevice::dumpDevfreqSection(int fd) {
} }
// Dump items related to memory // Dump items related to memory
void DumpstateDevice::dumpMemorySection(int fd) { void Dumpstate::dumpMemorySection(int fd) {
RunCommandToFd(fd, "ION HEAPS", {"/vendor/bin/sh", "-c", RunCommandToFd(fd, "ION HEAPS", {"/vendor/bin/sh", "-c",
"for d in $(ls -d /d/ion/*); do " "for d in $(ls -d /d/ion/*); do "
"if [ -f $d ]; then " "if [ -f $d ]; then "
@ -945,13 +943,13 @@ static void DumpUFS(int fd) {
} }
// Dump items related to storage // Dump items related to storage
void DumpstateDevice::dumpStorageSection(int fd) { void Dumpstate::dumpStorageSection(int fd) {
DumpF2FS(fd); DumpF2FS(fd);
DumpUFS(fd); DumpUFS(fd);
} }
// Dump items related to display // Dump items related to display
void DumpstateDevice::dumpDisplaySection(int fd) { void Dumpstate::dumpDisplaySection(int fd) {
DumpFileToFd(fd, "CRTC-0 underrun count", "/sys/kernel/debug/dri/0/crtc-0/underrun_cnt"); DumpFileToFd(fd, "CRTC-0 underrun count", "/sys/kernel/debug/dri/0/crtc-0/underrun_cnt");
DumpFileToFd(fd, "CRTC-0 crc count", "/sys/kernel/debug/dri/0/crtc-0/crc_cnt"); DumpFileToFd(fd, "CRTC-0 crc count", "/sys/kernel/debug/dri/0/crtc-0/crc_cnt");
DumpFileToFd(fd, "CRTC-0 ecc count", "/sys/kernel/debug/dri/0/crtc-0/ecc_cnt"); DumpFileToFd(fd, "CRTC-0 ecc count", "/sys/kernel/debug/dri/0/crtc-0/ecc_cnt");
@ -971,7 +969,7 @@ void DumpstateDevice::dumpDisplaySection(int fd) {
} }
// Dump items related to AoC // Dump items related to AoC
void DumpstateDevice::dumpAoCSection(int fd) { void Dumpstate::dumpAoCSection(int fd) {
DumpFileToFd(fd, "AoC Service Status", "/sys/devices/platform/19000000.aoc/services"); DumpFileToFd(fd, "AoC Service Status", "/sys/devices/platform/19000000.aoc/services");
DumpFileToFd(fd, "AoC Restarts", "/sys/devices/platform/19000000.aoc/restart_count"); DumpFileToFd(fd, "AoC Restarts", "/sys/devices/platform/19000000.aoc/restart_count");
DumpFileToFd(fd, "AoC Coredumps", "/sys/devices/platform/19000000.aoc/coredump_count"); DumpFileToFd(fd, "AoC Coredumps", "/sys/devices/platform/19000000.aoc/coredump_count");
@ -1001,14 +999,14 @@ void DumpstateDevice::dumpAoCSection(int fd) {
} }
// Dump items related to sensors usf. // Dump items related to sensors usf.
void DumpstateDevice::dumpSensorsUSFSection(int fd) { void Dumpstate::dumpSensorsUSFSection(int fd) {
CommandOptions options = CommandOptions::WithTimeout(2).Build(); CommandOptions options = CommandOptions::WithTimeout(2).Build();
RunCommandToFd(fd, "USF statistics", RunCommandToFd(fd, "USF statistics",
{"/vendor/bin/sh", "-c", "usf_stats get --all"}, {"/vendor/bin/sh", "-c", "usf_stats get --all"},
options); options);
if (!PropertiesHelper::IsUserBuild()) { if (!PropertiesHelper::IsUserBuild()) {
// Not a user build, if this is also not a production device dump the USF registry. // Not a user build, if this is also not a production device dump the USF registry.
std::string hwRev = android::base::GetProperty(HW_REVISION, ""); std::string hwRev = ::android::base::GetProperty(HW_REVISION, "");
if (hwRev.find("PROTO") != std::string::npos || if (hwRev.find("PROTO") != std::string::npos ||
hwRev.find("EVT") != std::string::npos || hwRev.find("EVT") != std::string::npos ||
hwRev.find("DVT") != std::string::npos) { hwRev.find("DVT") != std::string::npos) {
@ -1021,7 +1019,7 @@ void DumpstateDevice::dumpSensorsUSFSection(int fd) {
// Gzip binary data and dump to fd in base64 format. Cmd to decode is also attached. // Gzip binary data and dump to fd in base64 format. Cmd to decode is also attached.
void dumpGzippedFileInBase64ToFd(int fd, const char* title, const char* file_path) { void dumpGzippedFileInBase64ToFd(int fd, const char* title, const char* file_path) {
auto cmd = android::base::StringPrintf("echo 'base64 -d <<EOF | gunzip' ; " auto cmd = ::android::base::StringPrintf("echo 'base64 -d <<EOF | gunzip' ; "
"/vendor/bin/gzip < \"%s\" | /vendor/bin/base64 ; " "/vendor/bin/gzip < \"%s\" | /vendor/bin/base64 ; "
"echo 'EOF'", file_path); "echo 'EOF'", file_path);
RunCommandToFd(fd, title, RunCommandToFd(fd, title,
@ -1036,15 +1034,15 @@ struct abl_log_header {
} __attribute__((packed)); } __attribute__((packed));
// Dump items related to ramdump. // Dump items related to ramdump.
void DumpstateDevice::dumpRamdumpSection(int fd) { void Dumpstate::dumpRamdumpSection(int fd) {
std::string abl_log; std::string abl_log;
if (android::base::ReadFileToString("/mnt/vendor/ramdump/abl.log", &abl_log)) { if (::android::base::ReadFileToString("/mnt/vendor/ramdump/abl.log", &abl_log)) {
const struct abl_log_header *header = (const struct abl_log_header*) abl_log.c_str(); const struct abl_log_header *header = (const struct abl_log_header*) abl_log.c_str();
android::base::WriteStringToFd(android::base::StringPrintf( ::android::base::WriteStringToFd(::android::base::StringPrintf(
"------ Ramdump misc file: abl.log (i:0x%" PRIx64 " size:0x%" PRIx64 ") ------\n%s\n", "------ Ramdump misc file: abl.log (i:0x%" PRIx64 " size:0x%" PRIx64 ") ------\n%s\n",
header->i, header->size, std::string(header->buf, header->i).c_str()), fd); header->i, header->size, std::string(header->buf, header->i).c_str()), fd);
} else { } else {
android::base::WriteStringToFd("*** Ramdump misc file: abl.log: File not found\n", fd); ::android::base::WriteStringToFd("*** Ramdump misc file: abl.log: File not found\n", fd);
} }
dumpGzippedFileInBase64ToFd( dumpGzippedFileInBase64ToFd(
fd, "Ramdump misc file: acpm.lst (gzipped in base64)", "/mnt/vendor/ramdump/acpm.lst"); fd, "Ramdump misc file: acpm.lst (gzipped in base64)", "/mnt/vendor/ramdump/acpm.lst");
@ -1053,23 +1051,23 @@ void DumpstateDevice::dumpRamdumpSection(int fd) {
} }
// Dump items that don't fit well into any other section // Dump items that don't fit well into any other section
void DumpstateDevice::dumpMiscSection(int fd) { void Dumpstate::dumpMiscSection(int fd) {
RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"}); RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"});
DumpFileToFd(fd, "VENDOR PROC DUMP", "/proc/vendor_sched/dump_task"); DumpFileToFd(fd, "VENDOR PROC DUMP", "/proc/vendor_sched/dump_task");
} }
// Dump items related to GSC // Dump items related to GSC
void DumpstateDevice::dumpGscSection(int fd) { void Dumpstate::dumpGscSection(int fd) {
RunCommandToFd(fd, "Citadel VERSION", {"vendor/bin/hw/citadel_updater", "-lv"}); RunCommandToFd(fd, "Citadel VERSION", {"vendor/bin/hw/citadel_updater", "-lv"});
RunCommandToFd(fd, "Citadel STATS", {"vendor/bin/hw/citadel_updater", "--stats"}); RunCommandToFd(fd, "Citadel STATS", {"vendor/bin/hw/citadel_updater", "--stats"});
RunCommandToFd(fd, "GSC DEBUG DUMP", {"vendor/bin/hw/citadel_updater", "-D"}); RunCommandToFd(fd, "GSC DEBUG DUMP", {"vendor/bin/hw/citadel_updater", "-D"});
} }
void DumpstateDevice::dumpTrustySection(int fd) { void Dumpstate::dumpTrustySection(int fd) {
DumpFileToFd(fd, "Trusty TEE0 Logs", "/dev/trusty-log0"); DumpFileToFd(fd, "Trusty TEE0 Logs", "/dev/trusty-log0");
} }
void DumpstateDevice::dumpModem(int fd, int fdModem) void Dumpstate::dumpModem(int fd, int fdModem)
{ {
std::string modemLogDir = MODEM_LOG_DIRECTORY; std::string modemLogDir = MODEM_LOG_DIRECTORY;
std::string extendedLogDir = MODEM_EXTENDED_LOG_DIRECTORY; std::string extendedLogDir = MODEM_EXTENDED_LOG_DIRECTORY;
@ -1092,29 +1090,29 @@ void DumpstateDevice::dumpModem(int fd, int fdModem)
RunCommandToFd(fd, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build()); RunCommandToFd(fd, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
if (!PropertiesHelper::IsUserBuild()) { if (!PropertiesHelper::IsUserBuild()) {
bool modemLogEnabled = android::base::GetBoolProperty(MODEM_LOGGING_PERSIST_PROPERTY, false); bool modemLogEnabled = ::android::base::GetBoolProperty(MODEM_LOGGING_PERSIST_PROPERTY, false);
bool gpsLogEnabled = android::base::GetBoolProperty(GPS_LOGGING_STATUS_PROPERTY, false); bool gpsLogEnabled = ::android::base::GetBoolProperty(GPS_LOGGING_STATUS_PROPERTY, false);
bool tcpdumpEnabled = android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false); bool tcpdumpEnabled = ::android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false);
bool cameraLogsEnabled = android::base::GetBoolProperty( bool cameraLogsEnabled = ::android::base::GetBoolProperty(
"vendor.camera.debug.camera_performance_analyzer.attach_to_bugreport", true); "vendor.camera.debug.camera_performance_analyzer.attach_to_bugreport", true);
int maxFileNum = android::base::GetIntProperty(MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY, 100); int maxFileNum = ::android::base::GetIntProperty(MODEM_LOGGING_NUMBER_BUGREPORT_PROPERTY, 100);
if (tcpdumpEnabled) { if (tcpdumpEnabled) {
dumpLogs(fd, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX); dumpLogs(fd, tcpdumpLogDir, modemLogAllDir, ::android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX);
} }
if (modemLogEnabled) { if (modemLogEnabled) {
bool modemLogStarted = android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false); bool modemLogStarted = ::android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false);
if (modemLogStarted) { if (modemLogStarted) {
android::base::SetProperty(MODEM_LOGGING_PROPERTY, "false"); ::android::base::SetProperty(MODEM_LOGGING_PROPERTY, "false");
ALOGD("Stopping modem logging...\n"); ALOGD("Stopping modem logging...\n");
} else { } else {
ALOGD("modem logging is not running\n"); ALOGD("modem logging is not running\n");
} }
for (int i = 0; i < 30; i++) { for (int i = 0; i < 30; i++) {
if (!android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false)) { if (!::android::base::GetBoolProperty(MODEM_LOGGING_STATUS_PROPERTY, false)) {
ALOGD("modem logging stopped\n"); ALOGD("modem logging stopped\n");
sleep(1); sleep(1);
break; break;
@ -1126,7 +1124,7 @@ void DumpstateDevice::dumpModem(int fd, int fdModem)
if (modemLogStarted) { if (modemLogStarted) {
ALOGD("Restarting modem logging...\n"); ALOGD("Restarting modem logging...\n");
android::base::SetProperty(MODEM_LOGGING_PROPERTY, "true"); ::android::base::SetProperty(MODEM_LOGGING_PROPERTY, "true");
} }
} }
@ -1150,7 +1148,7 @@ void DumpstateDevice::dumpModem(int fd, int fdModem)
RunCommandToFd(fd, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build()); RunCommandToFd(fd, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
std::vector<uint8_t> buffer(65536); std::vector<uint8_t> buffer(65536);
android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK))); ::android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)));
if (fdLog >= 0) { if (fdLog >= 0) {
while (1) { while (1) {
@ -1178,89 +1176,79 @@ void DumpstateDevice::dumpModem(int fd, int fdModem)
endSection(fd, sectionName, startTime); endSection(fd, sectionName, startTime);
} }
// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. ndk::ScopedAStatus Dumpstate::dumpstateBoard(const std::vector<::ndk::ScopedFileDescriptor>& in_fds,
Return<void> DumpstateDevice::dumpstateBoard(const hidl_handle &handle) { IDumpstateDevice::DumpstateMode in_mode,
// Ignore return value, just return an empty status. int64_t in_timeoutMillis) {
dumpstateBoard_1_1(handle, DumpstateMode::DEFAULT, 30 * 1000 /* timeoutMillis */);
return Void();
}
// Methods from ::android::hardware::dumpstate::V1_1::IDumpstateDevice follow.
Return<DumpstateStatus> DumpstateDevice::dumpstateBoard_1_1(const hidl_handle& handle,
const DumpstateMode mode,
const uint64_t timeoutMillis) {
// Unused arguments. // Unused arguments.
(void) timeoutMillis; (void) in_timeoutMillis;
if (handle == nullptr || handle->numFds < 1) { if (in_fds.size() < 1) {
ALOGE("no FDs\n"); ALOGE("no FDs\n");
return DumpstateStatus::ILLEGAL_ARGUMENT; return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"No file descriptor");
} }
int fd = handle->data[0]; int fd = in_fds[0].get();
if (fd < 0) { if (fd < 0) {
ALOGE("invalid FD: %d\n", handle->data[0]); ALOGE("invalid FD: %d\n", fd);
return DumpstateStatus::ILLEGAL_ARGUMENT; return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Invalid file descriptor");
} }
if (mode == DumpstateMode::WEAR) { if (in_mode == IDumpstateDevice::DumpstateMode::WEAR) {
// We aren't a Wear device. // We aren't a Wear device.
ALOGE("Unsupported mode: %d\n", mode); ALOGE("Unsupported mode: %d\n", in_mode);
return DumpstateStatus::UNSUPPORTED_MODE; return ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(ERROR_UNSUPPORTED_MODE,
} else if (mode < DumpstateMode::FULL || mode > DumpstateMode::PROTO) { "Unsupported mode");
ALOGE("Invalid mode: %d\n", mode); } else if (in_mode < IDumpstateDevice::DumpstateMode::FULL || in_mode > IDumpstateDevice::DumpstateMode::PROTO) {
return DumpstateStatus::ILLEGAL_ARGUMENT; ALOGE("Invalid mode: %d\n", in_mode);
return ndk::ScopedAStatus::fromExceptionCodeWithMessage(EX_ILLEGAL_ARGUMENT,
"Invalid mode");
} }
dumpTextSection(fd, kAllSections); dumpTextSection(fd, kAllSections);
if (handle->numFds < 2) { if (in_fds.size() < 1) {
ALOGE("no FD for modem\n"); ALOGE("no FD for modem\n");
} else { } else {
int fdModem = handle->data[1]; int fdModem = in_fds[1].get();
dumpModem(fd, fdModem); dumpModem(fd, fdModem);
} }
return DumpstateStatus::OK; return ndk::ScopedAStatus::ok();
} }
Return<void> DumpstateDevice::setVerboseLoggingEnabled(const bool enable) { ndk::ScopedAStatus Dumpstate::setVerboseLoggingEnabled(bool in_enable) {
::android::base::SetProperty(kVerboseLoggingProperty, enable ? "true" : "false"); ::android::base::SetProperty(kVerboseLoggingProperty, in_enable ? "true" : "false");
return Void(); return ndk::ScopedAStatus::ok();
} }
Return<bool> DumpstateDevice::getVerboseLoggingEnabled() { ndk::ScopedAStatus Dumpstate::getVerboseLoggingEnabled(bool* _aidl_return) {
return ::android::base::GetBoolProperty(kVerboseLoggingProperty, false); *_aidl_return = ::android::base::GetBoolProperty(kVerboseLoggingProperty, false);
return ndk::ScopedAStatus::ok();
} }
// Since HALs that support the debug() interface are automatically invoked during // Since AIDLs that support the dump() interface are automatically invoked during
// bugreport generation and we don't want to generate a second copy of the same // bugreport generation and we don't want to generate a second copy of the same
// data that will go into dumpstate_board.txt, this function will only do // data that will go into dumpstate_board.txt, this function will only do
// something if it is called with an option, e.g. // something if it is called with an option, e.g.
// lshal debug android.hardware.dumpstate@1.0::IDumpstateDevice/default all // dumpsys android.hardware.dumpstate.IDumpstateDevice/default all
// //
// Also, note that sections which generate attachments and/or binary data when // Also, note that sections which generate attachments and/or binary data when
// included in a bugreport are not available through the debug() interface. // included in a bugreport are not available through the dump() interface.
Return<void> DumpstateDevice::debug(const hidl_handle &handle, const hidl_vec<hidl_string> &args) { binder_status_t Dumpstate::dump(int fd, const char** args, uint32_t numArgs) {
// Exit when dump is completed since this is a lazy HAL.
addPostCommandTask([]() {
exit(0);
});
if (handle == nullptr || handle->numFds < 1 || args.size() != 1) { if (numArgs != 1) {
return Void(); return STATUS_OK;
} }
int fd = handle->data[0];
dumpTextSection(fd, static_cast<std::string>(args[0])); dumpTextSection(fd, static_cast<std::string>(args[0]));
fsync(fd); fsync(fd);
return Void(); return STATUS_OK;
} }
} // namespace implementation
} // namespace V1_1
} // namespace dumpstate } // namespace dumpstate
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
} // namespace aidl

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 The Android Open Source Project * Copyright (C) 2022 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -13,44 +13,31 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#ifndef ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H
#define ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H
#include <android/hardware/dumpstate/1.1/IDumpstateDevice.h> #pragma once
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <string>
#include <aidl/android/hardware/dumpstate/BnDumpstateDevice.h>
#include <aidl/android/hardware/dumpstate/IDumpstateDevice.h>
#include <android/binder_status.h>
namespace aidl {
namespace android { namespace android {
namespace hardware { namespace hardware {
namespace dumpstate { namespace dumpstate {
namespace V1_1 {
namespace implementation {
using ::android::hardware::dumpstate::V1_1::DumpstateMode; class Dumpstate : public BnDumpstateDevice {
using ::android::hardware::dumpstate::V1_1::DumpstateStatus;
using ::android::hardware::dumpstate::V1_1::IDumpstateDevice;
using ::android::hardware::hidl_handle;
using ::android::hardware::hidl_string;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
struct DumpstateDevice : public IDumpstateDevice {
public: public:
DumpstateDevice(); Dumpstate();
// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow. ::ndk::ScopedAStatus dumpstateBoard(const std::vector<::ndk::ScopedFileDescriptor>& in_fds,
Return<void> dumpstateBoard(const hidl_handle& h) override; IDumpstateDevice::DumpstateMode in_mode,
int64_t in_timeoutMillis) override;
// Methods from ::android::hardware::dumpstate::V1_1::IDumpstateDevice follow. ::ndk::ScopedAStatus getVerboseLoggingEnabled(bool* _aidl_return) override;
Return<DumpstateStatus> dumpstateBoard_1_1(const hidl_handle& h,
const DumpstateMode mode,
const uint64_t timeoutMillis) override;
Return<void> setVerboseLoggingEnabled(const bool enable) override;
Return<bool> getVerboseLoggingEnabled() override;
// Methods from ::android::hidl::base::V1_0::IBase follow. ::ndk::ScopedAStatus setVerboseLoggingEnabled(bool in_enable) override;
Return<void> debug(const hidl_handle &fd, const hidl_vec<hidl_string> &args) override;
binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
private: private:
const std::string kAllSections = "all"; const std::string kAllSections = "all";
@ -86,12 +73,12 @@ struct DumpstateDevice : public IDumpstateDevice {
void dumpRilLogs(int fd, std::string destDir); void dumpRilLogs(int fd, std::string destDir);
void dumpGpsLogs(int fd, const std::string &destDir); void dumpGpsLogs(int fd, const std::string &destDir);
void dumpCameraLogs(int fd, const std::string &destDir); void dumpCameraLogs(int fd, const std::string &destDir);
//bool getVerboseLoggingEnabledImpl();
//::ndk::ScopedAStatus dumpstateBoardImpl(const int fd, const bool full);
}; };
} // namespace implementation
} // namespace V1_0
} // namespace dumpstate } // namespace dumpstate
} // namespace hardware } // namespace hardware
} // namespace android } // namespace android
} // namespace aidl
#endif // ANDROID_HARDWARE_DUMPSTATE_V1_1_DUMPSTATEDEVICE_H

View file

@ -1,6 +1,5 @@
service vendor.dumpstate-1-1 /vendor/bin/hw/android.hardware.dumpstate@1.1-service.gs201 service vendor.dumpstate-default /vendor/bin/hw/android.hardware.dumpstate-service.gs201
class hal class hal
user system user system
group system group system
interface android.hardware.dumpstate@1.0::IDumpstateDevice default interface aidl android.hardware.dumpstate.IDumpstateDevice/default
interface android.hardware.dumpstate@1.1::IDumpstateDevice default

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2016 The Android Open Source Project * Copyright (C) 2022 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -13,31 +13,25 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
#define LOG_TAG "android.hardware.dumpstate@1.0-service.gs201" #define LOG_TAG "android.hardware.dumpstate-service.gs201"
#include <hidl/HidlSupport.h> #include "Dumpstate.h"
#include <hidl/HidlTransportSupport.h>
#include "DumpstateDevice.h" #include <android-base/logging.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
using ::android::hardware::configureRpcThreadpool; using aidl::android::hardware::dumpstate::Dumpstate;
using ::android::hardware::dumpstate::V1_1::IDumpstateDevice;
using ::android::hardware::dumpstate::V1_1::implementation::DumpstateDevice;
using ::android::hardware::joinRpcThreadpool;
using ::android::sp;
int main() {
ABinderProcess_setThreadPoolMaxThreadCount(0);
std::shared_ptr<Dumpstate> dumpstate = ndk::SharedRefBase::make<Dumpstate>();
int main(int /* argc */, char* /* argv */ []) { const std::string instance = std::string() + Dumpstate::descriptor + "/default";
sp<IDumpstateDevice> dumpstate = new DumpstateDevice; binder_status_t status =
configureRpcThreadpool(1, true); AServiceManager_registerLazyService(dumpstate->asBinder().get(), instance.c_str());
CHECK_EQ(status, STATUS_OK);
android::status_t status = dumpstate->registerAsService(); ABinderProcess_joinThreadPool();
return EXIT_FAILURE; // Unreachable
if (status != android::OK)
{
ALOGE("Could not register DumpstateDevice service (%d).", status);
return -1;
}
joinRpcThreadpool();
} }

View file

@ -79,10 +79,8 @@
<fqname>@1.3::ICryptoFactory/widevine</fqname> <fqname>@1.3::ICryptoFactory/widevine</fqname>
<fqname>@1.3::IDrmFactory/widevine</fqname> <fqname>@1.3::IDrmFactory/widevine</fqname>
</hal> </hal>
<hal format = "hidl"> <hal format="aidl">
<name>android.hardware.dumpstate</name> <name>android.hardware.dumpstate</name>
<transport>hwbinder</transport>
<version>1.0</version>
<interface> <interface>
<name>IDumpstateDevice</name> <name>IDumpstateDevice</name>
<instance>default</instance> <instance>default</instance>

View file

@ -44,10 +44,8 @@
<instance>default</instance> <instance>default</instance>
</interface> </interface>
</hal> </hal>
<hal format = "hidl"> <hal format="aidl">
<name>android.hardware.dumpstate</name> <name>android.hardware.dumpstate</name>
<transport>hwbinder</transport>
<version>1.1</version>
<interface> <interface>
<name>IDumpstateDevice</name> <name>IDumpstateDevice</name>
<instance>default</instance> <instance>default</instance>