From bc765d3cdd241df81e0941fad63e96b230645a89 Mon Sep 17 00:00:00 2001 From: vvb2060 Date: Fri, 27 Aug 2021 18:56:28 +0800 Subject: [PATCH] [core] clear logs will refresh fd (#1020) --- .../manager/ui/fragment/LogsFragment.java | 8 ++- core/src/main/cpp/daemon/logcat.cpp | 29 +++++--- .../lsposed/lspd/service/BridgeService.java | 69 +------------------ .../lsposed/lspd/service/ConfigManager.java | 15 +--- .../lspd/service/LSPApplicationService.java | 1 - .../lsposed/lspd/service/LogcatService.java | 16 +++-- .../org/lsposed/lspd/service/UserService.java | 3 +- .../lsposed/lspd/util/InstallerVerifier.java | 3 +- 8 files changed, 41 insertions(+), 103 deletions(-) diff --git a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java index 045722b6..8d1e43f8 100644 --- a/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java +++ b/app/src/main/java/org/lsposed/manager/ui/fragment/LogsFragment.java @@ -21,7 +21,6 @@ package org.lsposed.manager.ui.fragment; import static org.lsposed.manager.App.TAG; - import static java.lang.Math.max; import android.annotation.SuppressLint; @@ -193,7 +192,7 @@ public class LogsFragment extends BaseFragment { private void clear() { if (ConfigManager.clearLogs(verbose)) { Snackbar.make(binding.snackbar, R.string.logs_cleared, Snackbar.LENGTH_SHORT).show(); - reloadErrorLog(); + adapter.clearLogs(); } else { Snackbar.make(binding.snackbar, R.string.logs_clear_failed_2, Snackbar.LENGTH_SHORT).show(); } @@ -324,6 +323,11 @@ public class LogsFragment extends BaseFragment { notifyDataSetChanged(); } + void clearLogs() { + logs.clear(); + notifyItemRangeRemoved(0, logs.size()); + } + @Override public int getItemCount() { return logs.size(); diff --git a/core/src/main/cpp/daemon/logcat.cpp b/core/src/main/cpp/daemon/logcat.cpp index ce2acae2..9737b8c7 100644 --- a/core/src/main/cpp/daemon/logcat.cpp +++ b/core/src/main/cpp/daemon/logcat.cpp @@ -47,7 +47,6 @@ private: JNIEnv *env_; jobject thiz_; jmethodID refresh_fd_method_; - std::string id_ = "0"; UniqueFile modules_file_{}; size_t modules_file_part_ = 0; @@ -59,8 +58,10 @@ private: bool verbose_ = true; - const std::string start_verbose_inst_ = "!!start_verbose!!"; - const std::string stop_verbose_inst_ = "!!stop_verbose!!"; + constexpr inline static auto start_verbose_inst_ = "!!start_verbose!!"; + constexpr inline static auto stop_verbose_inst_ = "!!stop_verbose!!"; + constexpr inline static auto refresh_verbose_inst_ = "!!refresh_verbose!!"; + constexpr inline static auto refresh_modules_inst_ = "!!refresh_modules!!"; }; int Logcat::PrintLogLine(const AndroidLogEntry &entry, FILE *out) { @@ -90,18 +91,20 @@ int Logcat::PrintLogLine(const AndroidLogEntry &entry, FILE *out) { } void Logcat::RefreshFd(bool is_verbose) { + constexpr auto start = "----part %zu start----\n"; + constexpr auto end = "-----part %zu end----\n"; if (is_verbose) { verbose_print_count_ = 0; - fprintf(verbose_file_.get(), "----%s-%zu end----\n", id_.data(), verbose_file_part_); + fprintf(verbose_file_.get(), end, verbose_file_part_); verbose_file_ = UniqueFile(env_->CallIntMethod(thiz_, refresh_fd_method_, JNI_TRUE), "a"); verbose_file_part_++; - fprintf(verbose_file_.get(), "----%s-%zu start----\n", id_.data(), verbose_file_part_); + fprintf(verbose_file_.get(), start, verbose_file_part_); } else { modules_print_count_ = 0; - fprintf(modules_file_.get(), "----%zu end----\n", modules_file_part_); + fprintf(modules_file_.get(), end, modules_file_part_); modules_file_ = UniqueFile(env_->CallIntMethod(thiz_, refresh_fd_method_, JNI_FALSE), "a"); modules_file_part_++; - fprintf(modules_file_.get(), "----%zu start----\n", modules_file_part_); + fprintf(modules_file_.get(), start, modules_file_part_); } } @@ -109,7 +112,7 @@ void Logcat::ProcessBuffer(struct log_msg *buf) { AndroidLogEntry entry; if (android_log_processLogBuffer(&buf->entry, &entry) < 0) return; - std::string_view tag(entry.tag); + std::string_view tag(entry.tag, entry.tagLen); bool shortcut = false; if (tag == "LSPosed-Bridge" || tag == "XSharedPreferences") [[unlikely]] { modules_print_count_ += PrintLogLine(entry, modules_file_.get()); @@ -122,12 +125,16 @@ void Logcat::ProcessBuffer(struct log_msg *buf) { verbose_print_count_ += PrintLogLine(entry, verbose_file_.get()); } if (entry.pid == getpid() && tag == "LSPosedLogcat") [[unlikely]] { - if (std::string_view(entry.message).starts_with(start_verbose_inst_)) { + std::string_view msg(entry.message, entry.messageLen); + if (msg == start_verbose_inst_) { verbose_ = true; - id_ = std::string(entry.message, start_verbose_inst_.length(), std::string::npos); verbose_print_count_ += PrintLogLine(entry, verbose_file_.get()); - } else if (std::string_view(entry.message) == stop_verbose_inst_ + id_) { + } else if (msg == stop_verbose_inst_) { verbose_ = false; + } else if (msg == refresh_modules_inst_) { + RefreshFd(false); + } else if (msg == refresh_verbose_inst_) { + RefreshFd(true); } } } diff --git a/core/src/main/java/org/lsposed/lspd/service/BridgeService.java b/core/src/main/java/org/lsposed/lspd/service/BridgeService.java index a097c516..de5463ea 100644 --- a/core/src/main/java/org/lsposed/lspd/service/BridgeService.java +++ b/core/src/main/java/org/lsposed/lspd/service/BridgeService.java @@ -34,21 +34,12 @@ import android.os.Parcel; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; -import android.util.ArrayMap; import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.android.server.LocalServices; -import com.android.server.SystemService; -import com.android.server.SystemServiceManager; -import com.android.server.am.ActivityManagerService; -import com.android.server.am.ProcessRecord; - import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.Map; public class BridgeService { @@ -75,12 +66,12 @@ public class BridgeService { Log.i(TAG, "service " + SERVICE_NAME + " is dead. "); try { - //noinspection JavaReflectionMemberAccess + //noinspection JavaReflectionMemberAccess DiscouragedPrivateApi Field field = ServiceManager.class.getDeclaredField("sServiceManager"); field.setAccessible(true); field.set(null, null); - //noinspection JavaReflectionMemberAccess + //noinspection JavaReflectionMemberAccess DiscouragedPrivateApi field = ServiceManager.class.getDeclaredField("sCache"); field.setAccessible(true); Object sCache = field.get(null); @@ -318,60 +309,4 @@ public class BridgeService { return null; } - private static void tryGetActivityManagerServiceInstance() { - try { - Log.e(TAG, "Trying to get the ams"); - Field localServiceField = LocalServices.class.getDeclaredField("sLocalServiceObjects"); - localServiceField.setAccessible(true); - ArrayMap, Object> localServiceMap = (ArrayMap, Object>) localServiceField.get(null); - Class systemServiceManagerClass = null; - for (Class clazz : localServiceMap.keySet()) { - if (clazz.getName().equals("com.android.server.SystemServiceManager")) { - systemServiceManagerClass = clazz; - } - - } - Field parentField = ClassLoader.class.getDeclaredField("parent"); - parentField.setAccessible(true); - parentField.set(BridgeService.class.getClassLoader(), systemServiceManagerClass.getClassLoader()); - SystemServiceManager systemServiceManager = LocalServices.getService(SystemServiceManager.class); - ArrayList services; - try { - Field servicesField = systemServiceManagerClass.getDeclaredField("mServices"); - servicesField.setAccessible(true); - services = (ArrayList) servicesField.get(systemServiceManager); - } catch (NoSuchFieldException | IllegalAccessException e) { - Log.e(TAG, Log.getStackTraceString(e)); - return; - } - - ActivityManagerService.Lifecycle lifecycle = null; - - for (SystemService service : services) { - if (service instanceof ActivityManagerService.Lifecycle) { - lifecycle = (ActivityManagerService.Lifecycle) service; - } - } - if (lifecycle == null) { - Log.e(TAG, "I cannot get the lifecycle..."); - } - ActivityManagerService activityManagerService = lifecycle.getService(); - if (activityManagerService != null) { - Log.e(TAG, "I got the ams!!!: " + activityManagerService); - } else { - Log.e(TAG, "I cannot get the ams"); - } - Method findProcessLockedMethod = ActivityManagerService.class.getDeclaredMethod("findProcessLocked", String.class, int.class, String.class); - findProcessLockedMethod.setAccessible(true); - ProcessRecord record = (ProcessRecord) findProcessLockedMethod.invoke(activityManagerService, String.valueOf(Binder.getCallingPid()), 0, "LSPosed"); - Field processNameField = ProcessRecord.class.getDeclaredField("processName"); - processNameField.setAccessible(true); - if (record != null) { - Log.e(TAG, "I got the record!!!: " + record); - Log.e(TAG, "I got the process name: " + processNameField.get(record)); - } - } catch (Throwable e) { - Log.e(TAG, Log.getStackTraceString(e)); - } - } } diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java index 25da4e78..ae75b430 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -56,10 +56,8 @@ import org.lsposed.lspd.models.PreLoadedApk; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; -import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; -import java.io.OutputStream; import java.io.Serializable; import java.nio.channels.Channels; import java.nio.file.FileVisitResult; @@ -866,17 +864,8 @@ public class ConfigManager { } public boolean clearLogs(boolean verbose) { - var logcatService = ServiceManager.getLogcatService(); - File logFile = verbose ? logcatService.getVerboseLog() : logcatService.getModulesLog(); - if (logFile == null) return true; - try { - OutputStream os = new FileOutputStream(logFile); - os.close(); - return true; - } catch (IOException e) { - Log.e(TAG, Log.getStackTraceString(e)); - return false; - } + ServiceManager.getLogcatService().refresh(verbose); + return true; } public boolean isManager(String packageName) { diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java b/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java index 6f42db32..8ef566fe 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPApplicationService.java @@ -23,7 +23,6 @@ import static org.lsposed.lspd.service.ServiceManager.TAG; import android.os.Bundle; import android.os.IBinder; -import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Log; import android.util.Pair; diff --git a/core/src/main/java/org/lsposed/lspd/service/LogcatService.java b/core/src/main/java/org/lsposed/lspd/service/LogcatService.java index e8a27f57..6630b4ca 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LogcatService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LogcatService.java @@ -4,8 +4,6 @@ import android.annotation.SuppressLint; import android.os.ParcelFileDescriptor; import android.util.Log; -import androidx.annotation.Nullable; - import java.io.File; import java.io.IOException; @@ -18,7 +16,6 @@ public class LogcatService implements Runnable { private File modulesLog = null; private File verboseLog = null; private Thread thread = null; - private int id = 0; @SuppressLint("UnsafeDynamicallyLoadedCode") public LogcatService() { @@ -72,12 +69,19 @@ public class LogcatService implements Runnable { } public void startVerbose() { - Log.i(TAG, "!!start_verbose!!" + id); + Log.i(TAG, "!!start_verbose!!"); } public void stopVerbose() { - Log.i(TAG, "!!stop_verbose!!" + id); - id++; + Log.i(TAG, "!!stop_verbose!!"); + } + + public void refresh(boolean isVerboseLog) { + if (isVerboseLog) { + Log.i(TAG, "!!refresh_verbose!!"); + } else { + Log.i(TAG, "!!refresh_modules!!"); + } } public File getVerboseLog() { diff --git a/core/src/main/java/org/lsposed/lspd/service/UserService.java b/core/src/main/java/org/lsposed/lspd/service/UserService.java index 048ef7d4..0a521f4e 100644 --- a/core/src/main/java/org/lsposed/lspd/service/UserService.java +++ b/core/src/main/java/org/lsposed/lspd/service/UserService.java @@ -29,14 +29,13 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.util.Log; -import java.util.Collections; import java.util.LinkedList; import java.util.List; public class UserService { private static IUserManager um = null; private static IBinder binder = null; - private static IBinder.DeathRecipient recipient = new IBinder.DeathRecipient() { + private static final IBinder.DeathRecipient recipient = new IBinder.DeathRecipient() { @Override public void binderDied() { Log.w(TAG, "um is dead"); diff --git a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java index 32ce00c7..dbce17ea 100644 --- a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java +++ b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java @@ -26,6 +26,7 @@ import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.IBinder; +import android.os.Looper; import android.widget.Toast; import com.android.apksig.ApkVerifier; @@ -68,7 +69,7 @@ public class InstallerVerifier { Utils.logW("showErrorToast: ", t); Toast.makeText((Context) param.thisObject, str, Toast.LENGTH_LONG).show(); } - new Handler().postDelayed(() -> System.exit(0), 50); + new Handler(Looper.getMainLooper()).postDelayed(() -> System.exit(0), 1000); } }); } catch (Throwable t) {