(1)新建python文件,命令为pushso1.py

(2)新建一个bat文件,命名为pushso1.bat

(3)新建一个txt文件,命名为latest_so_file.txt,为空即可

 

pushso1.py:

#################################################################################
#
# 脚本功能:将编译完成的Android 手机 so 文件push进手机,
#          并具有记忆功能,使用时会提示是否需要push上一次的so文件
#          push so完成后会自动杀进程
#
# 使用方法:
#     1 电脑连接手机,使用如下两种方式运行脚本
#     2 ubuntu电脑:命令行:python pushso1.py
#     3 windows电脑:除上述方法外,还可以双击运行配套的pushso1.bat脚本文件
# 备注:使用此脚本需要创建一个latest_so_file.txt文件,此文件会保存上一次push进手机的so文件路径
#
#################################################################################

import os
import sys
lst=[] #保存即将push的so文件及路径

#################################################################################
#
# 功能:若用户需要输入上次的so文件,会先读取latest_so_file.txt文件,并将so文件存放在lst中
#
# 实现:
#     1 用户第一次pushso只能用新输入,不能选择此项(除非第一此手动将so文件先存放在该txt文件中)
#
#################################################################################
def input_latest_so():
    current_file_path = os.path.abspath(__name__)
    upfilePath = os.path.dirname(current_file_path)
    with open("latest_so_file.txt", "r") as f:
        for line in f.readlines():
            line = line.strip('\n')  #去掉列表中每一个元素的换行符
            lst.append(line)
            print(line)


#################################################################################
#
# 功能:读取用户输入的多个so文件,并存放在lst文件中,并将这些so文件中
#
# 实现:
#     1 用户可以将so文件直接拖入命令行,每次输入以enter间隔,两次enter键结束输入(一次以为还需要输入,另一次结束输入)
#
#################################################################################
def input_new_so():
    print('input so file, press Enter to continue:')
    while True:
        temp = input()
        if temp == '':
            break
        lst.append(temp)
    current_file_path = os.path.abspath(__name__)
    upfilePath = os.path.dirname(current_file_path)
    with open("latest_so_file.txt","w") as f:
        for i in lst:
            f.write(i)  # 自带文件关闭功能,不需要再写f.close()
            f.write('\n')


#################################################################################
#
# 功能:读取lst文件中包含的so文件,并push进手机
#
# 实现:
#     1 读取每行的输入,找到so文件的父级目录,判断是需要push进手机的哪个目录
#
#################################################################################
def push_so(lst):
    print('\npush so start!')
    for i in lst:
        print(i)
        file = i #获取文件路径,eg: D:\\r_trunk\\vendor\\lib\\hw\\libcamoem.so
        filePath = os.path.dirname(file) #获取文件的父级目录,eg: D:\\r_trunk\\vendor\\lib\\hw
        upfilePath = os.path.dirname(filePath) #获取文件的父级的父级目录,eg: D:\\r_trunk\\vendor\\lib
        upfileName = file[len(upfilePath)+1:len(filePath)] #获取文件的父级的父级目录名称,eg: hw
        if upfileName == 'hw':
            cmd = "adb push " +file+ " /vendor/lib/hw/"
        else:
            cmd = "adb push " +file+ " /vendor/lib/"
        
        os.system(cmd)


#################################################################################
#
# 功能:读取一个字符,判断是不是数字
#
# 实现:
#     1 
#
#################################################################################
def is_number(s):
    try:
        float(s)
        return True
    except ValueError:
        pass
    try:
        import unicodedata
        unicodedata.numeric(s)
        return True
    except (TypeError, ValueError):
        pass
    return False


#################################################################################
#
# 功能:杀手机进程
#
# 实现:
#     1 找到正在运行的camera server 的进程线程,进而找到该进程,然后杀掉
#
#################################################################################
def kill_server():
    print("\nkill camera server start!")
    cmd = "adb shell ps -A | find \"android.hardware.camera.provider@2.4-service\""
    lala = os.popen(cmd).readlines()

    length = len(lala)
    if 0 == length:
        print("android.hardware.camera.provider@2.4-service not exist, kill failed!")
    else:
        print("中间过程: "+lala[0])
        pid = 0
        for i in lala[0].split(" "):
            if is_number(i):
                pid = int(i)
                break

        if pid == 0:
            print("no pid")
            return

        cmd = "adb root"
        os.system(cmd)

        cmd = "adb remount"
        os.system(cmd)

        cmd = "adb shell kill -9 "+str(pid)
        os.system(cmd)

        print("kill android.hardware.camera.provider@2.4-service done!")
        

#################################################################################
#
# 功能:获取手机权限,询问是push上一次的so还是新的so文件
#
# 实现:
#     1 adb root & adb remount后,根据条件判断选择调用哪个函数,最后push 所需的so
#
#################################################################################
def start():
    cmd = "adb root"
    os.system(cmd)

    cmd = "adb remount"
    os.system(cmd)

    print('push latest so file ?')
    print('-press Enter to continue')
    print('-press any other key to push new so')
    temp = input()
    if temp == '':
        input_latest_so()
    else:
        input_new_so()  

    push_so(lst)

    print("push so done!")

    kill_server()
    


if __name__ == "__main__":
    start()

 

pushso1.bat

@echo off

python D:\\py\\pushso1.py

ping -n 3 127.0.0.1>nul
rem pause