droid-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +268 -0
- package/dist/commands/build.d.ts +12 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +375 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/device.d.ts +2 -0
- package/dist/commands/device.d.ts.map +1 -0
- package/dist/commands/device.js +177 -0
- package/dist/commands/device.js.map +1 -0
- package/dist/commands/gradle.d.ts +11 -0
- package/dist/commands/gradle.d.ts.map +1 -0
- package/dist/commands/gradle.js +147 -0
- package/dist/commands/gradle.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +231 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logcat.d.ts +6 -0
- package/dist/commands/logcat.d.ts.map +1 -0
- package/dist/commands/logcat.js +131 -0
- package/dist/commands/logcat.js.map +1 -0
- package/dist/commands/variant.d.ts +3 -0
- package/dist/commands/variant.d.ts.map +1 -0
- package/dist/commands/variant.js +77 -0
- package/dist/commands/variant.js.map +1 -0
- package/dist/config/config-manager.d.ts +33 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +219 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/schema.d.ts +21 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +41 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/adb.d.ts +48 -0
- package/dist/core/adb.d.ts.map +1 -0
- package/dist/core/adb.js +431 -0
- package/dist/core/adb.js.map +1 -0
- package/dist/core/android-project.d.ts +25 -0
- package/dist/core/android-project.d.ts.map +1 -0
- package/dist/core/android-project.js +155 -0
- package/dist/core/android-project.js.map +1 -0
- package/dist/core/gradle-wrapper.d.ts +21 -0
- package/dist/core/gradle-wrapper.d.ts.map +1 -0
- package/dist/core/gradle-wrapper.js +221 -0
- package/dist/core/gradle-wrapper.js.map +1 -0
- package/dist/core/terminal.d.ts +20 -0
- package/dist/core/terminal.d.ts.map +1 -0
- package/dist/core/terminal.js +186 -0
- package/dist/core/terminal.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/ui/interactive-menu.d.ts +2 -0
- package/dist/ui/interactive-menu.d.ts.map +1 -0
- package/dist/ui/interactive-menu.js +272 -0
- package/dist/ui/interactive-menu.js.map +1 -0
- package/dist/ui/logger.d.ts +20 -0
- package/dist/ui/logger.d.ts.map +1 -0
- package/dist/ui/logger.js +59 -0
- package/dist/ui/logger.js.map +1 -0
- package/dist/utils/process.d.ts +53 -0
- package/dist/utils/process.d.ts.map +1 -0
- package/dist/utils/process.js +62 -0
- package/dist/utils/process.js.map +1 -0
- package/dist/utils/validators.d.ts +11 -0
- package/dist/utils/validators.d.ts.map +1 -0
- package/dist/utils/validators.js +84 -0
- package/dist/utils/validators.js.map +1 -0
- package/package.json +54 -0
package/dist/core/adb.js
ADDED
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdbManager = void 0;
|
|
4
|
+
const process_1 = require("../utils/process");
|
|
5
|
+
const logger_1 = require("../ui/logger");
|
|
6
|
+
const validators_1 = require("../utils/validators");
|
|
7
|
+
class AdbManager {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.devices = [];
|
|
10
|
+
}
|
|
11
|
+
static getInstance() {
|
|
12
|
+
if (!AdbManager.instance) {
|
|
13
|
+
AdbManager.instance = new AdbManager();
|
|
14
|
+
}
|
|
15
|
+
return AdbManager.instance;
|
|
16
|
+
}
|
|
17
|
+
async checkAdbAvailable() {
|
|
18
|
+
const available = await process_1.ProcessManager.checkCommand('adb');
|
|
19
|
+
if (!available) {
|
|
20
|
+
logger_1.Logger.error('ADB not found. Please ensure Android SDK is installed and adb is in your PATH.');
|
|
21
|
+
}
|
|
22
|
+
return available;
|
|
23
|
+
}
|
|
24
|
+
async getDevices() {
|
|
25
|
+
if (!(await this.checkAdbAvailable())) {
|
|
26
|
+
logger_1.Logger.debug('ADB not available');
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
const result = await process_1.ProcessManager.run('adb', ['devices', '-l']);
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
logger_1.Logger.error('Failed to get devices:', result.stderr);
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
logger_1.Logger.debug('ADB devices output:', result.stdout);
|
|
36
|
+
this.devices = await this.parseDevicesList(result.stdout);
|
|
37
|
+
logger_1.Logger.debug('Parsed devices:', JSON.stringify(this.devices, null, 2));
|
|
38
|
+
return this.devices;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger_1.Logger.error('Error getting devices:', error);
|
|
42
|
+
return [];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async parseDevicesList(output) {
|
|
46
|
+
const lines = output.split('\n');
|
|
47
|
+
const devices = [];
|
|
48
|
+
for (const line of lines) {
|
|
49
|
+
// Skip header line and empty lines
|
|
50
|
+
if (line.includes('List of devices attached') || !line.trim()) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Parse device line - format: "deviceId state details..."
|
|
54
|
+
// Split by whitespace and get first two parts
|
|
55
|
+
const parts = line.trim().split(/\s+/);
|
|
56
|
+
if (parts.length >= 2) {
|
|
57
|
+
const deviceId = parts[0].trim();
|
|
58
|
+
const state = parts[1].trim();
|
|
59
|
+
logger_1.Logger.debug(`Parsing device line: "${line}"`);
|
|
60
|
+
logger_1.Logger.debug(`Device ID: "${deviceId}", State: "${state}"`);
|
|
61
|
+
if (validators_1.Validators.isValidDeviceId(deviceId)) {
|
|
62
|
+
const device = {
|
|
63
|
+
id: deviceId,
|
|
64
|
+
name: await this.getDeviceName(deviceId),
|
|
65
|
+
state,
|
|
66
|
+
type: deviceId.includes('emulator') ? 'emulator' : 'device',
|
|
67
|
+
};
|
|
68
|
+
// Get additional device properties
|
|
69
|
+
const properties = await this.getDeviceProperties(deviceId);
|
|
70
|
+
device.apiLevel = properties.apiLevel;
|
|
71
|
+
device.model = properties.model;
|
|
72
|
+
devices.push(device);
|
|
73
|
+
logger_1.Logger.debug(`Added device: ${JSON.stringify(device, null, 2)}`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
logger_1.Logger.debug(`Invalid device ID: ${deviceId}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return devices;
|
|
81
|
+
}
|
|
82
|
+
async getDeviceName(deviceId) {
|
|
83
|
+
try {
|
|
84
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
85
|
+
'-s', deviceId,
|
|
86
|
+
'shell', 'getprop', 'ro.product.model'
|
|
87
|
+
]);
|
|
88
|
+
if (result.success && result.stdout.trim()) {
|
|
89
|
+
return result.stdout.trim();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
logger_1.Logger.debug(`Failed to get device name for ${deviceId}:`, error);
|
|
94
|
+
}
|
|
95
|
+
return deviceId;
|
|
96
|
+
}
|
|
97
|
+
async getDeviceProperties(deviceId) {
|
|
98
|
+
const properties = {};
|
|
99
|
+
try {
|
|
100
|
+
// Get API level
|
|
101
|
+
const apiResult = await process_1.ProcessManager.run('adb', [
|
|
102
|
+
'-s', deviceId,
|
|
103
|
+
'shell', 'getprop', 'ro.build.version.sdk'
|
|
104
|
+
]);
|
|
105
|
+
if (apiResult.success && apiResult.stdout.trim()) {
|
|
106
|
+
properties.apiLevel = parseInt(apiResult.stdout.trim(), 10);
|
|
107
|
+
}
|
|
108
|
+
// Get model
|
|
109
|
+
const modelResult = await process_1.ProcessManager.run('adb', [
|
|
110
|
+
'-s', deviceId,
|
|
111
|
+
'shell', 'getprop', 'ro.product.model'
|
|
112
|
+
]);
|
|
113
|
+
if (modelResult.success && modelResult.stdout.trim()) {
|
|
114
|
+
properties.model = modelResult.stdout.trim();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
logger_1.Logger.debug(`Failed to get properties for ${deviceId}:`, error);
|
|
119
|
+
}
|
|
120
|
+
return properties;
|
|
121
|
+
}
|
|
122
|
+
async installApk(deviceId, apkPath) {
|
|
123
|
+
if (!(await this.checkAdbAvailable())) {
|
|
124
|
+
return {
|
|
125
|
+
success: false,
|
|
126
|
+
error: 'ADB is not available',
|
|
127
|
+
errorType: 'UNKNOWN',
|
|
128
|
+
suggestion: 'Please ensure Android SDK is installed and ADB is in PATH'
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
try {
|
|
132
|
+
logger_1.Logger.info(`Installing APK on ${deviceId}...`);
|
|
133
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
134
|
+
'-s', deviceId,
|
|
135
|
+
'install', '-r', apkPath
|
|
136
|
+
]);
|
|
137
|
+
if (result.success) {
|
|
138
|
+
logger_1.Logger.success(`APK installed successfully on ${deviceId}`);
|
|
139
|
+
return { success: true };
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
const errorOutput = result.stderr || result.stdout || '';
|
|
143
|
+
logger_1.Logger.error(`Failed to install APK on ${deviceId}:`, errorOutput);
|
|
144
|
+
return this.analyzeInstallError(errorOutput);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (error) {
|
|
148
|
+
logger_1.Logger.error('Error installing APK:', error);
|
|
149
|
+
return {
|
|
150
|
+
success: false,
|
|
151
|
+
error: error instanceof Error ? error.message : String(error),
|
|
152
|
+
errorType: 'UNKNOWN',
|
|
153
|
+
suggestion: 'Check that the device is connected and the APK file exists'
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
analyzeInstallError(errorOutput) {
|
|
158
|
+
const error = errorOutput.toLowerCase();
|
|
159
|
+
if (error.includes('install_failed_insufficient_storage')) {
|
|
160
|
+
return {
|
|
161
|
+
success: false,
|
|
162
|
+
error: errorOutput,
|
|
163
|
+
errorType: 'INSUFFICIENT_STORAGE',
|
|
164
|
+
suggestion: 'The device is running out of storage space. Try uninstalling unused apps or clearing app data.'
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (error.includes('install_failed_already_exists') || error.includes('install_failed_duplicate_package')) {
|
|
168
|
+
return {
|
|
169
|
+
success: false,
|
|
170
|
+
error: errorOutput,
|
|
171
|
+
errorType: 'DUPLICATE_PACKAGE',
|
|
172
|
+
suggestion: 'The app is already installed. Try uninstalling it first or use the force reinstall option.'
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
if (error.includes('install_failed_invalid_apk') || error.includes('failed to parse')) {
|
|
176
|
+
return {
|
|
177
|
+
success: false,
|
|
178
|
+
error: errorOutput,
|
|
179
|
+
errorType: 'INVALID_APK',
|
|
180
|
+
suggestion: 'The APK file is corrupted or invalid. Try rebuilding the project.'
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
if (error.includes('permission denied') || error.includes('install_failed_user_restricted')) {
|
|
184
|
+
return {
|
|
185
|
+
success: false,
|
|
186
|
+
error: errorOutput,
|
|
187
|
+
errorType: 'PERMISSION_DENIED',
|
|
188
|
+
suggestion: 'Installation blocked by device security. Enable "Install from unknown sources" or check device permissions.'
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
success: false,
|
|
193
|
+
error: errorOutput,
|
|
194
|
+
errorType: 'UNKNOWN',
|
|
195
|
+
suggestion: 'Check device connection and try again. If the problem persists, try restarting ADB or the device.'
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
async uninstallApp(deviceId, packageName) {
|
|
199
|
+
if (!(await this.checkAdbAvailable())) {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
try {
|
|
203
|
+
logger_1.Logger.info(`Uninstalling ${packageName} from ${deviceId}...`);
|
|
204
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
205
|
+
'-s', deviceId,
|
|
206
|
+
'uninstall', packageName
|
|
207
|
+
]);
|
|
208
|
+
if (result.success) {
|
|
209
|
+
logger_1.Logger.success(`${packageName} uninstalled successfully from ${deviceId}`);
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
logger_1.Logger.warn(`Could not uninstall ${packageName}:`, result.stderr);
|
|
213
|
+
return false;
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
logger_1.Logger.error('Error uninstalling app:', error);
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
async getStorageInfo(deviceId) {
|
|
221
|
+
if (!(await this.checkAdbAvailable())) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
226
|
+
'-s', deviceId,
|
|
227
|
+
'shell', 'df', '/data'
|
|
228
|
+
]);
|
|
229
|
+
if (result.success) {
|
|
230
|
+
// Parse df output to get storage info
|
|
231
|
+
const lines = result.stdout.split('\n');
|
|
232
|
+
const dataLine = lines.find(line => line.includes('/data'));
|
|
233
|
+
if (dataLine) {
|
|
234
|
+
const parts = dataLine.split(/\s+/);
|
|
235
|
+
if (parts.length >= 4) {
|
|
236
|
+
const total = this.formatBytes(Number.parseInt(parts[1]) * 1024);
|
|
237
|
+
const available = this.formatBytes(Number.parseInt(parts[3]) * 1024);
|
|
238
|
+
return { total, available };
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
logger_1.Logger.debug('Error getting storage info:', error);
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
formatBytes(bytes) {
|
|
250
|
+
if (bytes === 0)
|
|
251
|
+
return '0 B';
|
|
252
|
+
const k = 1024;
|
|
253
|
+
const sizes = ['B', 'KB', 'MB', 'GB'];
|
|
254
|
+
const i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
255
|
+
return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
|
|
256
|
+
}
|
|
257
|
+
async launchApp(deviceId, packageName, activityName) {
|
|
258
|
+
if (!(await this.checkAdbAvailable())) {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
try {
|
|
262
|
+
const activity = activityName || await this.getMainActivity(deviceId, packageName);
|
|
263
|
+
if (!activity) {
|
|
264
|
+
logger_1.Logger.error(`Could not find main activity for ${packageName}`);
|
|
265
|
+
return false;
|
|
266
|
+
}
|
|
267
|
+
logger_1.Logger.info(`Launching ${packageName} on ${deviceId}...`);
|
|
268
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
269
|
+
'-s', deviceId,
|
|
270
|
+
'shell', 'am', 'start',
|
|
271
|
+
'-n', `${packageName}/${activity}`
|
|
272
|
+
]);
|
|
273
|
+
if (result.success) {
|
|
274
|
+
logger_1.Logger.success(`App launched successfully on ${deviceId}`);
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
logger_1.Logger.error(`Failed to launch app on ${deviceId}:`, result.stderr);
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
catch (error) {
|
|
283
|
+
logger_1.Logger.error('Error launching app:', error);
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
async getMainActivity(deviceId, packageName) {
|
|
288
|
+
try {
|
|
289
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
290
|
+
'-s', deviceId,
|
|
291
|
+
'shell', 'pm', 'dump', packageName
|
|
292
|
+
]);
|
|
293
|
+
if (result.success) {
|
|
294
|
+
const lines = result.stdout.split('\n');
|
|
295
|
+
for (const line of lines) {
|
|
296
|
+
if (line.includes('android.intent.action.MAIN')) {
|
|
297
|
+
const activityMatch = line.match(/([a-zA-Z0-9._]+\/[a-zA-Z0-9._]+)/);
|
|
298
|
+
if (activityMatch) {
|
|
299
|
+
return activityMatch[1].split('/')[1];
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
logger_1.Logger.debug(`Failed to get main activity for ${packageName}:`, error);
|
|
307
|
+
}
|
|
308
|
+
// Fallback to common activity names
|
|
309
|
+
const commonActivities = ['.MainActivity', '.Main', '.HomeActivity'];
|
|
310
|
+
for (const activity of commonActivities) {
|
|
311
|
+
if (await this.activityExists(deviceId, packageName, activity)) {
|
|
312
|
+
return activity;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
async activityExists(deviceId, packageName, activityName) {
|
|
318
|
+
try {
|
|
319
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
320
|
+
'-s', deviceId,
|
|
321
|
+
'shell', 'pm', 'list', 'packages', packageName
|
|
322
|
+
]);
|
|
323
|
+
return result.success && result.stdout.includes(packageName);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async clearAppData(deviceId, packageName) {
|
|
330
|
+
if (!(await this.checkAdbAvailable())) {
|
|
331
|
+
return false;
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
logger_1.Logger.info(`Clearing app data for ${packageName} on ${deviceId}...`);
|
|
335
|
+
const result = await process_1.ProcessManager.run('adb', [
|
|
336
|
+
'-s', deviceId,
|
|
337
|
+
'shell', 'pm', 'clear', packageName
|
|
338
|
+
]);
|
|
339
|
+
if (result.success) {
|
|
340
|
+
logger_1.Logger.success(`App data cleared for ${packageName}`);
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
logger_1.Logger.error(`Failed to clear app data:`, result.stderr);
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
logger_1.Logger.error('Error clearing app data:', error);
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
getDeviceById(deviceId) {
|
|
354
|
+
return this.devices.find(device => device.id === deviceId) || null;
|
|
355
|
+
}
|
|
356
|
+
getAvailableDevices() {
|
|
357
|
+
return this.devices.filter(device => device.state === 'device');
|
|
358
|
+
}
|
|
359
|
+
getPhysicalDevices() {
|
|
360
|
+
return this.devices.filter(device => device.type === 'device' && device.state === 'device');
|
|
361
|
+
}
|
|
362
|
+
getRunningEmulators() {
|
|
363
|
+
return this.devices.filter(device => device.type === 'emulator' && device.state === 'device');
|
|
364
|
+
}
|
|
365
|
+
async getAvailableEmulators() {
|
|
366
|
+
try {
|
|
367
|
+
const result = await process_1.ProcessManager.run('emulator', ['-list-avds']);
|
|
368
|
+
if (!result.success) {
|
|
369
|
+
logger_1.Logger.debug('Failed to get available emulators:', result.stderr);
|
|
370
|
+
return [];
|
|
371
|
+
}
|
|
372
|
+
const emulators = [];
|
|
373
|
+
const lines = result.stdout.split('\n').filter(line => line.trim());
|
|
374
|
+
for (const line of lines) {
|
|
375
|
+
const name = line.trim();
|
|
376
|
+
if (name) {
|
|
377
|
+
emulators.push({
|
|
378
|
+
name,
|
|
379
|
+
displayName: name.replace(/_/g, ' '),
|
|
380
|
+
});
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
logger_1.Logger.debug('Available emulators:', emulators);
|
|
384
|
+
return emulators;
|
|
385
|
+
}
|
|
386
|
+
catch (error) {
|
|
387
|
+
logger_1.Logger.debug('Error getting available emulators:', error);
|
|
388
|
+
return [];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
async startEmulator(emulatorName) {
|
|
392
|
+
try {
|
|
393
|
+
logger_1.Logger.info(`Starting emulator: ${emulatorName}...`);
|
|
394
|
+
// Start emulator in background
|
|
395
|
+
const emulatorProcess = process_1.ProcessManager.spawn('emulator', ['-avd', emulatorName, '-no-audio'], {
|
|
396
|
+
stdio: 'ignore',
|
|
397
|
+
});
|
|
398
|
+
// Don't wait for emulator to fully start, just check if it launched
|
|
399
|
+
await new Promise(resolve => setTimeout(resolve, 3000));
|
|
400
|
+
logger_1.Logger.success(`Emulator ${emulatorName} is starting...`);
|
|
401
|
+
logger_1.Logger.info('Waiting for emulator to boot (this may take a minute)...');
|
|
402
|
+
// Wait for emulator to appear in device list
|
|
403
|
+
let attempts = 0;
|
|
404
|
+
const maxAttempts = 30; // 30 seconds
|
|
405
|
+
while (attempts < maxAttempts) {
|
|
406
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
407
|
+
const devices = await this.getDevices();
|
|
408
|
+
const runningEmulators = this.getRunningEmulators();
|
|
409
|
+
if (runningEmulators.length > 0) {
|
|
410
|
+
const emulator = runningEmulators.find(e => e.name.includes(emulatorName) || e.id.includes('emulator'));
|
|
411
|
+
if (emulator) {
|
|
412
|
+
logger_1.Logger.success(`Emulator ready: ${emulator.name} (${emulator.id})`);
|
|
413
|
+
return true;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
attempts++;
|
|
417
|
+
}
|
|
418
|
+
logger_1.Logger.warn('Emulator started but may still be booting. You can check status with "adb devices"');
|
|
419
|
+
return true;
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
logger_1.Logger.error('Error starting emulator:', error);
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
async checkEmulatorCommand() {
|
|
427
|
+
return await process_1.ProcessManager.checkCommand('emulator');
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
exports.AdbManager = AdbManager;
|
|
431
|
+
//# sourceMappingURL=adb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adb.js","sourceRoot":"","sources":["../../src/core/adb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface AndroidProjectInfo {
|
|
2
|
+
rootPath: string;
|
|
3
|
+
appPath: string;
|
|
4
|
+
packageName: string;
|
|
5
|
+
buildVariants: string[];
|
|
6
|
+
hasGradleWrapper: boolean;
|
|
7
|
+
gradleWrapperPath: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class AndroidProject {
|
|
10
|
+
private projectInfo;
|
|
11
|
+
static detect(startPath?: string): Promise<AndroidProject | null>;
|
|
12
|
+
private loadProjectInfo;
|
|
13
|
+
private extractPackageName;
|
|
14
|
+
private extractBuildVariants;
|
|
15
|
+
getInfo(): AndroidProjectInfo | null;
|
|
16
|
+
getRootPath(): string;
|
|
17
|
+
getAppPath(): string;
|
|
18
|
+
getPackageName(): string;
|
|
19
|
+
getBuildVariants(): string[];
|
|
20
|
+
hasGradleWrapper(): boolean;
|
|
21
|
+
getGradleWrapperPath(): string;
|
|
22
|
+
getGradleCommand(): string;
|
|
23
|
+
getApkPath(variant?: string): Promise<string>;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=android-project.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-project.d.ts","sourceRoot":"","sources":["../../src/core/android-project.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,WAAW,CAAmC;WAEzC,MAAM,CAAC,SAAS,GAAE,MAAsB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;YAmBxE,eAAe;IAmC7B,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,oBAAoB;IAsB5B,OAAO,IAAI,kBAAkB,GAAG,IAAI;IAIpC,WAAW,IAAI,MAAM;IAIrB,UAAU,IAAI,MAAM;IAIpB,cAAc,IAAI,MAAM;IAIxB,gBAAgB,IAAI,MAAM,EAAE;IAI5B,gBAAgB,IAAI,OAAO;IAI3B,oBAAoB,IAAI,MAAM;IAI9B,gBAAgB,IAAI,MAAM;IAOpB,UAAU,CAAC,OAAO,GAAE,MAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;CAe7D"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.AndroidProject = void 0;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("../ui/logger");
|
|
40
|
+
const validators_1 = require("../utils/validators");
|
|
41
|
+
class AndroidProject {
|
|
42
|
+
constructor() {
|
|
43
|
+
this.projectInfo = null;
|
|
44
|
+
}
|
|
45
|
+
static async detect(startPath = process.cwd()) {
|
|
46
|
+
const project = new AndroidProject();
|
|
47
|
+
// Search for Android project from current directory upwards
|
|
48
|
+
let currentPath = path.resolve(startPath);
|
|
49
|
+
while (currentPath !== path.dirname(currentPath)) {
|
|
50
|
+
if (validators_1.Validators.isAndroidProject(currentPath)) {
|
|
51
|
+
logger_1.Logger.debug(`Found Android project at: ${currentPath}`);
|
|
52
|
+
await project.loadProjectInfo(currentPath);
|
|
53
|
+
return project;
|
|
54
|
+
}
|
|
55
|
+
currentPath = path.dirname(currentPath);
|
|
56
|
+
}
|
|
57
|
+
logger_1.Logger.debug('No Android project found');
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
async loadProjectInfo(rootPath) {
|
|
61
|
+
try {
|
|
62
|
+
const appPath = path.join(rootPath, 'app');
|
|
63
|
+
const buildGradlePath = path.join(appPath, 'build.gradle');
|
|
64
|
+
const buildGradleKtsPath = path.join(appPath, 'build.gradle.kts');
|
|
65
|
+
let buildGradleContent = '';
|
|
66
|
+
if (await validators_1.Validators.isFile(buildGradlePath)) {
|
|
67
|
+
buildGradleContent = await fs.readFile(buildGradlePath, 'utf-8');
|
|
68
|
+
}
|
|
69
|
+
else if (await validators_1.Validators.isFile(buildGradleKtsPath)) {
|
|
70
|
+
buildGradleContent = await fs.readFile(buildGradleKtsPath, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
const packageName = this.extractPackageName(buildGradleContent);
|
|
73
|
+
const buildVariants = this.extractBuildVariants(buildGradleContent);
|
|
74
|
+
const hasGradleWrapper = validators_1.Validators.hasGradleWrapper(rootPath);
|
|
75
|
+
const gradleWrapperPath = path.join(rootPath, 'gradlew');
|
|
76
|
+
this.projectInfo = {
|
|
77
|
+
rootPath,
|
|
78
|
+
appPath,
|
|
79
|
+
packageName,
|
|
80
|
+
buildVariants,
|
|
81
|
+
hasGradleWrapper,
|
|
82
|
+
gradleWrapperPath,
|
|
83
|
+
};
|
|
84
|
+
logger_1.Logger.debug(`Loaded project info: ${JSON.stringify(this.projectInfo, null, 2)}`);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
logger_1.Logger.error('Failed to load project info:', error);
|
|
88
|
+
throw error;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
extractPackageName(buildGradleContent) {
|
|
92
|
+
// Extract applicationId from build.gradle
|
|
93
|
+
const match = buildGradleContent.match(/applicationId\s+['"](.*?)['"]/);
|
|
94
|
+
return match ? match[1] : 'unknown';
|
|
95
|
+
}
|
|
96
|
+
extractBuildVariants(buildGradleContent) {
|
|
97
|
+
const variants = ['debug', 'release']; // Default variants
|
|
98
|
+
// Look for custom build types
|
|
99
|
+
const buildTypesMatch = buildGradleContent.match(/buildTypes\s*\{([\s\S]*?)\}/);
|
|
100
|
+
if (buildTypesMatch) {
|
|
101
|
+
const buildTypesContent = buildTypesMatch[1];
|
|
102
|
+
const customVariants = buildTypesContent.match(/(\w+)\s*\{/g);
|
|
103
|
+
if (customVariants) {
|
|
104
|
+
customVariants.forEach(variant => {
|
|
105
|
+
const variantName = variant.replace(/\s*\{/, '').trim();
|
|
106
|
+
if (!variants.includes(variantName)) {
|
|
107
|
+
variants.push(variantName);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return variants;
|
|
113
|
+
}
|
|
114
|
+
getInfo() {
|
|
115
|
+
return this.projectInfo;
|
|
116
|
+
}
|
|
117
|
+
getRootPath() {
|
|
118
|
+
return this.projectInfo?.rootPath || process.cwd();
|
|
119
|
+
}
|
|
120
|
+
getAppPath() {
|
|
121
|
+
return this.projectInfo?.appPath || path.join(process.cwd(), 'app');
|
|
122
|
+
}
|
|
123
|
+
getPackageName() {
|
|
124
|
+
return this.projectInfo?.packageName || 'unknown';
|
|
125
|
+
}
|
|
126
|
+
getBuildVariants() {
|
|
127
|
+
return this.projectInfo?.buildVariants || ['debug', 'release'];
|
|
128
|
+
}
|
|
129
|
+
hasGradleWrapper() {
|
|
130
|
+
return this.projectInfo?.hasGradleWrapper || false;
|
|
131
|
+
}
|
|
132
|
+
getGradleWrapperPath() {
|
|
133
|
+
return this.projectInfo?.gradleWrapperPath || './gradlew';
|
|
134
|
+
}
|
|
135
|
+
getGradleCommand() {
|
|
136
|
+
if (this.hasGradleWrapper()) {
|
|
137
|
+
return this.getGradleWrapperPath();
|
|
138
|
+
}
|
|
139
|
+
return 'gradle';
|
|
140
|
+
}
|
|
141
|
+
async getApkPath(variant = 'debug') {
|
|
142
|
+
const apkDir = path.join(this.getAppPath(), 'build', 'outputs', 'apk', variant);
|
|
143
|
+
if (await validators_1.Validators.isDirectory(apkDir)) {
|
|
144
|
+
const files = await fs.readdir(apkDir);
|
|
145
|
+
const apkFile = files.find(file => file.endsWith('.apk'));
|
|
146
|
+
if (apkFile) {
|
|
147
|
+
return path.join(apkDir, apkFile);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
// Return expected path even if file doesn't exist yet
|
|
151
|
+
return path.join(apkDir, `app-${variant}.apk`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.AndroidProject = AndroidProject;
|
|
155
|
+
//# sourceMappingURL=android-project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-project.js","sourceRoot":"","sources":["../../src/core/android-project.ts"],"names":[],"mappings":"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"}
|