def copy_android_driver(device_id='', force=False): '''测试前的测试桩拷贝 ''' import os from adb import ADB if not device_id: device_list = ADB.list_device() device_list = [dev for dev in device_list if dev[1] == 'device'] if len(device_list) == 0: raise RuntimeError('当前没有插入手机') elif len(device_list) == 1: device_id = device_list[0][0] elif len(device_list) > 1: i = 0 text = '当前设备列表:\n' for dev in device_list: # if dev[1] != 'device': continue i += 1 text += '%d. %s\n' % (i, dev[0]) print text while True: result = raw_input('请输入要拷贝测试桩的设备序号:') if result.isdigit(): if int(result) > len(device_list): print >> sys.stderr, '序号范围为: [1, %d]' % len(device_list) time.sleep(0.1) continue device_id = device_list[int(result) - 1][0] else: if not result in [dev[0] for dev in device_list]: print >> sys.stderr, '设备序列号不存在: %r' % result time.sleep(0.1) continue device_id = result break print '您将向设备"%s"拷贝测试桩……' % device_id adb = ADB.open_device(device_id) cur_path = os.path.dirname(os.path.abspath(__file__)) dst_path = '/data/local/tmp/qt4a/' current_version_file = os.path.join(cur_path, 'tools', 'version.txt') f = open(current_version_file, 'r') vurrent_version = int(f.read()) f.close() if not force: version_file = dst_path + 'version.txt' version = adb.run_shell_cmd('cat %s' % version_file) if version and not 'No such file or directory' in version and vurrent_version <= int(version): # 不需要拷贝测试桩 if not adb.get_package_path('com.test.qt4amockapp'): logger.warn('install QT4AMockApp') adb.install_apk(os.path.join(cur_path, 'tools', 'QT4AMockApp.apk')) logger.warn('忽略本次测试桩拷贝:当前版本为%s,设备中版本为%s' % (vurrent_version, version)) return if not adb.is_rooted(): result = adb.run_shell_cmd('id', True) if not 'uid=0(root)' in result: raise RuntimeError('设备未root:%s' % result) cpu_abi = adb.get_cpu_abi() print '当前系统的CPU架构为:%s' % cpu_abi use_pie = False if adb.get_sdk_version() >= 21: use_pie = True file_list = [os.path.join(cpu_abi, 'inject'), os.path.join(cpu_abi, 'libdexloader.so'), os.path.join(cpu_abi, 'setpropex'), os.path.join(cpu_abi, 'libandroidhook.so'), 'AndroidSpy.jar', 'androidhook.jar', 'SpyHelper.jar', 'SpyHelper.sh'] if adb.is_selinux_opened(): # 此时如果还是开启状态说明关闭selinux没有生效,主要是三星手机上面 adb.run_shell_cmd('chcon u:object_r:shell_data_file:s0 %slibdexloader.so' % dst_path, True) # 恢复文件context,否则拷贝失败 adb.run_shell_cmd('chcon u:object_r:shell_data_file:s0 %slibandroidhook.so' % dst_path, True) for file in file_list: file_path = os.path.join(cur_path, 'tools', file) if use_pie and not '.' in file: file_path += '_pie' adb.push_file(file_path, dst_path + os.path.split(file)[-1]) dst_dir = dst_path[:dst_path.rfind('/')] # adb.run_shell_cmd('chmod 777 %s' % dst_dir, True) # logger.info(adb.run_shell_cmd('chmod 777 %sinject' % (dst_path), True)) adb.chmod('%sinject' % dst_path, 777) # adb.run_shell_cmd('chmod 777 %sAndroidSpy.jar' % (dst_path), True) try: print adb.run_shell_cmd('rm -R %scache' % dst_path, True) # 删除目录 rm -rf except RuntimeError, e: logger.warn('%s' % e)
def copy_android_driver(device_id_or_adb, force=False, root_path=None, enable_acc=True): '''测试前的测试桩拷贝 ''' from adb import ADB from util import AndroidPackage, version_cmp if isinstance(device_id_or_adb, ADB): adb = device_id_or_adb else: adb = ADB.open_device(device_id_or_adb) if not root_path: current_path = os.path.abspath(__file__) if not os.path.exists(current_path) and '.egg' in current_path: # in egg egg_path = current_path while not os.path.exists(egg_path): egg_path = os.path.dirname(egg_path) assert (egg_path.endswith('.egg')) root_path = os.path.join(tempfile.mkdtemp(), 'tools') extract_from_zipfile(egg_path, 'qt4a/androiddriver/tools', root_path) else: root_path = os.path.join( os.path.dirname(os.path.abspath(__file__)), 'tools') dst_path = '/data/local/tmp/qt4a/' current_version_file = os.path.join(root_path, 'version.txt') f = open(current_version_file, 'r') current_version = int(f.read()) f.close() if not force: version_file = dst_path + 'version.txt' version = adb.run_shell_cmd('cat %s' % version_file) if version and not 'No such file or directory' in version and current_version <= int( version): # 不需要拷贝测试桩 logger.warn('忽略本次测试桩拷贝:当前版本为%s,设备中版本为%s' % (current_version, version)) return try: adb.chmod(dst_path[:-1], '777') except: pass rooted = adb.is_rooted() cpu_abi = adb.get_cpu_abi() print('Current CPU arch:%s' % cpu_abi) use_pie = False if adb.get_sdk_version() >= 21 and cpu_abi != 'arm64-v8a': use_pie = True file_list = [ os.path.join(cpu_abi, 'droid_inject'), os.path.join(cpu_abi, 'libdexloader.so'), os.path.join(cpu_abi, 'screenkit'), os.path.join(cpu_abi, 'libandroidhook.so'), 'inject', 'AndroidSpy.jar', 'SpyHelper.jar', 'SpyHelper.sh' ] if cpu_abi == 'arm64-v8a': file_list.append(os.path.join(cpu_abi, 'droid_inject64')) file_list.append(os.path.join(cpu_abi, 'libdexloader64.so')) file_list.append('inject64') if adb.get_sdk_version() >= 21: file_list.append(os.path.join(cpu_abi, 'libandroidhook_art.so')) if rooted and adb.is_selinux_opened(): # 此时如果还是开启状态说明关闭selinux没有生效,主要是三星手机上面 adb.run_shell_cmd('rm -r %s' % dst_path, True) # adb.run_shell_cmd('chcon u:object_r:shell_data_file:s0 %slibdexloader.so' % dst_path, True) # 恢复文件context,否则拷贝失败 # adb.run_shell_cmd('chcon u:object_r:shell_data_file:s0 %slibandroidhook.so' % dst_path, True) for file in file_list: file_path = os.path.join(root_path, file) if use_pie and not '.' in file and os.path.exists(file_path + '_pie'): file_path += '_pie' if not os.path.exists(file_path): continue save_name = os.path.split(file)[-1] if save_name.endswith('_art.so'): save_name = save_name.replace('_art', '') adb.push_file(file_path, dst_path + save_name) adb.chmod('%sdroid_inject' % dst_path, 755) adb.chmod('%sinject' % dst_path, 755) adb.chmod('%sscreenkit' % dst_path, 755) adb.run_shell_cmd('ln -s %sscreenkit %sscreenshot' % (dst_path, dst_path)) if cpu_abi == 'arm64-v8a': adb.chmod('%sdroid_inject64' % dst_path, 755) adb.chmod('%sinject64' % dst_path, 755) try: print adb.run_shell_cmd('rm -R %scache' % dst_path, rooted) # 删除目录 rm -rf except RuntimeError, e: logger.warn('%s' % e)
def adb(self): if self._adb == None: from adb import ADB self._adb = ADB.open_device(self._device_id) return self._adb