Kivy a to Z -- 一个简单的通过adb同步Android系统文件的工具

来兴趣时写了些Kivy的代码,调试却总感觉不是很方便。直接打包到public.mp3的方式太繁锁,用文件共享的软件又发现没有一个好用的,

用samba filesharing本来也只是慢,但是更新的版本之后就一直提示说wifi没有tethering,意思是wifi热点没有打开,但是打开了还是提示没有tethering。

找了个叫什么卓*力的文件管理器,下载了samba插件后输入用户名和密码死活不对,被搞得实在恼火,花了点时间写了个通过adb同步安卓文件的工具,用着也挺爽的。


事件为什么总是要搞得这么复杂呢?简简单单多好?愚蠢的人类啊。


sync.py

import os
from os.path import join, getsize
import pickle
import subprocess

file_info = None

def compile_source():
    for root, dirs, files in os.walk('.'):
        for f in files:
            if f in ['sync.py','dump.pkl']:
                continue
            if not f.endswith('.py'):
                continue
            p = join(root,f)
            size = os.path.getsize(p)
            fstat = os.stat(p)
            info = (size,fstat.st_mtime)
            if p in file_info and  info == file_info[p]:
                if os.path.exists(p.replace('.py','.pyo')):
                    continue
            print 'compile ',p
            print subprocess.check_output('python -OO -m py_compile '+p)

def sync_source():
    for root, dirs, files in os.walk('.'):
        for f in files:
            if f in ['sync.py','sync.pyo','dump.pkl']:
                continue
#            if f.endswith('.py'):
#                continue
            p = join(root,f)
            size = os.path.getsize(p)
            fstat = os.stat(p)
            info = (size,fstat.st_mtime)
            if p in file_info and  info == file_info[p]:
                    continue
            file_info[p] = info
            root_dir = '/mnt/sdcard/kivy/'
#            root_dir = '/mnt/shell/emulated/0/org.test.kivycatalog'
            cmd = ['adb','push',p,join(root_dir,p[2:].replace('\\','/'))]
            print ' '.join(cmd)
            print subprocess.check_output(cmd)
    
    with open('dump.pkl','wb') as f:
        pickle.dump(file_info,f)

if __name__ == '__main__':
    try:
        with open('dump.pkl','rb') as f:
            file_info = pickle.load(f)
    except Exception,e:
        print e
        file_info = {}
    
    compile_source()
    sync_source()


把sync.py放到代码的根目录,执行,会自动把PC端已经修改的文件同步到安卓端,类似输出如下:


./sync.py

compile  .\main.py


adb push .\main.py /mnt/sdcard/kivy/main.py
406 KB/s (5839 bytes in 0.014s)

adb push .\main.pyo /mnt/sdcard/kivy/main.pyo
403 KB/s (5372 bytes in 0.013s)


补充:


发现adb已经提供了同步的命令:sync,用法如下:


指定同步的目录,该目录包含system或者data目录:
set ANDROID_PRODUCT_OUT=.\android


同步 system和data目录:
adb sync


只同步system目录:
adb sync system


只同步data目录:
adb sync data



从上面也可以看到,adb sync只能同步data和system目录,所以本脚本还是有利用价值的。


你可能感兴趣的:(python,文件同步)