目錄
原理
執行流程
開發過程
腳本功能
使用
首頁 web前端 js教程 手把帶你使用Node.js和adb開發一個手機備份小工具

手把帶你使用Node.js和adb開發一個手機備份小工具

Apr 14, 2022 pm 09:06 PM
node.js

這篇文章跟大家分享一個Node實戰,介紹一下使用Node.js和adb怎麼開發一個手機備份小工具,希望對大家有幫助!

手把帶你使用Node.js和adb開發一個手機備份小工具

隨著科技的發展我們日常中拍攝的圖片和視訊清晰度不斷提升,但這也有一個較大的缺點那就是他們的體積也越來越大。還記得以前剛開始使用智慧型手機的時候那會一張照片只不過才2-5MB,而現在一張照片已經達到了15-20MB,甚至更大。

手把帶你使用Node.js和adb開發一個手機備份小工具

而我們手機上的儲存空間是有限的,我們怎麼把這些照片和影片備份起來,好讓手機騰出空間來呢?

於是,在剛開始我是將這些資料都存放在了某相簿雲端上,雖然解決了存放這些資料的問題,但是也冒出了新的問題,例如上傳大小約束、需要一直佔後台導致耗電增加、廣告。

後面我乾脆不使用了,我自己擼了一個腳本用來備份這些數據,於是就有了這篇文章。

我使用了Node.jsadb製作了這個腳本,並命名為MIB

原理

這個小工具是利用手機上的adb調試,透過shell指令讀取手機中的檔案訊息和複製,移動手機中的檔案實現的。

執行流程

我畫了一個簡易流程圖,MIB首先會從讀取設定檔(沒有則建立配檔),根據設定檔讀取需要備份的節點路徑並進行檔案備份作業。直到節點結束。

手把帶你使用Node.js和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即可觸發腳本,無需其他參數。

mib
登入後複製

控制台會根據設定檔並輸出對應的資訊。

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 程序结束
登入後複製
原文網址:https://juejin.cn/post/7084889987631710221

作者:_island

更多node相關知識,請造訪:

nodejs 教學

以上是手把帶你使用Node.js和adb開發一個手機備份小工具的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如果 ADB 在 Windows 11 中無法識別,請執行下列操作 如果 ADB 在 Windows 11 中無法識別,請執行下列操作 May 19, 2023 pm 04:08 PM

如果您嘗試刷新自訂ROM、從引導循環中恢復手機或解鎖引導程序,ADB和Fastboot將是您最好的朋友。 ADB可協助您在手機上安裝應用程式、卸載系統應用程式而無需Root裝置、取得應用程式日誌、向應用程式發出命令以及與您的Android裝置進行一般通訊。 Fastboot和ADB是使用Android裝置時最重要的兩個工具。但是,很多人在第一次嘗試使用ADB和Fastboot時經常會遇到問題。對於第一次嘗試設定ADB的人來說,ADB無法識別錯誤很常見,但對於已

圖文詳解Node V8引擎的記憶體和GC 圖文詳解Node V8引擎的記憶體和GC Mar 29, 2023 pm 06:02 PM

這篇文章帶大家深入了解NodeJS V8引擎的記憶體和垃圾回收器(GC),希望對大家有幫助!

一文聊聊Node中的記憶體控制 一文聊聊Node中的記憶體控制 Apr 26, 2023 pm 05:37 PM

基於無阻塞、事件驅動建立的Node服務,具有記憶體消耗低的優點,非常適合處理海量的網路請求。在海量請求的前提下,就需要考慮「記憶體控制」的相關問題了。 1. V8的垃圾回收機制與記憶體限制 Js由垃圾回收機

聊聊如何選擇一個最好的Node.js Docker映像? 聊聊如何選擇一個最好的Node.js Docker映像? Dec 13, 2022 pm 08:00 PM

選擇一個Node的Docker映像看起來像是小事,但是映像的大小和潛在漏洞可能會對你的CI/CD流程和安全造成重大的影響。那我們要如何選擇一個最好Node.js Docker映像呢?

Node.js 19正式發布,聊聊它的 6 大功能! Node.js 19正式發布,聊聊它的 6 大功能! Nov 16, 2022 pm 08:34 PM

Node 19已正式發布,以下這篇文章就來帶大家詳解了解Node.js 19的 6 大特性,希望對大家有幫助!

深入聊聊Node中的File模組 深入聊聊Node中的File模組 Apr 24, 2023 pm 05:49 PM

文件模組是對底層文件操作的封裝,例如文件讀寫/打開關閉/刪除添加等等文件模組最大的特點就是所有的方法都提供的**同步**和**異步**兩個版本,具有sync 字尾的方法都是同步方法,沒有的都是異

如何在 Windows 11 上下載和安裝 ADB 驅動程式 如何在 Windows 11 上下載和安裝 ADB 驅動程式 Apr 13, 2023 pm 11:19 PM

ADB 是一個命令列工具,允許使用者在 Android 裝置上執行複雜且不受限制的變更。您可以使用它來執行應用程式旁加載、自訂 ROM 快閃記憶體和韌體升級,以及其他進階調整。 ADB 驅動程式促進了此過程並確保 ADB 按預期運作。但是,與早期的作業系統一樣,ADB 並未預先安裝在 Windows 11 上。因此,您必須自行安裝驅動程式。在本教程中,我們不僅會向您展示如何安裝 ADB 驅動程序,還會帶您完成配置過程。 ADB 驅動程式可以安全安裝嗎?亞行司機通常是安全的。它們不會對您的 PC 進行任何不必

聊聊Node.js中的 GC (垃圾回收)機制 聊聊Node.js中的 GC (垃圾回收)機制 Nov 29, 2022 pm 08:44 PM

Node.js 是如何做 GC (垃圾回收)的?下面這篇文章就來帶大家了解一下。

See all articles