Gadget de copia de seguridad de teléfono móvil basado en adb+Node.js

¡Acostúmbrate a escribir juntos! Este es el octavo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

prefacio

Con el desarrollo de la ciencia y la tecnología, la claridad de las imágenes y videos que tomamos en nuestra vida diaria continúa mejorando, pero esto también tiene una gran desventaja, es decir, su volumen también es cada vez más grande. Recuerdo cuando comencé a usar teléfonos inteligentes, era solo una foto 2-5MB, y ahora una foto lo ha alcanzado 15-20MB, aún más grande.

Y el espacio de almacenamiento en nuestro teléfono es limitado, ¿cómo hacemos una copia de seguridad de estas fotos y videos para liberar espacio en el teléfono?

Entonces, al principio almacené todos estos datos en la nube de un álbum, si bien se solucionó el problema de almacenar estos datos, también aparecieron nuevos problemas, como las restricciones de tamaño de carga, la necesidad de ocupar el fondo todo el tiempo, lo que resultó en un mayor consumo de energía, publicidad.

Más tarde, no lo usé en absoluto, escribí un script para hacer una copia de seguridad de estos datos, así que tengo este artículo.

Utilicé Node.jse adbhice este script y lo nombréMIB

principio

Este gadget se realiza utilizando la adbdepuración en el teléfono shellmóvil para leer y copiar la información del archivo en el teléfono móvil a través de comandos y mover los archivos en el teléfono móvil.

Proceso de implementación

Dibujé un diagrama de flujo simple. MIBPrimero, leeré el archivo de configuración (si no, crearé un archivo de configuración), leeré la ruta del nodo que debe respaldarse de acuerdo con el archivo de configuración y realizaré operaciones de respaldo de archivos. hasta que termine el nodo.

imagen-20220409235830477

proceso de desarrollo

Instalar el entorno requerido

  1. Descargar adbpaquetes para realizar varias operaciones de dispositivos
  2. Descarga Node.js, esto creo que los hermanos ya lo tienen en sus computadoras
  3. Instalar bibliotecas dependientes
    • fs-extra: Biblioteca basada en fsencapsulación secundaria de móduloNode
    • promptsNode: Bibliotecas para la interacción en la línea de comandos
    • winstonNode: biblioteca para el registro de secuencias de comandos

Dado que el código fuente del proyecto es demasiado, solo pongo la parte del código principal aquí

Los socios interesados ​​pueden ir a githubver el código fuente del proyecto github.com/QC2168/mib

leer el archivo de configuración

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

Al ejecutar el script, seleccione el dispositivo del que se debe hacer una copia de seguridad ID. y especificar adbel dispositivo al ejecutar el comando

(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;
};
复制代码

Atravesar nodos de respaldo

Después de seleccionar el dispositivo, ingrese la información del nodo transversal y ejecute el archivo de copia en la ruta especificada ( outputpropiedad en el archivo de configuración)

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");
    }
  }
};
复制代码

función de guión

  • USBConectar datos de respaldo
  • Copia de seguridad de datos de forma inalámbrica
  • Múltiples opciones de copia de seguridad del dispositivo
  • Copia de seguridad completa de un solo nodo

usar

Ingrese el siguiente comando en la terminal para instalar globalmente mib.

npm i @qc2168/mib -g
复制代码

configurar el archivo de script

Para el primer uso, debe crear un nuevo archivo en el directorio del usuario .mibrcy configurar el contenido del parámetro correspondiente.

{
    "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"
}
复制代码

realizar copia de seguridad

En la consola, la entrada directa mibactiva el script sin parámetros adicionales.

mib
复制代码

La consola generará la información correspondiente según el archivo de configuración.

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 程序结束
复制代码

Si desea obtener más información sobre este proyecto, vaya al código del proyecto: github.com/QC2168/mib

Supongo que te gusta

Origin juejin.im/post/7084889987631710221
Recomendado
Clasificación