summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2022-08-21 17:21:46 +0200
committerArne Schwabe <arne@rfc2549.org>2022-08-21 22:59:08 +0200
commite544282169db8b8e90867bbb087133621bde35ca (patch)
tree331b7df7c9d63c45e7fa22341a739c076bb3f427
parentc51decadcb8e9d925196c52ba670a170d69feff8 (diff)
Log exit reason on start in log
This should help finding out why the process suddenly dies.
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java1
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/LogItem.java15
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/StatusListener.java42
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java49
-rw-r--r--main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java22
-rw-r--r--main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java1
6 files changed, 117 insertions, 13 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java b/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
index 1df46525..271ec139 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/ICSOpenVPNApplication.java
@@ -128,5 +128,4 @@ public class ICSOpenVPNApplication extends Application {
mChannel.setLightColor(Color.CYAN);
mNotificationManager.createNotificationChannel(mChannel);
}
-
}
diff --git a/main/src/main/java/de/blinkt/openvpn/core/LogItem.java b/main/src/main/java/de/blinkt/openvpn/core/LogItem.java
index 144ae7c4..74601349 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/LogItem.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/LogItem.java
@@ -48,6 +48,14 @@ public class LogItem implements Parcelable {
mArgs = args;
}
+ public LogItem(VpnStatus.LogLevel level, int verblevel, String message, long eventLogTime) {
+ mMessage = message;
+ mLevel = level;
+ mVerbosityLevel = verblevel;
+ logtime = eventLogTime;
+ }
+
+
public LogItem(VpnStatus.LogLevel level, int verblevel, String message) {
mMessage = message;
mLevel = level;
@@ -85,8 +93,6 @@ public class LogItem implements Parcelable {
other.mLevel.equals(mLevel)) &&
mVerbosityLevel == other.mVerbosityLevel &&
logtime == other.logtime;
-
-
}
public byte[] getMarschaledBytes() throws UnsupportedEncodingException, BufferOverflowException {
@@ -241,6 +247,11 @@ public class LogItem implements Parcelable {
mMessage = msg;
}
+ public LogItem(VpnStatus.LogLevel loglevel, String msg, long logEventTime) {
+ mLevel = loglevel;
+ mMessage = msg;
+ logtime = logEventTime;
+ }
public LogItem(VpnStatus.LogLevel loglevel, int ressourceId) {
mRessourceId = ressourceId;
diff --git a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
index 13a88974..500cc5e7 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/StatusListener.java
@@ -5,29 +5,36 @@
package de.blinkt.openvpn.core;
+import static android.app.ApplicationExitInfo.REASON_CRASH_NATIVE;
+
+import android.app.ActivityManager;
+import android.app.ApplicationExitInfo;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
+import android.os.Build;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.util.Log;
+
+import androidx.annotation.RequiresApi;
+
import de.blinkt.openvpn.BuildConfig;
import de.blinkt.openvpn.core.VpnStatus.LogLevel;
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
+import java.util.List;
/**
* Created by arne on 09.11.16.
*/
public class StatusListener implements VpnStatus.LogListener {
- private File mCacheDir;
- private Context mContext;
private final IStatusCallbacks mCallback = new IStatusCallbacks.Stub() {
@Override
public void newLogItem(LogItem item) throws RemoteException {
@@ -50,6 +57,7 @@ public class StatusListener implements VpnStatus.LogListener {
VpnStatus.setConnectedVPNProfile(uuid);
}
};
+ private File mCacheDir;
private final ServiceConnection mConnection = new ServiceConnection() {
@@ -102,6 +110,7 @@ public class StatusListener implements VpnStatus.LogListener {
}
};
+ private Context mContext;
void init(Context c) {
@@ -112,6 +121,35 @@ public class StatusListener implements VpnStatus.LogListener {
c.bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
this.mContext = c;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R)
+ logLatestExitReasons(c);
+ }
+
+ @RequiresApi(Build.VERSION_CODES.R)
+ private void logLatestExitReasons(Context c) {
+ ActivityManager activityManager = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE);
+ List<ApplicationExitInfo> exitReasons = activityManager.getHistoricalProcessExitReasons(null, 0, 5);
+ ApplicationExitInfo lastguiexit = null;
+ ApplicationExitInfo lastserviceexit = null;
+ for (ApplicationExitInfo aei : exitReasons) {
+ if (aei.getProcessName().endsWith(":openvpn")) {
+ if (lastserviceexit == null || aei.getTimestamp() > lastserviceexit.getTimestamp())
+ lastserviceexit = aei;
+ } else {
+ if (lastguiexit == null || aei.getTimestamp() > lastguiexit.getTimestamp())
+ lastguiexit = aei;
+ }
+ }
+ logExitNotification(lastserviceexit, "Last exit reason reported by Android for Service Process: ");
+ logExitNotification(lastguiexit, "Last exit reason reported by Android for UI Process: ");
+
+ }
+
+ private void logExitNotification(ApplicationExitInfo aei, String s) {
+ if (aei != null) {
+ LogItem li = new LogItem(LogLevel.DEBUG, s + aei, aei.getTimestamp());
+ VpnStatus.newLogItemIfUnique(li);
+ }
}
@Override
diff --git a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
index c8e69414..8130faef 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/VpnStatus.java
@@ -14,15 +14,15 @@ import android.os.Message;
import java.io.File;
import java.io.PrintWriter;
import java.io.StringWriter;
+import java.util.Iterator;
import java.util.LinkedList;
+import java.util.ListIterator;
import java.util.Locale;
import java.util.Vector;
import de.blinkt.openvpn.R;
public class VpnStatus {
-
-
private static final LinkedList<LogItem> logbuffer;
private static Vector<LogListener> logListener;
@@ -150,7 +150,6 @@ public class VpnStatus {
VpnStatus.trafficHistory = trafficHistory;
}
-
public enum LogLevel {
INFO(2),
ERROR(-2),
@@ -240,7 +239,7 @@ public class VpnStatus {
String nativeAPI;
try {
nativeAPI = NativeUtils.getNativeAPI();
- } catch (UnsatisfiedLinkError ignore) {
+ } catch (UnsatisfiedLinkError|NoClassDefFoundError ignore) {
nativeAPI = "error";
}
@@ -418,15 +417,23 @@ public class VpnStatus {
}
static void newLogItem(LogItem logItem) {
- newLogItem(logItem, false);
+ newLogItem(logItem, false, false);
+ }
+
+ public static void newLogItemIfUnique(LogItem li) {
+ newLogItem(li, false, true);
}
+ public static void newLogItem(LogItem logItem, boolean cachedLine)
+ {
+ newLogItem(logItem, cachedLine, false);
+ }
- synchronized static void newLogItem(LogItem logItem, boolean cachedLine) {
+ synchronized static void newLogItem(LogItem logItem, boolean cachedLine, boolean enforceUnique) {
if (cachedLine) {
logbuffer.addFirst(logItem);
} else {
- logbuffer.addLast(logItem);
+ insertLogItemByLogTime(logItem, enforceUnique);
if (mLogFileHandler != null) {
Message m = mLogFileHandler.obtainMessage(LogFileHandler.LOG_MESSAGE, logItem);
mLogFileHandler.sendMessage(m);
@@ -445,6 +452,34 @@ public class VpnStatus {
}
}
+ private static void insertLogItemByLogTime(LogItem logItem, boolean enforceUnique) {
+ /* Shortcut for the shortcut that it should be added at the
+ * end to avoid traversing the list
+ */
+ if (!logbuffer.isEmpty() && logbuffer.getLast().getLogtime() <= logItem.getLogtime())
+ {
+ logbuffer.addLast(logItem);
+ return;
+ }
+
+ ListIterator<LogItem> itr = logbuffer.listIterator();
+ long newItemLogTime = logItem.getLogtime();
+ while(itr.hasNext()) {
+ LogItem laterLogItem = itr.next();
+ if (enforceUnique && laterLogItem.equals(logItem))
+ /* Identical object found, ignore new item */
+ return;
+
+ if (laterLogItem.getLogtime() > newItemLogTime) {
+ itr.previous();
+ itr.add(logItem);
+ return;
+ }
+ }
+ /* no hasNext, add at the end */
+ itr.add(logItem);
+ }
+
public static void logError(String msg) {
newLogItem(new LogItem(LogLevel.ERROR, msg));
diff --git a/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java b/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
index b32e5efa..e024bf90 100644
--- a/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
+++ b/main/src/test/java/de/blinkt/openvpn/core/TestLogFileHandler.java
@@ -80,6 +80,27 @@ public class TestLogFileHandler {
Assert.assertEquals(li, li2);
}
+ @Test
+ public void testLogInsertByTime()
+ {
+ VpnStatus vpnStatus = new VpnStatus();
+ /* Add the generic information message */
+ VpnStatus.clearLog();
+
+ long[] testTimes = {1000, 20000, 1500, 500, 6000, 70000, System.currentTimeMillis()+5000};
+ for (long time: testTimes) {
+ LogItem li = new LogItem(VpnStatus.LogLevel.INFO, "unit test", time);
+ VpnStatus.newLogItemIfUnique(li);
+ }
+
+ long lastlogTime = 0;
+ for(LogItem li:VpnStatus.getlogbuffer())
+ {
+ org.junit.Assert.assertTrue(li.getLogtime() >= lastlogTime);
+ lastlogTime = li.getLogtime();
+ }
+ }
+
private void testEquals(LogItem li, LogItem li2) {
Assert.assertEquals(li.getLogLevel(), li2.getLogLevel());
@@ -120,5 +141,4 @@ public class TestLogFileHandler {
}
}
-
} \ No newline at end of file
diff --git a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java
index 5bc0bbb1..6d4d2968 100644
--- a/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java
+++ b/main/src/ui/java/de/blinkt/openvpn/fragments/SendDumpFragment.java
@@ -104,6 +104,7 @@ public class SendDumpFragment extends Fragment {
Pair<File, Long> ldump = getLastestDump(getActivity());
if (ldump == null) {
VpnStatus.logError("No Minidump found!");
+ return;
}
uris.add(Uri.parse("content://de.blinkt.openvpn.FileProvider/" + ldump.first.getName()));