Gadget de backup de celular baseado em adb+Node.js

Adquira o hábito de escrever juntos! Este é o 8º dia da minha participação no "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .

prefácio

Com o desenvolvimento da ciência e da tecnologia, a clareza das fotos e vídeos que tiramos no nosso dia a dia continua a melhorar, mas isso também tem uma grande desvantagem, ou seja, seu volume também está ficando cada vez maior. Lembro-me de quando comecei a usar smartphones, era apenas uma foto 2-5MB, e agora uma foto chegou 15-20MB, ainda maior.

E o espaço de armazenamento em nosso telefone é limitado, como fazemos backup dessas fotos e vídeos para liberar espaço no telefone?

Então, no início, eu armazenei todos esses dados na nuvem de um álbum. Embora o problema de armazenamento desses dados tenha sido resolvido, novos problemas também surgiram, como restrições de tamanho de upload, necessidade de ocupar o fundo o tempo todo, resultando no aumento do consumo de energia, anuncie.

Mais tarde, não usei nada, escrevi um script para fazer backup desses dados, então tenho este artigo.

Eu usei Node.jse adbfiz este script e o nomeeiMIB

princípio

Este gadget é realizado usando a adbdepuração no shellcelular para ler e copiar as informações do arquivo no celular por meio de comandos e mover os arquivos no celular.

Processo de implementação

Desenhei um fluxograma simples.Primeiro MIB, vou ler o arquivo de configuração (se não, criar um arquivo de configuração), ler o caminho do nó que precisa ser feito backup de acordo com o arquivo de configuração e executar as operações de backup do arquivo. até o nó terminar.

imagem-20220409235830477

processo de desenvolvimento

Instale o ambiente necessário

  1. Baixe adbpacotes para realizar várias operações do dispositivo
  2. Baixe Node.js, acredito que os irmãos já tenham em seus computadores
  3. Instalar bibliotecas dependentes
    • fs-extra: Biblioteca baseada no fsencapsulamento secundário do móduloNode
    • promptsNode: Bibliotecas para interação na linha de comando
    • winstonNode: biblioteca para log de script

Como o código-fonte do projeto é um pouco demais, coloquei apenas a parte do código principal aqui

Os parceiros interessados ​​podem acessar githubo código-fonte do projeto github.com/QC2168/mib

leia o arquivo de configuração

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

Ao executar o script, selecione o dispositivo que precisa de backup ID. e especifique adbo dispositivo ao executar o 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;
};
复制代码

Atravessar nós de backup

Após selecionar o dispositivo, insira as informações do nó de passagem e execute o arquivo de cópia para o caminho especificado ( outputpropriedade no arquivo de configuração)

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

função de script

  • USBConectar dados de backup
  • Backup de dados sem fio
  • Várias opções de backup de dispositivos
  • Backup completo de nó único

usar

Digite o seguinte comando no terminal para instalar globalmente mib.

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

configurar arquivo de script

Para o primeiro uso, você precisa criar um novo arquivo no diretório do usuário .mibrce definir o conteúdo do parâmetro correspondente.

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

executar backup

No console, a entrada direta mibaciona o script sem parâmetros adicionais.

mib
复制代码

O console emitirá as informações correspondentes de acordo com o arquivo de configuração.

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

Se você quiser saber mais sobre esse projeto, acesse o código do projeto: github.com/QC2168/mib

Acho que você gosta

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