来兴趣时写了些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目录,所以本脚本还是有利用价值的。