Skip to content

Commit 9c0c57d

Browse files
committed
Add Commands Window for running ADB and shell commands
1 parent d9aa23d commit 9c0c57d

17 files changed

Lines changed: 1187 additions & 0 deletions
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
namespace Unity.Android.Logcat
2+
{
3+
internal static class AndroidLogcatAdbCommandCatalog
4+
{
5+
internal static readonly AndroidLogcatCommandEntry[] All = new[]
6+
{
7+
// --- Device Management ---
8+
new AndroidLogcatCommandEntry("List Devices", "adb devices"),
9+
new AndroidLogcatCommandEntry("List Devices (Verbose)", "adb devices -l"),
10+
new AndroidLogcatCommandEntry("Start Server", "adb start-server"),
11+
new AndroidLogcatCommandEntry("Kill Server", "adb kill-server"),
12+
new AndroidLogcatCommandEntry("Reboot Device", "adb reboot"),
13+
new AndroidLogcatCommandEntry("Reboot to Bootloader", "adb reboot bootloader"),
14+
new AndroidLogcatCommandEntry("Reboot to Recovery", "adb reboot recovery"),
15+
new AndroidLogcatCommandEntry("Get Device State", "adb get-state"),
16+
new AndroidLogcatCommandEntry("Get Serial Number", "adb get-serialno"),
17+
new AndroidLogcatCommandEntry("Wait for Device", "adb wait-for-device"),
18+
19+
// --- App Management ---
20+
new AndroidLogcatCommandEntry("List All Packages", "adb shell pm list packages"),
21+
new AndroidLogcatCommandEntry("List Third-Party Packages", "adb shell pm list packages -3"),
22+
new AndroidLogcatCommandEntry("List System Packages", "adb shell pm list packages -s"),
23+
new AndroidLogcatCommandEntry("Clear App Data", "adb shell pm clear <package>"),
24+
new AndroidLogcatCommandEntry("Force Stop App", "adb shell am force-stop <package>"),
25+
new AndroidLogcatCommandEntry("Start Activity", "adb shell am start -n <package/activity>"),
26+
new AndroidLogcatCommandEntry("Start App (Launcher)", "adb shell monkey -p <package> -c android.intent.category.LAUNCHER 1"),
27+
new AndroidLogcatCommandEntry("Start App (UnityPlayerActivity)", "adb shell am start -n <package>/com.unity3d.player.UnityPlayerActivity"),
28+
new AndroidLogcatCommandEntry("Start App (GameActivity)", "adb shell am start -n <package>/com.google.androidgamesdk.GameActivity"),
29+
new AndroidLogcatCommandEntry("Uninstall App", "adb uninstall <package>"),
30+
new AndroidLogcatCommandEntry("Install APK", "adb install <path.apk>"),
31+
new AndroidLogcatCommandEntry("Install APK (Replace)", "adb install -r <path.apk>"),
32+
new AndroidLogcatCommandEntry("Install Multiple APKs (Split)", "adb install-multiple -r <path1.apk> <path2.apk>"),
33+
new AndroidLogcatCommandEntry("Push OBB File", "adb push <local.obb> /sdcard/Android/obb/<package>/"),
34+
new AndroidLogcatCommandEntry("Create OBB Directory", "adb shell mkdir -p /sdcard/Android/obb/<package>"),
35+
new AndroidLogcatCommandEntry("Grant Permission", "adb shell pm grant <package> <permission>"),
36+
new AndroidLogcatCommandEntry("Revoke Permission", "adb shell pm revoke <package> <permission>"),
37+
new AndroidLogcatCommandEntry("Dump App Info", "adb shell dumpsys package <package>"),
38+
39+
// --- File Transfer ---
40+
new AndroidLogcatCommandEntry("Push File to Device", "adb push <local> <remote>"),
41+
new AndroidLogcatCommandEntry("Pull File from Device", "adb pull <remote> <local>"),
42+
new AndroidLogcatCommandEntry("List Directory", "adb shell ls -la <path>"),
43+
new AndroidLogcatCommandEntry("Remove File", "adb shell rm <path>"),
44+
new AndroidLogcatCommandEntry("Make Directory", "adb shell mkdir -p <path>"),
45+
46+
// --- Logcat ---
47+
new AndroidLogcatCommandEntry("View Logcat", "adb logcat"),
48+
new AndroidLogcatCommandEntry("Clear Logcat", "adb logcat -c"),
49+
new AndroidLogcatCommandEntry("Dump Logcat & Exit", "adb logcat -d"),
50+
new AndroidLogcatCommandEntry("Logcat Errors Only", "adb logcat *:E"),
51+
new AndroidLogcatCommandEntry("Logcat Warnings & Above", "adb logcat *:W"),
52+
new AndroidLogcatCommandEntry("Logcat with Timestamps", "adb logcat -v time"),
53+
new AndroidLogcatCommandEntry("Logcat by Tag", "adb logcat -s <TAG>"),
54+
new AndroidLogcatCommandEntry("Logcat Unity Only", "adb logcat -s Unity"),
55+
56+
// --- Screen Capture ---
57+
new AndroidLogcatCommandEntry("Take Screenshot", "adb shell screencap /sdcard/screenshot.png"),
58+
new AndroidLogcatCommandEntry("Record Screen", "adb shell screenrecord /sdcard/recording.mp4"),
59+
new AndroidLogcatCommandEntry("Record Screen (30s)", "adb shell screenrecord --time-limit 30 /sdcard/recording.mp4"),
60+
61+
// --- System Info ---
62+
new AndroidLogcatCommandEntry("Get Android Version", "adb shell getprop ro.build.version.release"),
63+
new AndroidLogcatCommandEntry("Get SDK Version", "adb shell getprop ro.build.version.sdk"),
64+
new AndroidLogcatCommandEntry("Get Device Model", "adb shell getprop ro.product.model"),
65+
new AndroidLogcatCommandEntry("Get Device Manufacturer", "adb shell getprop ro.product.manufacturer"),
66+
new AndroidLogcatCommandEntry("Get All Properties", "adb shell getprop"),
67+
new AndroidLogcatCommandEntry("Get Screen Resolution", "adb shell wm size"),
68+
new AndroidLogcatCommandEntry("Get Screen Density", "adb shell wm density"),
69+
new AndroidLogcatCommandEntry("Get Battery Info", "adb shell dumpsys battery"),
70+
new AndroidLogcatCommandEntry("Get CPU Info", "adb shell cat /proc/cpuinfo"),
71+
new AndroidLogcatCommandEntry("Get Memory Info", "adb shell cat /proc/meminfo"),
72+
new AndroidLogcatCommandEntry("Get Disk Usage", "adb shell df"),
73+
new AndroidLogcatCommandEntry("Get Running Processes", "adb shell ps"),
74+
new AndroidLogcatCommandEntry("Get Top Processes", "adb shell top -n 1"),
75+
new AndroidLogcatCommandEntry("Get Build Properties", "adb shell cat /system/build.prop"),
76+
77+
// --- Input Simulation ---
78+
new AndroidLogcatCommandEntry("Send Keyevent (Home)", "adb shell input keyevent KEYCODE_HOME"),
79+
new AndroidLogcatCommandEntry("Send Keyevent (Back)", "adb shell input keyevent KEYCODE_BACK"),
80+
new AndroidLogcatCommandEntry("Send Keyevent (Menu)", "adb shell input keyevent KEYCODE_MENU"),
81+
new AndroidLogcatCommandEntry("Send Keyevent (Power)", "adb shell input keyevent KEYCODE_POWER"),
82+
new AndroidLogcatCommandEntry("Send Keyevent (Volume Up)", "adb shell input keyevent KEYCODE_VOLUME_UP"),
83+
new AndroidLogcatCommandEntry("Send Keyevent (Volume Down)", "adb shell input keyevent KEYCODE_VOLUME_DOWN"),
84+
new AndroidLogcatCommandEntry("Send Keyevent (Enter)", "adb shell input keyevent KEYCODE_ENTER"),
85+
new AndroidLogcatCommandEntry("Send Keyevent (Tab)", "adb shell input keyevent KEYCODE_TAB"),
86+
new AndroidLogcatCommandEntry("Send Text", "adb shell input text <text>"),
87+
new AndroidLogcatCommandEntry("Tap Screen", "adb shell input tap <x> <y>"),
88+
new AndroidLogcatCommandEntry("Swipe Screen", "adb shell input swipe <x1> <y1> <x2> <y2>"),
89+
90+
// --- Networking ---
91+
new AndroidLogcatCommandEntry("Enable WiFi ADB", "adb tcpip 5555"),
92+
new AndroidLogcatCommandEntry("Connect via IP", "adb connect <ip>:5555"),
93+
new AndroidLogcatCommandEntry("Disconnect All", "adb disconnect"),
94+
new AndroidLogcatCommandEntry("Forward Port", "adb forward tcp:<local> tcp:<remote>"),
95+
new AndroidLogcatCommandEntry("Reverse Port", "adb reverse tcp:<remote> tcp:<local>"),
96+
new AndroidLogcatCommandEntry("Get IP Address", "adb shell ip addr show wlan0"),
97+
new AndroidLogcatCommandEntry("Ping Host", "adb shell ping -c 4 <host>"),
98+
99+
// --- Dumpsys ---
100+
new AndroidLogcatCommandEntry("Dump Activity Stack", "adb shell dumpsys activity activities"),
101+
new AndroidLogcatCommandEntry("Dump Memory Info", "adb shell dumpsys meminfo"),
102+
new AndroidLogcatCommandEntry("Dump Window Info", "adb shell dumpsys window"),
103+
new AndroidLogcatCommandEntry("Dump Display Info", "adb shell dumpsys display"),
104+
new AndroidLogcatCommandEntry("Dump CPU Info", "adb shell dumpsys cpuinfo"),
105+
new AndroidLogcatCommandEntry("Dump Battery Stats", "adb shell dumpsys batterystats"),
106+
new AndroidLogcatCommandEntry("Dump SurfaceFlinger", "adb shell dumpsys SurfaceFlinger"),
107+
new AndroidLogcatCommandEntry("Dump Graphics Stats", "adb shell dumpsys gfxinfo <package>"),
108+
new AndroidLogcatCommandEntry("Dump Wifi Info", "adb shell dumpsys wifi"),
109+
new AndroidLogcatCommandEntry("Dump Alarm Info", "adb shell dumpsys alarm"),
110+
new AndroidLogcatCommandEntry("Dump Notification Info", "adb shell dumpsys notification"),
111+
112+
// --- Settings ---
113+
new AndroidLogcatCommandEntry("Enable Stay Awake", "adb shell settings put global stay_on_while_plugged_in 3"),
114+
new AndroidLogcatCommandEntry("Disable Stay Awake", "adb shell settings put global stay_on_while_plugged_in 0"),
115+
new AndroidLogcatCommandEntry("Show Touches On", "adb shell settings put system show_touches 1"),
116+
new AndroidLogcatCommandEntry("Show Touches Off", "adb shell settings put system show_touches 0"),
117+
new AndroidLogcatCommandEntry("Enable USB Debugging", "adb shell settings put global adb_enabled 1"),
118+
new AndroidLogcatCommandEntry("Set Screen Off Timeout", "adb shell settings put system screen_off_timeout <ms>"),
119+
120+
// --- Debug / Advanced ---
121+
new AndroidLogcatCommandEntry("Bug Report", "adb bugreport"),
122+
new AndroidLogcatCommandEntry("Remount System", "adb remount"),
123+
new AndroidLogcatCommandEntry("Root Shell", "adb root"),
124+
new AndroidLogcatCommandEntry("Unroot Shell", "adb unroot"),
125+
new AndroidLogcatCommandEntry("Disable Verity", "adb disable-verity"),
126+
new AndroidLogcatCommandEntry("Enable Verity", "adb enable-verity"),
127+
new AndroidLogcatCommandEntry("Wait for Device Boot", "adb wait-for-device shell getprop sys.boot_completed"),
128+
new AndroidLogcatCommandEntry("List Tombstones", "adb shell ls -lt /data/tombstones/"),
129+
new AndroidLogcatCommandEntry("Pull Tombstone", "adb pull /data/tombstones/<tombstone_XX> <local_path>"),
130+
131+
// --- Meta Quest / XR ---
132+
new AndroidLogcatCommandEntry("List OVR Packages", "adb shell pm list packages | grep oculus"),
133+
new AndroidLogcatCommandEntry("Get Guardian State", "adb shell dumpsys OVRGuardianService"),
134+
new AndroidLogcatCommandEntry("Get Compositor Stats", "adb shell dumpsys OVRCompositor"),
135+
new AndroidLogcatCommandEntry("Set GPU Level", "adb shell setprop debug.oculus.gpuLevel <0-4>"),
136+
new AndroidLogcatCommandEntry("Set CPU Level", "adb shell setprop debug.oculus.cpuLevel <0-4>"),
137+
new AndroidLogcatCommandEntry("Enable Perf Overlay", "adb shell setprop debug.oculus.enablePerfOverlay 1"),
138+
new AndroidLogcatCommandEntry("Disable Perf Overlay", "adb shell setprop debug.oculus.enablePerfOverlay 0"),
139+
new AndroidLogcatCommandEntry("Set Fixed Foveation", "adb shell setprop debug.oculus.foveation.level <0-4>"),
140+
new AndroidLogcatCommandEntry("Set Refresh Rate", "adb shell setprop debug.oculus.refreshRate <72|90|120>"),
141+
142+
// --- AAB / Bundletool ---
143+
new AndroidLogcatCommandEntry("bundletool: Build Split APKs", "java -jar bundletool.jar build-apks --bundle=<path.aab> --output=<output.apks> --connected-device"),
144+
new AndroidLogcatCommandEntry("bundletool: Install APKs", "java -jar bundletool.jar install-apks --apks=<path.apks>"),
145+
new AndroidLogcatCommandEntry("bundletool: Get Device Spec", "java -jar bundletool.jar get-device-spec --output=<device-spec.json>"),
146+
};
147+
}
148+
}

com.unity.mobile.android-logcat/Editor/AndroidLogcatAdbCommandCatalog.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using UnityEditor;
3+
using UnityEngine;
4+
5+
namespace Unity.Android.Logcat
6+
{
7+
internal class AndroidLogcatAddCommandDialog : EditorWindow
8+
{
9+
string m_Name = "";
10+
string m_Command = "";
11+
Action<AndroidLogcatCommandEntry> m_OnSave;
12+
bool m_IsEdit;
13+
Vector2 m_ScrollPos;
14+
15+
internal static void Show(Action<AndroidLogcatCommandEntry> onSave, AndroidLogcatCommandEntry existing = null)
16+
{
17+
var wnd = CreateInstance<AndroidLogcatAddCommandDialog>();
18+
wnd.titleContent = new GUIContent(existing != null ? "Edit Command" : "Add Command");
19+
wnd.m_OnSave = onSave;
20+
wnd.minSize = new Vector2(400, 200);
21+
wnd.maxSize = new Vector2(600, 400);
22+
23+
if (existing != null)
24+
{
25+
wnd.m_Name = existing.name;
26+
wnd.m_Command = existing.command;
27+
wnd.m_IsEdit = true;
28+
}
29+
30+
wnd.ShowUtility();
31+
}
32+
33+
void OnGUI()
34+
{
35+
EditorGUILayout.Space(8);
36+
37+
m_Name = EditorGUILayout.TextField("Name", m_Name);
38+
39+
EditorGUILayout.Space(4);
40+
EditorGUILayout.LabelField("Commands", EditorStyles.boldLabel);
41+
EditorGUILayout.LabelField("Enter one command per line. All commands run sequentially.",
42+
EditorStyles.miniLabel);
43+
44+
m_ScrollPos = EditorGUILayout.BeginScrollView(m_ScrollPos, GUILayout.MinHeight(80), GUILayout.MaxHeight(200));
45+
m_Command = EditorGUILayout.TextArea(m_Command, GUILayout.ExpandHeight(true));
46+
EditorGUILayout.EndScrollView();
47+
48+
EditorGUILayout.Space(8);
49+
50+
EditorGUILayout.BeginHorizontal();
51+
GUILayout.FlexibleSpace();
52+
53+
if (GUILayout.Button("Cancel", GUILayout.Width(80)))
54+
Close();
55+
56+
if (GUILayout.Button(m_IsEdit ? "Save" : "Add", GUILayout.Width(80)))
57+
{
58+
if (string.IsNullOrWhiteSpace(m_Name) || string.IsNullOrWhiteSpace(m_Command))
59+
{
60+
EditorUtility.DisplayDialog("Android Logcat", "Both name and command are required.", "OK");
61+
return;
62+
}
63+
64+
m_OnSave?.Invoke(new AndroidLogcatCommandEntry(m_Name.Trim(), m_Command.Trim()));
65+
Close();
66+
}
67+
68+
EditorGUILayout.EndHorizontal();
69+
}
70+
}
71+
}

com.unity.mobile.android-logcat/Editor/AndroidLogcatAddCommandDialog.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using UnityEngine;
4+
5+
namespace Unity.Android.Logcat
6+
{
7+
[Serializable]
8+
internal class AndroidLogcatCommandEntry
9+
{
10+
[SerializeField] internal string name;
11+
[SerializeField] internal string command;
12+
13+
internal AndroidLogcatCommandEntry() { }
14+
15+
internal AndroidLogcatCommandEntry(string name, string command)
16+
{
17+
this.name = name;
18+
this.command = command;
19+
}
20+
}
21+
22+
[Serializable]
23+
internal class AndroidLogcatCommandEntryList
24+
{
25+
public AndroidLogcatCommandEntry[] items = Array.Empty<AndroidLogcatCommandEntry>();
26+
}
27+
28+
[Serializable]
29+
internal class AndroidLogcatCommandExportData
30+
{
31+
public AndroidLogcatCommandEntry[] favorites = Array.Empty<AndroidLogcatCommandEntry>();
32+
public AndroidLogcatCommandEntry[] general = Array.Empty<AndroidLogcatCommandEntry>();
33+
}
34+
35+
internal static class AndroidLogcatCommandJsonHelper
36+
{
37+
internal static string ToJsonArray<T>(List<T> list)
38+
{
39+
var wrapper = new Wrapper<T> { items = list.ToArray() };
40+
var json = JsonUtility.ToJson(wrapper);
41+
var start = json.IndexOf('[');
42+
var end = json.LastIndexOf(']');
43+
if (start >= 0 && end > start)
44+
return json.Substring(start, end - start + 1);
45+
return "[]";
46+
}
47+
48+
[Serializable]
49+
private class Wrapper<T>
50+
{
51+
public T[] items;
52+
}
53+
}
54+
}

com.unity.mobile.android-logcat/Editor/AndroidLogcatCommandEntry.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
using System.Collections.Generic;
2+
using System.Text;
3+
using UnityEditor;
4+
using UnityEngine;
5+
6+
namespace Unity.Android.Logcat
7+
{
8+
internal class AndroidLogcatCommandOutputWindow : EditorWindow
9+
{
10+
static AndroidLogcatCommandOutputWindow s_Instance;
11+
12+
Vector2 m_ScrollPos;
13+
readonly List<OutputLine> m_Lines = new List<OutputLine>();
14+
bool m_AutoScroll = true;
15+
const int kMaxLines = 5000;
16+
17+
internal struct OutputLine
18+
{
19+
internal string text;
20+
internal Color color;
21+
}
22+
23+
internal static void Open(List<AndroidLogcatCommandsWindow.OutputLine> existingLines)
24+
{
25+
var wnd = GetWindow<AndroidLogcatCommandOutputWindow>();
26+
wnd.titleContent = new GUIContent("Command Output");
27+
wnd.minSize = new Vector2(500, 300);
28+
s_Instance = wnd;
29+
30+
wnd.m_Lines.Clear();
31+
if (existingLines != null)
32+
{
33+
foreach (var ol in existingLines)
34+
wnd.m_Lines.Add(new OutputLine { text = ol.text, color = ol.color });
35+
}
36+
}
37+
38+
internal static void AppendIfOpen(string text, Color color)
39+
{
40+
if (s_Instance == null)
41+
return;
42+
if (string.IsNullOrEmpty(text))
43+
return;
44+
45+
foreach (var line in text.Split('\n'))
46+
{
47+
s_Instance.m_Lines.Add(new OutputLine { text = line, color = color });
48+
}
49+
50+
while (s_Instance.m_Lines.Count > kMaxLines)
51+
s_Instance.m_Lines.RemoveAt(0);
52+
53+
s_Instance.Repaint();
54+
}
55+
56+
void OnEnable()
57+
{
58+
s_Instance = this;
59+
}
60+
61+
void OnGUI()
62+
{
63+
EditorGUILayout.BeginHorizontal(EditorStyles.toolbar);
64+
if (GUILayout.Button("Clear", EditorStyles.toolbarButton))
65+
m_Lines.Clear();
66+
if (GUILayout.Button("Copy All", EditorStyles.toolbarButton))
67+
CopyAll();
68+
GUILayout.FlexibleSpace();
69+
m_AutoScroll = GUILayout.Toggle(m_AutoScroll, "Auto Scroll", EditorStyles.toolbarButton);
70+
EditorGUILayout.EndHorizontal();
71+
72+
m_ScrollPos = EditorGUILayout.BeginScrollView(m_ScrollPos);
73+
74+
for (int i = 0; i < m_Lines.Count; i++)
75+
{
76+
var line = m_Lines[i];
77+
var style = new GUIStyle(EditorStyles.label)
78+
{
79+
wordWrap = true,
80+
richText = false
81+
};
82+
style.normal.textColor = line.color;
83+
EditorGUILayout.LabelField(line.text, style);
84+
}
85+
86+
EditorGUILayout.EndScrollView();
87+
88+
if (m_AutoScroll && Event.current.type == EventType.Repaint)
89+
m_ScrollPos.y = float.MaxValue;
90+
}
91+
92+
void CopyAll()
93+
{
94+
var sb = new StringBuilder();
95+
foreach (var line in m_Lines)
96+
sb.AppendLine(line.text);
97+
EditorGUIUtility.systemCopyBuffer = sb.ToString();
98+
}
99+
100+
void OnDestroy()
101+
{
102+
if (s_Instance == this)
103+
s_Instance = null;
104+
}
105+
}
106+
}

com.unity.mobile.android-logcat/Editor/AndroidLogcatCommandOutputWindow.cs.meta

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)