diff --git a/data.cpp b/data.cpp
index f7cd7a2a..1fc7f35d 100755
--- a/data.cpp
+++ b/data.cpp
@@ -940,6 +940,11 @@ void DataManager::SetDefaultValues()
mData.SetValue("tw_enable_adb_backup", "0");
+ if (TWFunc::Path_Exists("/system/bin/logcat"))
+ mConst.SetValue("tw_logcat_exists", "1");
+ else
+ mConst.SetValue("tw_logcat_exists", "0");
+
if (TWFunc::Path_Exists("/system/bin/magiskboot"))
mConst.SetValue("tw_has_repack_tools", "1");
else
diff --git a/gui/action.cpp b/gui/action.cpp
index c63337c7..464ed278 100755
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -676,8 +676,10 @@ int GUIAction::copylog(std::string arg __unused)
{
string dst, curr_storage;
int copy_kernel_log = 0;
+ int copy_logcat = 1;
DataManager::GetValue("tw_include_kernel_log", copy_kernel_log);
+ DataManager::GetValue("tw_include_logcat", copy_logcat);
PartitionManager.Mount_Current_Storage(true);
curr_storage = DataManager::GetCurrentStoragePath();
dst = curr_storage + "/recovery.log";
@@ -685,6 +687,8 @@ int GUIAction::copylog(std::string arg __unused)
tw_set_default_metadata(dst.c_str());
if (copy_kernel_log)
TWFunc::copy_kernel_log(curr_storage);
+ if (copy_logcat)
+ TWFunc::copy_logcat(curr_storage);
sync();
gui_msg(Msg("copy_log=Copied recovery log to {1}")(dst));
} else
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index 369c4d86..0367e551 100755
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -2993,7 +2993,7 @@
tw_slider_text={@swipe_reboot=Swipe to Reboot}
rebootcheck
-
+
+
@@ -3737,7 +3737,14 @@
+
+ {@include_logcat=Include Logcat}
+
+
+
+
+
{@include_kernel_log=Include Kernel Log}
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index 060d50a7..2cea6364 100755
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -266,6 +266,13 @@
+
+
+
+ {@include_logcat=Include Logcat}
+
+
+
{@swipe_confirm= Confirm}
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index af211f40..c56e194e 100755
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -1165,6 +1165,17 @@ void TWFunc::copy_kernel_log(string curr_storage) {
tw_set_default_metadata(dmesgDst.c_str());
}
+void TWFunc::copy_logcat(string curr_storage) {
+ std::string logcatDst = curr_storage + "/logcat.txt";
+ std::string logcatCmd = "logcat -d";
+
+ std::string result;
+ Exec_Cmd(logcatCmd, result, false);
+ write_to_file(logcatDst, result);
+ gui_msg(Msg("copy_logcat=Copied logcat to {1}")(logcatDst));
+ tw_set_default_metadata(logcatDst.c_str());
+}
+
bool TWFunc::isNumber(string strtocheck) {
int num = 0;
std::istringstream iss(strtocheck);
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index 8979a66a..dc51454d 100755
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -108,6 +108,7 @@ public:
static void Disable_Stock_Recovery_Replace(); // Disable stock ROMs from replacing TWRP with stock recovery
static unsigned long long IOCTL_Get_Block_Size(const char* block_device);
static void copy_kernel_log(string curr_storage); // Copy Kernel Log to Current Storage (PSTORE/KMSG)
+ static void copy_logcat(string curr_storage); // Copy Logcat to Current Storage
static bool isNumber(string strtocheck); // return true if number, false if not a number
static int stream_adb_backup(string &Restore_Name); // Tell ADB Backup to Stream to TWRP from GUI selection
static std::string get_log_dir(); // return recovery log storage directory