|
|
|
|
// Copyright (c) 2024, Thomas Dickson
|
|
|
|
|
// See LICENSE for licensing information
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
|
|
"mvdan.cc/fdroidcl/adb"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var cmdScan = &Command{
|
|
|
|
|
UsageLine: "scan",
|
|
|
|
|
Short: "Scan for all recognised apps on a connected device",
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
cmdScan.Run = runScan
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runScan(args []string) error {
|
|
|
|
|
if err := startAdbIfNeeded(); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
devices, err := adb.Devices()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return fmt.Errorf("could not get devices: %v", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(devices) == 0 {
|
|
|
|
|
return fmt.Errorf("no devices found")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for _, device := range devices {
|
|
|
|
|
fmt.Fprintf(os.Stderr, "Scanning %s - %s (%s)\n", device.ID, device.Model, device.Product)
|
|
|
|
|
scanForPackages(device)
|
|
|
|
|
fmt.Fprintln(os.Stderr, "Scan completed without error")
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func scanForPackages(device *adb.Device) {
|
|
|
|
|
cmd := device.AdbShell("pm list packages")
|
|
|
|
|
|
|
|
|
|
out, err := cmd.Output()
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println("could not run command: ", err)
|
|
|
|
|
}
|
|
|
|
|
// fmt.Println(string(out))
|
|
|
|
|
// otherwise, print the output from running the command
|
|
|
|
|
lines := strings.Split(string(out), "\n")
|
|
|
|
|
// fmt.Println(lines)
|
|
|
|
|
|
|
|
|
|
for _, line := range lines {
|
|
|
|
|
if len(line) > 8 {
|
|
|
|
|
line = line[8:]
|
|
|
|
|
// fmt.Println(line)
|
|
|
|
|
|
|
|
|
|
apps, err := findApps([]string{line})
|
|
|
|
|
if err == nil {
|
|
|
|
|
fmt.Println(apps[0].PackageName)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|