干货技巧:单模块编译再见adb push迎接sync命令

Gemma 4 12B QAT+MTP小显存部署实战指南 大语言模型本地部署的核心瓶颈在于显存与推理效率的平衡。量化感知训练(QAT)通过在训练阶段模拟低精度计算,显著提升模型对INT4量化的鲁棒性;多令牌预测(MTP)则通过并行解码优化KV Cache复用,降低GPU kernel调用频次。二者协同可在8GB显存设备上稳定运行12B级模型,兼顾精度、速度与上下文长度。该方案适用于开发者本地AI助手、技术文档生成、SQL翻译等轻量但高交互需求场景,是当前Windows环境中小显存高效落地Gemma系列模型的工程最优解。 阅读详情

ADB Sync 深度解析:从 lunch 到 system 分区同步的完整链路

背景

我们平时如果是在公司做安卓设备类开发的话,一般我们都是修改某一个模块,比如framework.jar,services.jar,Launcher,SystemUI等,修改这些模块后我们不太可能像模拟器一样方便直接使用一个make方式,因为make方式在实体手机等设备上太慢了,一般采用是单编某个模块如make services等,然后再adb push services xxxx。

这种方式有一个比较大的痛点,就是你得非常清楚你make模块是啥,而且make模块后在ubuntu电脑上的out目录具体哪个目录下,目标手机上是哪个目录,一个字符都不可以写错。

案例:

adb push out/target/product/gemini/system/framework/services.jar /system/framework/services.jar

一旦错了字符肯定就无法成功,要么报错,要么push地方不对半天找不到原因,或者说make xxx模块会导致一堆so进行更新,自己又不知道哪些so。

所以这种make 单模块,push单模块方式有如下几个痛点:

1、不清楚目标的相关依赖,不知道push具体有哪些,需要程序员自身非常清楚模块的make后输出目标是啥,一旦make 目标会有相关的波及so依赖等情况,就很可能验证不起作用情况,浪费时间。

2、push目标路径因为可能比较长,有可能出错,一旦错误就无法生效

3、也有的版本push framework.jar时候需要push一堆相关的优化文件等

所以基于上面痛点,有vip学员朋友给马哥分享了一个很好的简单命令adb sync来解决。

在这里插入图片描述
在这里再次对这个学员表示感谢。

1、实战adb sync使用

编译单目标:

. build/envsetup.sh 
breakfast gemini
make framework-minus-apex

这样就编译出来了framework.jar,然后不采用常用的push方式,使用sync方式

看看核心的 adb sync 命令使用格式:

adb: usage: adb sync [-l] [-n]  [-z ALGORITHM] [-Z] [-q] [PARTITION]

然后正式使用


$ adb root;adb remount
$ adb sync system
/system/: 6807 files pushed, 19 skipped. 24.9 MB/s (1617253547 bytes in 61.879s)
$ adb reboot
$ adb logcat -s Activity
--------- beginning of system
06-05 23:20:28.842  2632  2632 V Activity: onCreate 1111 com.android.settings.FallbackHome@8ef16b: null

2. adb sync 命令源码解析与分区映射

2.1 入口:CLI 命令分发(电脑adb是客户端)

当你敲下 adb sync system,代码入口在 packages/modules/adb/client/commandline.cpp:2007:

// commandline.cpp:2007-2060
} else if (!strcmp(argv[0], "sync")) {
    std::string src;
    bool list_only = false;
    bool dry_run = false;
    CompressionType compression = CompressionType::Any;
    // 解析选项: -l(list), -n(dry-run), -z(压缩), -Z(不压缩)

    if (optind == argc) {
        src = "all";              // 不传参数 = 同步所有分区
    } else if (optind + 1 == argc) {
        src = argv[optind];       // 如 "system"
    } else {
        error_exit("...");
    }

    // 硬编码的8个支持分区
    std::vector<std::string> partitions{"data",   "odm",        "oem",   "product",
                                        "system", "system_ext", "vendor"};

    bool found = false;
    for (const auto& partition : partitions) {
        if (src == "all" || src == partition) {
            std::string src_dir{product_file(partition)};   // 关键!
            if (!directory_exists(src_dir)) continue;
            found = true;
            if (!do_sync_sync(src_dir, "/" + partition, list_only, compression, dry_run)) {
                return 1;
            }
        }
    }
}

2.2 product_file():主机路径 → 设备路径的桥接

// commandline.cpp:78-84
static std::string product_file(const std::string& file) {
    const char* ANDROID_PRODUCT_OUT = getenv("ANDROID_PRODUCT_OUT");
    if (ANDROID_PRODUCT_OUT == nullptr) {
        error_exit("product directory not specified; set $ANDROID_PRODUCT_OUT");
    }
    return std::string{ANDROID_PRODUCT_OUT} + OS_PATH_SEPARATOR_STR + file;
}

这就是 lunch 设置的环境变量被用上的地方。

所以 adb sync system 最终会调用:

do_sync_sync(
    "$ANDROID_PRODUCT_OUT/system",   // 主机源目录
    "/system",                        // 设备目标目录
    ...
)

注意:不是只同步某个单独文件,而是递归遍历主机上的整个 system/ 目录树,把它和设备的 /system/ 做差异对比。


3. 核心算法:copy_local_dir_remote 的增量同步逻辑

这是 adb sync 最核心的函数,位于 packages/modules/adb/client/file_sync_client.cpp:1339。

3.1 整体流程

// file_sync_client.cpp:1339-1437
static bool copy_local_dir_remote(SyncConnection& sc, std::string lpath, std::string rpath,
                                  bool check_timestamps, bool list_only,
                                  CompressionType compression, bool dry_run) {
    sc.NewTransfer();

    ensure_trailing_separators(lpath, rpath);

    // 第一步:递归构建文件列表
    std::vector<copyinfo> file_list;
    std::vector<std::string> directory_list;
    // ...
    if (!local_build_list(sc, &file_list, &directory_list, lpath, rpath)) {
        return false;
    }

函数先是调用 local_build_list 把主机上 $ANDROID_PRODUCT_OUT/system/ 下面的所有文件(递归遍历子目录)收集成一个列表,后续的同步决策全部基于这个列表。

3.2 local_build_list:递归遍历主机目录

// file_sync_client.cpp:1279-1327
static bool local_build_list(SyncConnection& sc, std::vector<copyinfo>* file_list,
                             std::vector<std::string>* directory_list, const std::string& lpath,
                             const std::string& rpath) {
    std::vector<copyinfo> dirlist;
    std::unique_ptr<DIR, int (*)(DIR*)> dir(opendir(lpath.c_str()), closedir);

    dirent* de;
    while ((de = readdir(dir.get()))) {
        if (IsDotOrDotDot(de->d_name)) continue;

        std::string stat_path = lpath + de->d_name;
        struct stat st;
        if (lstat(stat_path.c_str(), &st) == -1) { continue; }

        copyinfo ci(lpath, rpath, de->d_name, st.st_mode);
        if (S_ISDIR(st.st_mode)) {
            dirlist.push_back(ci);           // 目录暂存,稍后递归
        } else {
            if (!should_push_file(st.st_mode)) {
                ci.skip = true;              // 跳过特殊文件(字符设备等)
            }
            ci.time = st.st_mtime;           // 记录本地 mtime
            ci.size = st.st_size;            // 记录本地 size
            file_list->push_back(ci);        // 普通文件加入列表
        }
    }
    dir.reset();

    // 递归处理子目录
    for (const copyinfo& ci : dirlist) {
        directory_list->push_back(ci.rpath);
        local_build_list(sc, file_list, directory_list, ci.lpath, ci.rpath);
    }
    return true;
}

这一步结束后,file_list 包含了整个 system/ 目录下所有文件的路径、大小、修改时间。每个文件都会生成一个 copyinfo 结构体。

3.3 copyinfo 结构体

// file_sync_client.cpp:85-105
struct copyinfo {
    std::string lpath;   // 主机上的完整路径
    std::string rpath;   // 设备上的完整路径
    time_t time;         // 本地文件 mtime
    mode_t mode;         // 文件权限
    size_t size;         // 文件大小
    bool skip;           // true = 跳过, 不推送
};

3.4 增量对比:谁来决定哪些文件要推送?(最关键的部分)

回到 copy_local_dir_remote,文件列表构建完成后,紧接着就是核心差异对比逻辑:

// file_sync_client.cpp:1399-1414
if (check_timestamps) {
    // 向设备发送所有文件的 lstat 请求
    for (const copyinfo& ci : file_list) {
        if (!sc.SendLstat(ci.rpath)) {
            sc.Error("failed to send lstat");
            return false;
        }
    }
    // 读取设备返回的 stat 信息,逐个对比
    for (copyinfo& ci : file_list) {
        struct stat st;
        if (sc.FinishStat(&st)) {
            if (st.st_size == static_cast<off_t>(ci.size) && st.st_mtime == ci.time) {
                ci.skip = true;  // <-- 大小和时间都匹配,标记为跳过!
            }
        }
    }
}

这就是增量同步的决策核心:

  • 向设备批量发送 lstat 请求,获取设备上每个文件的元数据
  • 对比文件大小 + 修改时间戳
  • 两者都匹配 → skip = true,不传输
  • 任一不匹配 → 需要传输,进入下面的推送阶段

不需要校验和(checksum),没有 MD5/SHA 计算。纯粹的 size + mtime 判等。

3.5 执行推送

// file_sync_client.cpp:1418-1431
for (const copyinfo& ci : file_list) {
    if (!ci.skip) {
        if (list_only) {
            sc.Println("would push: %s -> %s", ci.lpath.c_str(), ci.rpath.c_str());
        } else {
            if (!sync_send(sc, ci.lpath, ci.rpath, ci.time, ci.mode, false, compression, dry_run)) {
                return false;
            }
        }
    } else {
        skipped++;
    }
}

未跳过的文件逐个调用 sync_send 发送,已跳过的计入 skipped 统计。

3.6 sync_send:单个文件发送的细节

// file_sync_client.cpp:1040-1091
static bool sync_send(SyncConnection& sc, const std::string& lpath, const std::string& rpath,
                      unsigned mtime, mode_t mode, bool sync, CompressionType compression,
                      bool dry_run) {
    // 二次确认:sync 模式下再次 lstat 对比
    if (sync) {
        struct stat st;
        if (sync_lstat(sc, rpath, &st)) {
            if (st.st_mtime == static_cast<time_t>(mtime)) {
                sc.RecordFilesSkipped(1);
                return true;  // 又被跳过了
            }
        }
    }

    // 小文件 (< 64KB): 一次性读取并发送
    if (st.st_size < SYNC_DATA_MAX) {
        std::string data;
        android::base::ReadFileToString(lpath, &data, true);
        sc.SendSmallFile(rpath, mode, lpath, rpath, mtime, data.data(), data.size(), dry_run);
    } else {
        // 大文件 (>= 64KB): 分块流式传输,支持压缩
        sc.SendLargeFile(rpath, mode, lpath, rpath, mtime, compression, dry_run);
    }
    return sc.ReadAcknowledgements(sync);
}

传输策略:

  • 小文件(<64KB):一次读出、一次发送
  • 大文件(>=64KB):64KB 分块流式传输,可选用 Brotli / LZ4 / Zstd 压缩

4. daemon 端:设备上如何接收文件

4.1 服务入口

设备端 ADB daemon 通过下面这条路由开始处理 sync 请求(daemon/services.cpp:322):

} else if (name.starts_with("sync:")) {
    return create_service_thread("sync", file_sync_service);
}

4.2 主循环

// daemon/file_sync_service.cpp:861
void file_sync_service(unique_fd fd) {
    std::vector<char> buffer(SYNC_DATA_MAX);
    while (handle_sync_command(fd.get(), buffer)) {
    }
}

handle_sync_command() 根据协议 ID 分发到不同的处理函数。

5.3 文件接收 (handle_send_file)

// daemon/file_sync_service.cpp:347-414
static bool handle_send_file(borrowed_fd s, const char* path, uint32_t* timestamp,
                             uid_t uid, gid_t gid, uint64_t capabilities, mode_t mode,
                             CompressionType compression, bool dry_run,
                             std::vector<char>& buffer, bool do_unlink) {
    syncmsg msg;
    unique_fd fd;

    if (!dry_run) {
        // 安全审计日志
        __android_log_security_bswrite(SEC_TAG_ADB_SEND_FILE, path);

        // 创建目标文件 (O_EXCL 是原子性的)
        fd.reset(adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, mode));

        // 如果父目录不存在,自动创建目录 (同时应用 fs_config 权限)
        if (fd < 0 && errno == ENOENT) {
            if (!secure_mkdirs(Dirname(path))) {
                SendSyncFailErrno(s, "secure_mkdirs failed");
                goto fail;
            }
            fd.reset(adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL | O_CLOEXEC, mode));
        }

        // 设置文件所有者
        if (fchown(fd.get(), uid, gid) == -1) { /* ... */ }

        // 恢复 SELinux 上下文
        selinux_android_restorecon(path, 0);

        // 设置文件权限 (包含 setuid 位恢复)
        fchmod(fd.get(), mode);
    }

    // 接收并写入文件数据
    if (!handle_send_file_data(s, std::move(fd), timestamp, compression)) {
        goto fail;
    }

    // 更新文件 capabilities
    if (!update_capabilities(path, capabilities)) {
        SendSyncFailErrno(s, "update_capabilities failed");
        goto fail;
    }

    // 返回 ID_OKAY 给客户端
    msg.status.id = ID_OKAY;
    msg.status.msglen = 0;
    return WriteFdExactly(s, &msg.status, sizeof(msg.status));
    // ...
}

daemon 端处理 push 时会自动:

  1. secure_mkdirs:如果目标目录不存在,自动创建目录并按 fs_config 设置正确的权限和 SELinux 标签
  2. fchown:设置文件的 uid/gid
  3. selinux_android_restorecon:恢复文件的 SELinux 上下文
  4. fchmod:设置文件权限模式
  5. update_capabilities:更新文件的 Linux capabilities

这些操作确保 push 过去的文件具有正确的权限和安全标签,和 ROM 构建时完全一致。


5. 总结:完整链路回顾

在这里插入图片描述原文地址及更多安卓系统开发技巧:
https://mp.weixin.qq.com/s/oD7Kvxc3USqLEhK3odEnGA

YOLO模型从10MB瘦到2MB!剪枝+INT8量化双方案(精度损失<1%,附部署代码) 摘要:本文介绍了一种针对边缘设备的YOLO模型轻量化方案,通过"结构化剪枝+INT8量化"组合技术,将YOLOv8n模型从6.4MB压缩至2MB,体积减少68.75%,推理速度提升80%,同时保持精度损失小于1%。文章详细讲解了剪枝工具选择、通道剪枝实现、量化校准等关键步骤,并提供了完整的代码示例。特别强调了剪枝保留率、校准集使用、微调必要性等实践要点,帮助开发者在树莓派等资源受限设备上实现高效目标检测。 阅读详情

相关推荐

STM32F429移植LVGL9.3.0:从源码配置到双缓冲优化实战

本文详细介绍了如何在STM32F429平台上移植LVGL 9.3.0图形库,涵盖从源码准备、工程配置、显示驱动适配到双缓冲优化等关键步骤。重点解析了利用STM32F429的硬件特性实现高效内存管理和流畅显示性能的实战技巧,为嵌入式GUI开发提供完整解决方案。

q6r7s8t9的博客 1135

adb shell sync 命令和adb sync命令的区别

adb shell sync 命令和adb sync命令的区别 adb shell sync 命令: 1,在shell中执行 2,将内存缓冲区中的数据 写入到磁盘 adb sync 命令: 命令意思:同步更新/data/或/system/下的数据 命令用法:adb sync [directory] 如果不指定目录,将同步更新/data/和/system/ adb sync (将内存缓冲区的数据写入磁盘) 为了避免对硬盘的频繁读写,数据一般存放在缓冲区。 什么情况下会把缓冲区的数据写入到磁盘中?

thanklife的专栏 1万+

new delete 详解

常规的new 和 delete 当需要内存时,可以使用new申请内存,但在用完内存时应当使用delete 去归还内存,以防止内存泄漏,具体使用方案见下面代码: int* ps = new int ; // 使用new 申明变量空间 ... ... delete ps ; '// delete 删除所申明的变量空间 上述代码将删除ps 指针指向的内存空间,但不会删除指针本身,即仍然可以使用该指针去指向其他int 类型的变量。new 和 delete 一定需要成对的使用否则极易发生内存泄漏。 注意:不

qq_42138448的博客 6938

adb协议之sync服务

看了一下网络上翻译的sync.txt有点生硬。自己看了一遍原版的,做一下整理总结。 注:网上的翻译文章是“《MonkeyRunner源码剖析》ADB协议及服务: ADB协议概览SYNC.TXT翻译参考”。 同步模式 adb通信有普通模式和同步模式,在普通模式下给adb服务发送“sync:”指令后,adb服务以普通模式的协议答复“OKAY”或者“FAIL”,然后,adb和客户端之间的交互就进入同步模式。 接下来,sync.txt中表达了这么一个意思:进入同步模式后呢,adb服务和客户端之间交互接下来就

YT专栏 1739

企业网络架构设计:从内网到外网的无缝通信方案

本文详细解析了企业网络架构设计中的关键技术与实践方案,重点介绍了VLAN划分、OSPF路由优化、安全策略及无线网络集成等核心内容。通过OSPF多区域部署和链路聚合技术,实现内网到外网的无缝通信,提升企业网络性能与安全性。文章还提供了具体的配置示例和最佳实践,助力企业构建高效可靠的网络架构。

weixin_28331555的博客 624

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 357

探索高效文件同步工具:Google的adb-sync

在移动设备开发和调试过程中,我们常常需要频繁地在电脑与Android设备之间传输文件。传统的`adb push`命令虽然方便,但在处理大量文件或大文件时,效率并不理想。这时,谷歌推出的一个开源项目就显得尤为实用。本文将带你了解这个项目,分析其技术特性,并探讨如何利用它提升工作效率。 ## 项目简介 adb-sync是Google为Android开发者设计的一款快速文件同步工具,旨在替代adb的...

gitblog_00050的博客 861

CESM2 实验笔记

文章目录1. 重新启动1.1 关于重启文件2. RUN_TYPE 初始化运行方式startupbranchhybrid3. branch 或者 hybrid运行的示例4. 其他声明5. 关于RESUBMIT 1. 重新启动 参考: https://bb.cgd.ucar.edu/cesm/threads/how-to-restart-cesm2-1-3-fhist-from-a-backup.5245/#post-36275 适用情况:模型运行因时间不足或其它原因中断,需要继续运行 方法1:将CONTIN

qq_38607066的博客 1万+

Android 设备文件同步工具 adb-sync 常见问题解决方案

`adb-sync` 是一个开源项目,用于在PC和Android设备之间通过ADB(Android Debug Bridge)同步文件。这个项目可以帮助用户方便地管理设备上的文件,无论是在开发过程中还是日常使用中。该项目的主要编程语言是 Python。 ## 2. 新手常见问题及解决步骤 ### 问题一:如何设置ADB环境 **问题描述**:新手用户在尝试使用`adb-sync`时,可能会遇...

gitblog_00842的博客 788

【局部路径规划模块地图算法】基于势场地图的VFH、VFH+、VFH*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对基于地图的方法–VFH、VFH+、VFH*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 1686

2022年全国职业院校技能大赛高职组大数据技术与应用赛项赛卷⑩—解析答案

工业互联网是工业全要素、全产业链、全价值链的全面连接,是人、机、物、工厂互联互通的新型工业生产制造服务体系,是互联网从消费领域向生产领域、从虚拟经济向实体经济拓展的核心载体,是建设现代化经济体系、实现高质量发展和塑造全球产业竞争力的关键支撑。加快发展工业互联网产业,不仅是各国顺应产业发展大势,抢占产业未来制高点的战略选择,也是我国推动制造业质量变革、效率变革和动力变革,实现高质量发展的客观要求。 为完成工业大数据分析工作,你所在的小组将应用大数据技术,以Scala作为整个项目的基础开发语言,基于大数据平台综

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 582

推荐:adb-sync - 轻松实现PC与Android设备间文件同步的利器

**adb-sync** 是一款基于 Android Debug Bridge(ADB)的工具,用于在个人电脑和Android设备之间进行文件同步。然而请注意,此项目已不再维护,建议您转而使用 [better-adb-sync](https://github.com/jb2170/better-adb-sync),以获得更好的性能和功能。 ## 项目技术分析 adb-sync 利用了 ADB ...

gitblog_00090的博客 711

光学传播仿真软件:SPEOS_(14).建筑物内光环境仿真

在建筑物内光环境仿真中,材料属性的定义直接影响光的传播和反射效果。SPEOS提供了丰富的材料库,但也可以自定义材料属性以满足特定需求。创建新材料选择Materials->。输入材料名称和类型。配置材料属性选择材料对象,打开属性编辑器。设置反射率、透射率、表面粗糙度和颜色。# 导入SPEOS模块# 创建新材料# 配置材料属性custom_material.set_reflectivity(0.8) # 设置反射率为0.8。

kkchenjj的博客 1248

adb sync (将内存缓冲区的数据写入磁盘)

为了避免对硬盘的频繁读写,数据一般存放在缓冲区。 什么情况下会把缓冲区的数据写入到磁盘中? 1.通过调用fflush函数刷新缓冲区 2.缓冲区已满(8k) 3.正常关闭文件 调用fclose 主函数调用return 调用exit函数 adb -s ip:port shell sync 命令: 1.将内存缓冲区中的数据 写入到磁盘 2.如果不指定目录,将同步更新/data/和/system/ ...

在服务器上挂载OSS_bucket 1125

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

adb-sync 项目使用教程

adb-sync 是一个用于在 PC 和 Android 设备之间同步文件的工具,基于 ADB(Android Debug Bridge)。以下是该项目的目录结构及其介绍: ``` adb-sync/ ├── LICENSE ├── README.md ├── adb-sync ├── adb-sync-backup └── adb-sync-restore ``` - **LICENSE**...

gitblog_00765的博客 584

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Android ADB 常用使用指令

##ADB调试妙用: 1. 基本用法 1.1 adb 等待设备连接: #adb wait-for-device eg://windows运行工具指令如下: 识别并连接设备后输出devices信息 #adb wait-for-device #adb devices 1.2 重启adb #adb kill-server #adb start-server 1.3 修改权限 #adb root //获取root权限...

静虚待令,有物混成 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

adb pull --sync 支持增量拉取设备文件到本地(windows版本adb),adb pull 增量同步命令使用方法

第一步:下载已编译好的支持adb pull --sync 功能的adb程序,下载链接:https://download.youkuaiyun.com/download/chabb/13459877 第二步:将下载的zip压缩包解压到自己硬盘的某个目录,如 D:\adb\ 第三步:将解压出来的三个文件(adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll)全部拷贝到 C:\windows\system32\目录下;或者 将adb解压后的目录添加到环节变量的PATH变量下; 添加到环境变量的方

chabb的专栏 2885

Better ADB Sync 使用教程

Better ADB Sync 使用教程 1. 项目介绍 Better ADB Sync 是一个类似于 rsync 的程序,用于在计算机和 Android 设备之间同步文件。该项目是对 Google 的 adbsync 的重写,主要目的是: 更新代码风格以适应 Python 3。 增加 --exclude、--exclude-from、--del 和 --delete-excluded 等参数,...

gitblog_00176的博客 877

Android adb sync同步分区

adb root;adb remount;export ANDROID_PRODUCT_OUT=out/target/product/$target_project;adb sync ps : 这个方法只能针对 remount 成功之后的软件,而且每次 new/remake 之后的软件都会需要sync很多的文件,从而导致空间不足sync不成功的问题,所以一般模块编译的时候可以使用,因为不需要指定push的文件和目标位置一股脑儿的全部push,可以很方便的集成到一键编译push脚本。new/remake 之

zhangqi6627的专栏 1456

Google AdbSync: 文件高效同步利器

AdbSync 是谷歌开发的一个开源项目,旨在提高Android设备与主机之间的文件同步效率。相比传统的 `adb push` 和 `adb pull` 命令,AdbSync 优化了大量文件或大文件传输过程,显著提升了速度,尤其适用于频繁的开发调试场景。 ## 2. 项目快速启动 ### 安装依赖 确保你已经安装了以下基础软件: - Git - Android SDK 并配置好 `$ANDRO...

gitblog_00547的博客 582

Android adb常用50条命令

文件相关 ls 查看文件 ls 查看隐藏文件ls -a 查看文件的属性ls -al 根据文件修改时间排序查看文件ls -t 通配符查看 ls *.apk 查看所有以apk结尾的文件 df du 这两个命令通常我们可以查看磁盘的 ...

阳龙的移动互联天地 2975

adb常用命令

https://blog.youkuaiyun.com/weixin_40811410/article/details/82015773 一、ADB命令(电脑上操作的命令) ADB常用命令: 1. 查看设备: 查看当前连接的设备, adb devices 2. 安装软件:将指定的apk文件安装到设备上 adb install <apk文件路径> 如: adb install com.sin...

jgw2008的专栏 2450

adb的常用操作

目录 查看设备 查看版本 安装卸载apk 安装 2、卸载 接收电脑文件、上传文件到电脑 1、接收电脑文件 2、上传文件 adb shell 1、操作数据库 没有root权限是无法操作数据库的 2、使用adb进行屏幕录像 3、截屏 4、输入文本 我在QQ的腾讯新闻的输入框中:输入以下3个文字,截屏,把截屏导入D盘​ 5、退出adb shell 同步更新 显示...

FengNingXueChen的博客 1420

adb pull --sync 增量同步工具介绍

adb pull --sync 增量同步工具介绍 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一个经过修改的adb(Android Debug Bridge)工具,该工具为Windows版本,支持使用adb pull --sync命令进行增量拉取设备文件到本地电脑。此功能是为了解决官方adb工具在pull操作时不支持增量同步的局限性,从而优化开发者和用户在文件同步...

gitblog_06743的博客 393

adb -- 英文版最全命令解释

adb使用方法    -d                            - directs command to the only connected USB device                                  returns an error if more than one USB device is present.    -e

zheng_he_xiang鸟哥的专栏 1492

adbpull--sync增量同步工具介绍:优化文件同步效率,释放开发者时间

adbpull--sync增量同步工具介绍:优化文件同步效率,释放开发者时间 去发现同类优质开源项目:https://gitcode.com/ Android开发者常常面临的一个问题是文件同步效率低下。传统的ADB工具虽然功能强大,但在处理大量文件同步时,往往由于全量同步的特性而导致效率不高。今天,我们为您推荐一款经过修改的ADB工具——adbpull--sync,它支持增量同步功能,大大提升同步...

gitblog_06777的博客 1022
上一篇: 安卓车载手机原生多屏闪黑问题分析及修复成果展示
下一篇: 重学Perfetto浏览器在线抓取trace及高频sql分享
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值