[core] clear logs will refresh fd (#1020)

This commit is contained in:
vvb2060 2021-08-27 18:56:28 +08:00 committed by GitHub
parent 6e07bfb71e
commit bc765d3cdd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 41 additions and 103 deletions

View File

@ -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();

View File

@ -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);
}
}
}

View File

@ -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<Class<?>, Object> localServiceMap = (ArrayMap<Class<?>, 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<SystemService> services;
try {
Field servicesField = systemServiceManagerClass.getDeclaredField("mServices");
servicesField.setAccessible(true);
services = (ArrayList<SystemService>) 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));
}
}
}

View File

@ -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) {

View File

@ -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;

View File

@ -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() {

View File

@ -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");

View File

@ -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) {