suchen
HeimWeb-Frontendjs-TutorialFühren Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb

Dieser Artikel wird Ihnen eine Nodepraktische Übung vorstellen und Ihnen zeigen, wie Sie mit Node.js und adb ein Handy-Backup-Gadget entwickeln. Ich hoffe, dass es für alle hilfreich ist!

Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb

Mit der Entwicklung der Technologie verbessert sich die Auflösung der Bilder und Videos, die wir in unserem täglichen Leben aufnehmen, immer weiter, aber das hat auch einen großen Nachteil, nämlich dass ihre Größe auch immer größer wird. Ich erinnere mich noch daran, dass ein Foto, als ich zum ersten Mal Smartphones benutzte, nur 2-5 MB groß war, aber jetzt ist es 15-20 MB oder sogar größer. 2-5MB,而现在一张照片已经达到了15-20MB,甚至更大。

Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb

而我们手机上的存储空间是有限的,我们怎么把这些照片和视频备份起来,好让手机腾出空间来呢?

于是,在刚开始我是将这些数据都存放在了某相册云端上,虽然解决了存放这些数据的问题,但是也冒出了新的问题,例如上传大小约束、需要一直占后台导致耗电增加、广告。

后面我干脆不使用了,自己撸了一个脚本用于备份这些数据,于是就有了这一篇文章。

我使用了Node.jsadb制作了这一个脚本,并命名为MIB

原理

这个小工具是利用手机上的adb调试,通过shell命令读取手机中的文件信息和复制,移动手机中的文件实现的。

执行流程

我画了一个简易流程图,MIB首先会从读取配置文件(没有则创建配文件),根据配置文件读取需要备份的节点路径并进行文件备份操作。直到节点结束。

Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb

开发过程

安装所需环境

  • 下载adb包,用于执行各种设备操作

  • 下载Node.js,这个我相信兄弟们的电脑上都已经有了

  • 安装依赖库

    • fs-extra:基于fs模块二次封装的Node
    • prompts:命令行上交互的Node
    • winston:用于记录脚本日志的Node

由于项目源码有点过多,我这里只放主要的代码部分

有兴趣的小伙伴可以去github上看项目源码 github.com/QC2168/mib

读取配置文件

export const getConfig = (): ConfigType => {
  if (existConf()) {
    return readJsonSync(CONFIG_PATH);
  }
  // 找不到配置文件
  return createDefaultConfig();
};

在执行脚本时,选择需要备份的设备ID。并指定执行adb命令时的设备

(async () => {
  const device: string | boolean = await selectDevice();
  if (device) MIB();
})();

export const selectDevice = async ():Promise<string|false> => {
  // 获取设备
  const list: devicesType[] = devices();

  if (list.length === 0) {
    log("当前无设备连接,请连接后再执行该工具", "warn");
    return false;
  }

  const result = list.map((i) => ({ title: i.name, value: i.name }));

  const { value } = await prompts({
    type: "select",
    name: "value",
    message: "please select your device",
    choices: result,
  });
  currentDeviceName = value;
  return currentDeviceName;
};

遍历备份节点

选择设备之后,进入遍历节点信息,并执行拷贝文件到指定路径(配置文件中的output属性)

const MIB = () => {
  // 获取配置文件
  const { backups, output } = getConfig();
  // 判断备份节点是否为空
  if (backups.length === 0) {
    log("当前备份节点为空", "warn");
    log("请在配置文件中添加备份节点", "warn");
  }
  if (backups.length > 0) {
    isPath(output);
    // 解析备份路径最后一个文件夹
    backups.forEach((item: SaveItemType) => {
      log(`当前执行备份任务:${item.comment}`);
      const arr = item.path.split("/").filter((i: string) => i !== "");
      const folderName = arr.at(-1);
      const backupDir = pathRepair(item.path);
      // 备份目录
      // 判断节点内是否有备份目录  // 拼接导出路径
      const rootPath = pathRepair(pathRepair(output) + folderName);
      const outputDir = item.output
        ? item.output && pathRepair(item.output)
        : rootPath;
      // 判断备份路径是否存在
      if (!isPathAdb(backupDir)) {
        log(`备份路径:${backupDir} 不存在已跳过`, "error");
      } else {
        // 判断导出路径
        isPath(outputDir);
        backup(backupDir, outputDir, item.full);
      }
    });
  }
  log("程序结束");
};


// 细化需要备份的文件,进入备份队列中
const backup = (target: string, output: string, full: boolean = false) => {
  if (!full) {
    // 备份非备份的文件数据
    // 获取手机中的文件信息,对比本地
    const { backupQueue } = initData(target, output);
    // 计算体积和数量
    computeBackupSize(backupQueue);
    // 执行备份程序
    move(backupQueue, output);
  } else {
    // 不文件对比,直接备份
    moveFolder(target, output);
  }
};


// 移动待备份文件队列中的文件
const move = (backupQueue: FileNodeType[], outputDir: string): void => {
  if (backupQueue.length === 0) {
    log("无需备份");
    return;
  }
  for (const fileN of backupQueue) {
    log(`正在备份${fileN.fileName}`);
    try {
      const out: string = execAdb(
        `pull "${fileN.filePath}" "${outputDir + fileN.fileName}"`,
      );
      const speed: string | null = out.match(speedReg) !== null ? out.match(speedReg)![0] : "读取速度失败";
      log(`平均传输速度${speed}`);
    } catch (e: any) {
      log(`备份${fileN.fileName}失败 error:${e.message}`, "error");
    }
  }
};

脚本功能

  • USB连接备份数据
  • 无线连接备份数据
  • 多设备备份选择
  • 单节点全量备份

使用

在终端中输入以下命令进行全局安装mib

npm i @qc2168/mib -g

配置脚本文件

首次使用需要在用户目录下新建.mibrc文件,并设置对应的参数内容。

{
    "backups": [
        {
            "path": "/sdcard/MIUI/sound_recorder/call_rec",
            "comment": "通话录音"
        },
        {
            "path": "/sdcard/DCIM/Camera",
            "comment": "本地相册"
        },
        {
            "path": "/sdcard/DCIM/Creative",
            "comment": "我的创作"
        },
        {
            "path": "/sdcard/Pictures/weixin",
            "comment": "微信相册"
        },
        {
            "path": "/sdcard/tencent/qq_images",
            "comment": "QQ相册"
        },
        {
            "path": "/sdcard/Pictures/知乎",
            "comment": "知乎"
        },
        {
            "path": "/sdcard/tieba",
            "comment": "贴吧"
        },
        {
            "path": "/sdcard/DCIM/Screenshots",
            "comment": "屏幕截屏"
        },
        {
            "path": "/sdcard/DCIM/screenrecorder",
            "comment": "屏幕录制"
        },
        {
            "path": "/sdcard/MIUI/sound_recorder",
            "comment": "录音"
        },
        {
            "path": "/sdcard/MIUI/sound_recorder/app_rec",
            "comment": "应用录音"
        }
    ],
    "output": "E:/backups/MI10PRO"
}

执行备份

在控制台中,直接输入mib

Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb

Und Der Speicherplatz auf unseren Mobiltelefonen ist begrenzt. Wie sichern wir diese Fotos und Videos, um Speicherplatz auf unseren Mobiltelefonen freizugeben?

Also habe ich zu Beginn alle diese Daten in einer Fotoalbum-Cloud gespeichert. Obwohl das Problem der Speicherung dieser Daten gelöst war, traten auch neue Probleme auf, wie z. B. Einschränkungen bei der Upload-Größe und die Notwendigkeit, den Hintergrund ständig zu belegen. was zu einem Anstieg des Stromverbrauchs und der Werbung führte.

Später habe ich einfach aufgehört, es zu verwenden und ein Skript geschrieben, um die Daten zu sichern, sodass dieser Artikel herauskam.

Ich habe

Node.js und adb verwendet, um dieses Skript zu erstellen, und habe es MIB genannt

Prinzip

Dieses kleine Tool verwendet das Debuggen von adb auf dem Mobiltelefon, um die Dateiinformationen im Mobiltelefon über den Befehl shell zu lesen, zu kopieren und zu verschieben die Mobiltelefondateien im . 🎜

Ausführungsprozess

🎜Ich habe ein einfaches Flussdiagramm gezeichnet. MIB liest zunächst die Konfigurationsdatei (falls nicht, erstellen Sie eine Konfigurationsdatei). zu Die Konfigurationsdatei liest den Knotenpfad, der gesichert werden muss, und führt Dateisicherungsvorgänge durch. bis zum Ende des Knotens. 🎜🎜Führen Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb🎜

Entwicklungsprozess

🎜Installieren der erforderlichen Umgebung🎜
  • 🎜Laden Sie das adb-Paket herunter, das zum Ausführen verschiedener Gerätevorgänge verwendet wird🎜
  • 🎜Laden Sie Node.js, ich glaube, das hat jeder bereits auf seinem Computer🎜
  • 🎜Abhängige Bibliotheken installieren🎜
    • fs-extra: basierend auf fsModul sekundäre Kapselung <code>Node-Bibliothek
    • Eingabeaufforderungen: Node-Bibliothek interaktiv auf der Befehlszeile
    • winston: Node-Bibliothek zum Aufzeichnen von Skriptprotokollen
🎜🎜Da der Quellcode des Projekts ein bisschen ist Es sind zu viele, ich habe hier nur den Hauptcodeteil eingefügt🎜🎜Interessierte Freunde können zu github gehen, um den Quellcode des Projekts zu sehen github.com/QC2168/mib🎜🎜🎜🎜Konfigurationsdatei lesen🎜
mib
🎜Wählen Sie beim Ausführen des Skripts das Gerät aus ID muss gesichert werden. Und geben Sie das Gerät an, wenn Sie den Befehl adb ausführen 🎜
2022-04-09 20:58:11 info 当前执行备份任务:屏幕录制
2022-04-09 20:58:11 info 备份数量1
2022-04-09 20:58:11 info 已获取数据24Mb
2022-04-09 20:58:11 info 备份体积24Mb
2022-04-09 20:58:11 info 正在备份Screenrecorder-2022-04-08-19-45-51-836.mp4
2022-04-09 20:58:12 info 平均传输速度27.7 MB/s
2022-04-09 20:58:12 info 当前执行备份任务:录音
2022-04-09 20:58:12 info 备份数量0
2022-04-09 20:58:12 info 备份体积0Mb
2022-04-09 20:58:12 info 无需备份
2022-04-09 20:58:13 info 程序结束
🎜Durchlaufen Sie den Sicherungsknoten🎜🎜Danach Wählen Sie das Gerät aus, geben Sie die Informationen zum Traversierungsknoten ein und führen Sie die Kopierdatei zum angegebenen Pfad aus (Attribut output in der Konfigurationsdatei). 🎜rrreee

Skriptfunktion h2>
  • USBSicherungsdaten verbinden li>
  • Sicherungsdaten der drahtlosen Verbindung
  • Multi-Device-Backup-Auswahl
  • Einzelknoten-Vollsicherung

Verwenden

🎜 Geben Sie den folgenden Befehl im Terminal ein, um die globale Installation durchzuführen mib . 🎜rrreee🎜Konfigurationsskriptdatei🎜🎜Bei der ersten Verwendung müssen Sie eine neue .mibrc-Datei im Benutzerverzeichnis erstellen und den entsprechenden Parameterinhalt festlegen. 🎜rrreee🎜Sicherung durchführen🎜🎜Geben Sie in der Konsole direkt mib ein, um das Skript auszulösen. Es sind keine weiteren Parameter erforderlich. 🎜rrreee🎜Die Konsole gibt entsprechende Informationen basierend auf der Konfigurationsdatei aus. 🎜rrreee🎜🎜Ursprüngliche Adresse: https://juejin.cn/post/7084889987631710221🎜🎜Autor: _island🎜🎜🎜Weitere Informationen zu Knoten finden Sie unter: 🎜nodejs-Tutorial🎜! 🎜

Das obige ist der detaillierte Inhalt vonFühren Sie Sie Schritt für Schritt durch die Entwicklung eines Mobiltelefon-Backup-Gadgets mit Node.js und adb. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
Dieser Artikel ist reproduziert unter:掘金社区. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
JavaScript und das Web: Kernfunktionalität und AnwendungsfälleJavaScript und das Web: Kernfunktionalität und AnwendungsfälleApr 18, 2025 am 12:19 AM

Zu den Hauptanwendungen von JavaScript in der Webentwicklung gehören die Interaktion der Clients, die Formüberprüfung und die asynchrone Kommunikation. 1) Dynamisches Inhaltsaktualisierung und Benutzerinteraktion durch DOM -Operationen; 2) Die Kundenüberprüfung erfolgt vor dem Einreichung von Daten, um die Benutzererfahrung zu verbessern. 3) Die Aktualisierung der Kommunikation mit dem Server wird durch AJAX -Technologie erreicht.

Verständnis der JavaScript -Engine: ImplementierungsdetailsVerständnis der JavaScript -Engine: ImplementierungsdetailsApr 17, 2025 am 12:05 AM

Es ist für Entwickler wichtig, zu verstehen, wie die JavaScript -Engine intern funktioniert, da sie effizientere Code schreibt und Leistungs Engpässe und Optimierungsstrategien verstehen kann. 1) Der Workflow der Engine umfasst drei Phasen: Parsen, Kompilieren und Ausführung; 2) Während des Ausführungsprozesses führt die Engine dynamische Optimierung durch, wie z. B. Inline -Cache und versteckte Klassen. 3) Zu Best Practices gehören die Vermeidung globaler Variablen, die Optimierung von Schleifen, die Verwendung von const und lass und die Vermeidung übermäßiger Verwendung von Schließungen.

Python vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitPython vs. JavaScript: Die Lernkurve und BenutzerfreundlichkeitApr 16, 2025 am 12:12 AM

Python eignet sich besser für Anfänger mit einer reibungslosen Lernkurve und einer kurzen Syntax. JavaScript ist für die Front-End-Entwicklung mit einer steilen Lernkurve und einer flexiblen Syntax geeignet. 1. Python-Syntax ist intuitiv und für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet. 2. JavaScript ist flexibel und in Front-End- und serverseitiger Programmierung weit verbreitet.

Python gegen JavaScript: Community, Bibliotheken und RessourcenPython gegen JavaScript: Community, Bibliotheken und RessourcenApr 15, 2025 am 12:16 AM

Python und JavaScript haben ihre eigenen Vor- und Nachteile in Bezug auf Gemeinschaft, Bibliotheken und Ressourcen. 1) Die Python-Community ist freundlich und für Anfänger geeignet, aber die Front-End-Entwicklungsressourcen sind nicht so reich wie JavaScript. 2) Python ist leistungsstark in Bibliotheken für Datenwissenschaft und maschinelles Lernen, während JavaScript in Bibliotheken und Front-End-Entwicklungsbibliotheken und Frameworks besser ist. 3) Beide haben reichhaltige Lernressourcen, aber Python eignet sich zum Beginn der offiziellen Dokumente, während JavaScript mit Mdnwebdocs besser ist. Die Wahl sollte auf Projektbedürfnissen und persönlichen Interessen beruhen.

Von C/C nach JavaScript: Wie alles funktioniertVon C/C nach JavaScript: Wie alles funktioniertApr 14, 2025 am 12:05 AM

Die Verschiebung von C/C zu JavaScript erfordert die Anpassung an dynamische Typisierung, Müllsammlung und asynchrone Programmierung. 1) C/C ist eine statisch typisierte Sprache, die eine manuelle Speicherverwaltung erfordert, während JavaScript dynamisch eingegeben und die Müllsammlung automatisch verarbeitet wird. 2) C/C muss in den Maschinencode kompiliert werden, während JavaScript eine interpretierte Sprache ist. 3) JavaScript führt Konzepte wie Verschlüsse, Prototypketten und Versprechen ein, die die Flexibilität und asynchrone Programmierfunktionen verbessern.

JavaScript -Engines: Implementierungen vergleichenJavaScript -Engines: Implementierungen vergleichenApr 13, 2025 am 12:05 AM

Unterschiedliche JavaScript -Motoren haben unterschiedliche Auswirkungen beim Analysieren und Ausführen von JavaScript -Code, da sich die Implementierungsprinzipien und Optimierungsstrategien jeder Engine unterscheiden. 1. Lexikalanalyse: Quellcode in die lexikalische Einheit umwandeln. 2. Grammatikanalyse: Erzeugen Sie einen abstrakten Syntaxbaum. 3. Optimierung und Kompilierung: Generieren Sie den Maschinencode über den JIT -Compiler. 4. Führen Sie aus: Führen Sie den Maschinencode aus. V8 Engine optimiert durch sofortige Kompilierung und versteckte Klasse.

Jenseits des Browsers: JavaScript in der realen WeltJenseits des Browsers: JavaScript in der realen WeltApr 12, 2025 am 12:06 AM

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Erstellen einer SaaS-Anwendung mit mehreren Mietern mit Next.js (Backend Integration)Apr 11, 2025 am 08:23 AM

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌
Will R.E.P.O. Crossplay haben?
1 Monate vorBy尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

MinGW – Minimalistisches GNU für Windows

MinGW – Minimalistisches GNU für Windows

Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

SecLists

SecLists

SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor