>  기사  >  웹 프론트엔드  >  Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.

Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.

青灯夜游
青灯夜游앞으로
2022-04-14 21:06:423363검색

이 글은 Node실습을 공유하고 Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 소개합니다. 모두에게 도움이 되기를 바랍니다!

Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.

기술의 발전과 함께 우리가 일상에서 찍는 사진과 영상의 화질은 계속해서 향상되고 있지만, 이 또한 크기가 점점 커지고 있다는 큰 단점이 있습니다. 처음 스마트폰을 사용하기 시작했을 때는 사진 한 장이 2~5MB에 불과했지만 지금은 사진이 15~20MB 또는 그보다 더 커진 것을 아직도 기억합니다. 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

Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.

그리고 휴대폰의 저장 공간은 제한되어 있습니다. 휴대폰의 공간을 확보하기 위해 이러한 사진과 비디오를 어떻게 백업합니까?

그래서 처음에는 이 모든 데이터를 사진 앨범 클라우드에 저장했습니다. 이러한 데이터를 저장하는 문제는 해결되었지만 업로드 크기 제한, 배경을 항상 차지해야 하는 필요성 등 새로운 문제도 나타났습니다. 이는 전력 소비 증가, 광고로 이어졌습니다.

나중에 저는 단순히 사용을 중단하고 데이터를 백업하기 위해 스크립트를 직접 작성하여 이 글을 작성했습니다.

저는

Node.jsadb를 사용하여 이 스크립트를 만들고 이름을 MIB

로 지정했습니다.

이 작은 도구는 휴대폰의 adb 디버깅을 사용하여 shell 명령을 통해 휴대폰의 파일 정보를 읽고 복사하고 이동합니다. 휴대폰 파일은 . 🎜

실행 프로세스

🎜간단한 흐름도를 그렸습니다. MIB는 먼저 구성 파일을 읽습니다(그렇지 않은 경우 구성 파일을 생성합니다). to 구성 파일은 백업해야 하는 노드 경로를 읽고 파일 백업 작업을 수행합니다. 노드 끝까지. 🎜🎜Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.🎜

개발 과정

🎜필수 환경 설치🎜
  • 🎜다양한 장치 작업을 수행하는 데 사용되는 adb 패키지를 다운로드하세요🎜
  • 🎜Node.js, 모든 사람이 이미 자신의 컴퓨터에 이 기능을 가지고 있다고 생각합니다🎜
  • 🎜종속 라이브러리 설치🎜
    • fs-extra: fs모듈 보조 캡슐화 <code>노드 라이브러리
    • 프롬프트: 명령줄에서 대화형 노드 라이브러리
    • winston: 스크립트 로그 기록을 위한 Node 라이브러리
🎜🎜프로젝트 소스 코드가 약간 있기 때문에 너무 많아서 메인 코드 부분만 여기에 넣었습니다🎜🎜관심 있는 친구들은 github에 가서 프로젝트 소스 코드를 볼 수 있습니다 github.com/QC2168/mib🎜🎜🎜🎜구성 파일 읽기🎜
mib
🎜스크립트를 실행할 때 해당 장치를 선택하세요. ID를 백업해야 합니다. 그리고 adb 명령을 실행할 때 장치를 지정합니다. 🎜
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 程序结束
🎜백업 노드 통과🎜🎜After 장치를 선택하고 순회 노드 정보를 입력한 후 지정된 경로(구성 파일의 output 속성)에 복사 파일을 실행합니다. 🎜rrreee

스크립트 기능 h2>
  • USB백업 데이터 연결 li>
  • 무선 연결 백업 데이터
  • 다중 장치 백업 선택
  • 단일 노드 전체 백업

사용

🎜 전역적으로 설치하려면 터미널에 다음 명령을 입력하세요. mib . 🎜rrreee🎜구성 스크립트 파일🎜🎜처음 사용하는 경우 사용자 디렉터리에 새 .mibrc 파일을 만들고 해당 매개변수 내용을 설정해야 합니다. 🎜rrreee🎜백업 수행🎜🎜콘솔에서 mib를 직접 입력하여 스크립트를 트리거하고, 다른 매개변수는 필요하지 않습니다. 🎜rrreee🎜콘솔은 구성 파일을 기반으로 해당 정보를 출력합니다. 🎜rrreee🎜🎜원본 주소: https://juejin.cn/post/7084889987631710221🎜🎜저자: _island🎜🎜🎜노드 관련 지식을 더 보려면 🎜nodejs 튜토리얼🎜을 방문하세요! 🎜

위 내용은 Node.js와 adb를 사용하여 휴대폰 백업 가젯을 개발하는 방법을 단계별로 안내해 드립니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 juejin.cn에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제