From af6afa6903532acbc9e4a39268bf21481286e767 Mon Sep 17 00:00:00 2001 From: Cory McWilliams Date: Wed, 27 Aug 2025 19:20:02 -0400 Subject: [PATCH] android: Don't log from the main thread. It might block? --- .../tildefriends/TildeFriendsActivity.java | 76 ++++++++++++++----- .../TildeFriendsSandboxService.java | 11 ++- 2 files changed, 60 insertions(+), 27 deletions(-) diff --git a/src/android/com/unprompted/tildefriends/TildeFriendsActivity.java b/src/android/com/unprompted/tildefriends/TildeFriendsActivity.java index dc93868b..14bfeb4f 100644 --- a/src/android/com/unprompted/tildefriends/TildeFriendsActivity.java +++ b/src/android/com/unprompted/tildefriends/TildeFriendsActivity.java @@ -19,7 +19,6 @@ import android.os.RemoteException; import android.os.StrictMode; import android.text.InputType; import android.util.Base64; -import android.util.Log; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -44,6 +43,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; import java.io.OutputStream; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; public class TildeFriendsActivity extends Activity { @@ -53,8 +53,10 @@ public class TildeFriendsActivity extends Activity { String port_file_path; Thread create_thread; Thread server_thread; + Thread log_thread; ServiceConnection service_connection; FileObserver observer; + LinkedBlockingQueue log_queue = new LinkedBlockingQueue(); private ValueCallback upload_message; private final static int FILECHOOSER_RESULT = 1; @@ -63,19 +65,29 @@ public class TildeFriendsActivity extends Activity { private boolean loaded = false; static { - Log.w("tildefriends", "Calling system.loadLibrary()."); + log("Calling system.loadLibrary()."); System.loadLibrary("tildefriends"); - Log.w("tildefriends", "system.loadLibrary() completed."); + log("system.loadLibrary() completed."); } public static native int tf_server_main(String files_dir, String apk_path, String out_port_file_path, ConnectivityManager connectivity_manager); public static native int tf_sandbox_main(int pipe_fd); + public static void log(String message) { + if (s_activity != null && s_activity.log_queue != null && message != null) { + try { + s_activity.log_queue.put(message); + } catch (InterruptedException e) { + android.util.Log.w("tildefriends", message); + } + } + } + private void createThread() { web_view = (TildeFriendsWebView)findViewById(R.id.web); - Log.w("tildefriends", String.format("getFilesDir() is %s", getFilesDir().toString())); - Log.w("tildefriends", String.format("getPackageResourcePath() is %s", getPackageResourcePath().toString())); - Log.w("tildefriends", String.format("nativeLibraryDir is %s", getApplicationInfo().nativeLibraryDir)); + log(String.format("getFilesDir() is %s", getFilesDir().toString())); + log(String.format("getPackageResourcePath() is %s", getPackageResourcePath().toString())); + log(String.format("nativeLibraryDir is %s", getApplicationInfo().nativeLibraryDir)); port_file_path = getFilesDir().toString() + "/port.txt"; new File(port_file_path).delete(); @@ -86,17 +98,17 @@ public class TildeFriendsActivity extends Activity { server_thread = new Thread(new Runnable() { @Override public void run() { - Log.w("tildefriends", "Watching for changes in: " + getFilesDir().toString()); + log("Watching for changes in: " + getFilesDir().toString()); observer = make_file_observer(getFilesDir().toString(), port_file_path); observer.startWatching(); - Log.w("tildefriends", "Calling tf_server_main."); + log("Calling tf_server_main."); int result = tf_server_main( getFilesDir().toString(), getPackageResourcePath().toString(), port_file_path, (ConnectivityManager)getApplicationContext().getSystemService(CONNECTIVITY_SERVICE)); - Log.w("tildefriends", "tf_server_main returned " + result + "."); + log("tf_server_main returned " + result + "."); } }); server_thread.start(); @@ -110,17 +122,17 @@ public class TildeFriendsActivity extends Activity { web_view.setDownloadListener(new DownloadListener() { public void onDownloadStart(String url, String userAgent, String content_disposition, String mime_type, long content_length) { - Log.w("tildefriends", "Let's download: " + url + " (" + content_disposition + ")"); + log("Let's download: " + url + " (" + content_disposition + ")"); String file_name = URLUtil.guessFileName(url, content_disposition, mime_type); if (url.startsWith("data:") && url.indexOf(',') != -1) { String b64 = url.substring(url.indexOf(',') + 1); byte[] data = Base64.decode(b64, Base64.DEFAULT); - Log.w("tildefriends", "Downloaded " + data.length + " bytes."); + log("Downloaded " + data.length + " bytes."); File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); try (OutputStream stream = new FileOutputStream(new File(path, file_name))) { stream.write(data); } catch (java.io.IOException e) { - Log.w("tildefriends", "IOException: " + e.toString()); + log("IOException: " + e.toString()); } Toast.makeText(getApplicationContext(), "Downloaded File", Toast.LENGTH_LONG).show(); } else { @@ -228,7 +240,7 @@ public class TildeFriendsActivity extends Activity { @Override public boolean onConsoleMessage(android.webkit.ConsoleMessage consoleMessage) { - Log.d("tildefriends", consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId()); + log(consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId()); return true; } }); @@ -259,6 +271,24 @@ public class TildeFriendsActivity extends Activity { protected void onCreate(Bundle savedInstanceState) { s_activity = this; super.onCreate(savedInstanceState); + log_thread = new Thread(new Runnable() { + @Override + public void run() { + while (true) { + try { + String message = log_queue.take(); + if (message != null) { + android.util.Log.w("tildefriends", message); + } else { + break; + } + } catch (InterruptedException e) { + } + } + log_thread = null; + } + }); + log_thread.start(); StrictMode.setThreadPolicy( new StrictMode.ThreadPolicy.Builder() .detectAll() @@ -306,6 +336,10 @@ public class TildeFriendsActivity extends Activity { protected void onDestroy() { super.onDestroy(); + try { + log_queue.put(null); + } catch (InterruptedException e) { + } s_activity = null; } @@ -399,32 +433,32 @@ public class TildeFriendsActivity extends Activity { } public static void start_sandbox(int pipe_fd) { - Log.w("tildefriends", "starting service with fd: " + pipe_fd); + log("starting service with fd: " + pipe_fd); Intent intent = new Intent(s_activity, TildeFriendsSandboxService.class); s_activity.service_connection = new ServiceConnection() { @Override public void onBindingDied(ComponentName name) { - Log.w("tildefriends", "onBindingDied"); + log("onBindingDied"); } @Override public void onNullBinding(ComponentName name) { - Log.w("tildefriends", "onNullBinding"); + log("onNullBinding"); } @Override public void onServiceConnected(ComponentName name, IBinder binder) { - Log.w("tildefriends", "onServiceConnected"); + log("onServiceConnected"); Parcel data = Parcel.obtain(); try (ParcelFileDescriptor pfd = ParcelFileDescriptor.fromFd(pipe_fd)) { data.writeParcelable(pfd, 0); } catch (java.io.IOException e) { - Log.w("tildefriends", "IOException: " + e); + log("IOException: " + e); } try { binder.transact(TildeFriendsSandboxService.START_CALL, data, null, IBinder.FLAG_ONEWAY); } catch (RemoteException e) { - Log.w("tildefriends", "RemoteException"); + log("RemoteException"); } finally { data.recycle(); } @@ -432,14 +466,14 @@ public class TildeFriendsActivity extends Activity { @Override public void onServiceDisconnected(ComponentName name) { - Log.w("tildefriends", "onServiceDisconnected"); + log("onServiceDisconnected"); } }; s_activity.bindService(intent, s_activity.service_connection, BIND_AUTO_CREATE | BIND_NOT_FOREGROUND); } public static void stop_sandbox() { - Log.w("tildefriends", "stop_sandbox"); + log("stop_sandbox"); if (s_activity.service_connection != null) { s_activity.unbindService(s_activity.service_connection); s_activity.service_connection = null; diff --git a/src/android/com/unprompted/tildefriends/TildeFriendsSandboxService.java b/src/android/com/unprompted/tildefriends/TildeFriendsSandboxService.java index 3f750230..4b43c373 100644 --- a/src/android/com/unprompted/tildefriends/TildeFriendsSandboxService.java +++ b/src/android/com/unprompted/tildefriends/TildeFriendsSandboxService.java @@ -6,7 +6,6 @@ import android.os.Binder; import android.os.IBinder; import android.os.Parcel; import android.os.ParcelFileDescriptor; -import android.util.Log; public class TildeFriendsSandboxService extends Service { public static final int START_CALL = IBinder.FIRST_CALL_TRANSACTION; @@ -14,12 +13,12 @@ public class TildeFriendsSandboxService extends Service { Thread thread; public int onStartCommand(Intent intent, int flags, int start_id) { - Log.w("tildefriends", "TildeFriendsSandboxService: onStartCommand"); + TildeFriendsActivity.log("TildeFriendsSandboxService: onStartCommand"); return super.onStartCommand(intent, flags, start_id); } public void onDestroy() { - Log.w("tildefriends", "TildeFriendsSandboxService: onDestroy"); + TildeFriendsActivity.log("TildeFriendsSandboxService: onDestroy"); super.onDestroy(); } @@ -27,9 +26,9 @@ public class TildeFriendsSandboxService extends Service { thread = new Thread(new Runnable() { @Override public void run() { - Log.w("tildefriends", "Calling tf_sandbox_main."); + TildeFriendsActivity.log("Calling tf_sandbox_main."); int result = TildeFriendsActivity.tf_sandbox_main(pipe_fd); - Log.w("tildefriends", "tf_sandbox_main returned " + result + "."); + TildeFriendsActivity.log("tf_sandbox_main returned " + result + "."); } }); thread.start(); @@ -43,7 +42,7 @@ public class TildeFriendsSandboxService extends Service { if (code == START_CALL) { ParcelFileDescriptor pfd = read_pfd(data); if (pfd != null) { - Log.w("tildefriends", "fd is " + pfd.getFd()); + TildeFriendsActivity.log("fd is " + pfd.getFd()); start_thread(pfd.detachFd()); try { pfd.close();