├── AppFa.py ├── AppV2.py └── README.md /AppFa.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | @File : AppFa.py 4 | @Time : 2021/11/8 17:39 5 | @Author : Jingmo 6 | @Software: PyCharm 7 | """ 8 | import os 9 | import tkinter 10 | from threading import Thread 11 | from tkinter import ttk, messagebox 12 | from tkinter.filedialog import askopenfilename 13 | 14 | 15 | def exio(): 16 | os.popen('adb kill-server') 17 | os.popen(f'taskkill /f /im adb.exe') 18 | os.popen(f'taskkill /f /im cmd.exe') 19 | 20 | 21 | def delButton(tree): 22 | x = tree.get_children() 23 | for item in x: 24 | tree.delete(item) 25 | 26 | 27 | def disanfang(): 28 | delButton(tree) 29 | app_all_list = os.popen('adb shell pm list packages -3').read() 30 | apps_list = app_all_list.split('package:') 31 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 32 | ind = 0 33 | for i in app_list: 34 | appname = os.popen(f'adb shell pm path {i}').read().split('/')[-1] 35 | ind += 1 36 | tree.insert("", ind, text=f"{ind}", values=(ind, appname, i)) # #给第0行添加数据,索引值可重复 37 | 38 | 39 | def xitongyinyong(): 40 | delButton(tree) 41 | app_all_list = os.popen('adb shell pm list packages -s').read() 42 | apps_list = app_all_list.split('package:') 43 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 44 | ind = 0 45 | for i in app_list: 46 | appname = os.popen(f'adb shell pm path {i}').read().split('/')[-1] 47 | ind += 1 48 | tree.insert("", ind, text=f"{ind}", values=(ind, appname, i)) # #给第0行添加数据,索引值可重复 49 | 50 | 51 | def qiyong(): 52 | delButton(tree) 53 | app_all_list = os.popen('adb shell pm list packages -e').read() 54 | apps_list = app_all_list.split('package:') 55 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 56 | ind = 0 57 | for i in app_list: 58 | appname = os.popen(f'adb shell pm path {i}').read().split('/')[-1] 59 | ind += 1 60 | tree.insert("", ind, text=f"{ind}", values=(ind, appname, i)) # #给第0行添加数据,索引值可重复 61 | 62 | 63 | def tinyong(): 64 | delButton(tree) 65 | app_all_list = os.popen('adb shell pm list packages -d').read() 66 | apps_list = app_all_list.split('package:') 67 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 68 | ind = 0 69 | for i in app_list: 70 | appname = os.popen(f'adb shell pm path {i}').read().split('/')[-1] 71 | ind += 1 72 | tree.insert("", ind, text=f"{ind}", values=(ind, appname, i)) # #给第0行添加数据,索引值可重复 73 | 74 | 75 | def suoyouyinyong(): 76 | delButton(tree) 77 | app_all_list = os.popen('adb shell pm list packages').read() 78 | apps_list = app_all_list.split('package:') 79 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 80 | ind = 0 81 | for i in app_list: 82 | appname = os.popen(f'adb shell pm path {i}').read().split('/')[-1] 83 | ind += 1 84 | tree.insert("", ind, text=f"{ind}", values=(ind, appname, i)) # #给第0行添加数据,索引值可重复 85 | 86 | 87 | def biaoge(get_xaunze_): 88 | # ('第三方应用', '系统应用', '已启用的应用', '已停用的应用', '所有应用包名') 89 | if get_xaunze_ == "第三方应用": 90 | disanfang() 91 | 92 | if get_xaunze_ == "系统应用": 93 | xitongyinyong() 94 | 95 | if get_xaunze_ == "已启用的应用": 96 | qiyong() 97 | 98 | if get_xaunze_ == "已停用的应用": 99 | tinyong() 100 | 101 | if get_xaunze_ == "所有应用包名": 102 | suoyouyinyong() 103 | 104 | 105 | def zhiing_star(): 106 | Thread(target=zhixing_).start() 107 | 108 | 109 | def zhixing_(): 110 | def zhixing_star(app_pkg): 111 | get_cmb = cmb.get() 112 | if get_cmb == "卸载": 113 | # adb shell pm uninstall[-k][--user USER_ID] 包名 114 | # -k 卸载应用且保留数据与缓存,如果不加 - k 则全部删除。 115 | # –user指定用户 id,Android系统支持多个用户,默认用户只有一个,id = 0。 116 | a1 = messagebox.askokcancel('提示', f'确认卸载:{app_pkg}') 117 | if a1 == True: 118 | cmd_0 = f"adb shell pm uninstall --user 0 {app_pkg}" 119 | print(cmd_0) 120 | os.popen(cmd_0) 121 | 122 | if get_cmb == "停用": 123 | a2 = messagebox.askokcancel('提示', f'确认停用:{app_pkg}') 124 | if a2 == True: 125 | cmd_1 = f"adb shell pm disable-user {app_pkg}" 126 | print(cmd_1) 127 | os.popen(cmd_1) 128 | 129 | if get_cmb == "启用": 130 | # 列出所有停用名单 131 | # adb shell pm list packages -d 132 | a3 = messagebox.askokcancel('提示', f'确认启用:{app_pkg}') 133 | if a3 == True: 134 | cmd_2 = f"adb shell pm enable -d {app_pkg}" 135 | print(cmd_2) 136 | os.popen(cmd_2) 137 | try: 138 | for item in tree.selection(): 139 | item_text = tree.item(item, "values") 140 | print(item_text[2]) # 输出所选行的第一列的值 141 | Thread(target=zhixing_star, args=(item_text[2],)).start() 142 | except: 143 | messagebox.askokcancel('错误', "请在【表格中】选择需要执行操作的项目") 144 | 145 | 146 | def chaxun(): 147 | delButton(tree) 148 | os.popen(f'taskkill /f /im cmd.exe') 149 | get_xaunze_ = xaunze_.get() 150 | Thread(target=biaoge, args=(get_xaunze_,)).start() 151 | 152 | 153 | def stare_app(): 154 | delButton(tree) 155 | xuliehao = os.popen('adb devices').read() 156 | phone = os.popen('adb shell getprop ro.product.model').read() 157 | lianjie = messagebox.askokcancel('链接 提示', 158 | phone + xuliehao + 159 | "显示【手机型号】和【序列号】点击确认即可\n否则请开启手机【USb调试】相关功能, 正确链接手机\n点击取消 退出程序") 160 | if lianjie == False: 161 | root.destroy() 162 | exit() 163 | get_xaunze_ = xaunze_.get() 164 | Thread(target=biaoge, args=(get_xaunze_,)).start() 165 | 166 | 167 | def jiangjianzuhang(): 168 | def jiangjianzhuang_star(): 169 | delButton(tree) 170 | os.popen(f'taskkill /f /im cmd.exe') 171 | apk = askopenfilename(title='选择需要安装的文件 [ apk ]', initialdir='/', filetypes=[('Android File', '*.apk')]) 172 | apkinfo = os.popen(f'adb install -r -d {apk}').read() 173 | messagebox.askokcancel('显示 success 则表示安装完成', f'{apkinfo}') 174 | Thread(target=jiangjianzhuang_star).start() 175 | 176 | 177 | if __name__ == '__main__': 178 | os.popen('mode con cols=50 lines=10') 179 | try: 180 | root = tkinter.Tk() 181 | root.title("ADB手机应用管理工具") # #窗口标题 182 | root.geometry("700x400+700+200") # #窗口位置500后面是字母x 183 | root.resizable(False, False) 184 | 185 | # 表格 186 | tree = ttk.Treeview(root, height=10, show="headings", ) # #创建表格对象 187 | tree["columns"] = ("序号", "安装包(参考)", "包名") # #定义列 188 | tree.column("序号", width=60) # #设置列 189 | tree.column("安装包(参考)", width=280) 190 | tree.column("包名", width=360) 191 | 192 | tree.heading("序号", text="序号") # #设置显示的表头名 193 | tree.heading("安装包(参考)", text="安装包(应用名仅供参考无法准确获取)") 194 | tree.heading("包名", text="应用包名-讲道理,全部无误") 195 | 196 | VScroll1 = ttk.Scrollbar(tree, orient='vertical', command=tree.yview) 197 | VScroll1.place(relx=0.971, rely=0.028, relwidth=0.024, relheight=0.958) 198 | # 给treeview添加配置 199 | tree.configure(yscrollcommand=VScroll1.set) 200 | tree.place(x=0, y=60) 201 | 202 | # 创建下拉菜单 203 | xaunze_ = ttk.Combobox(root, font=('微软雅黑', 14), width=14, state="readonly") 204 | # 设置下拉菜单中的值 205 | xaunze_['value'] = ('第三方应用', '系统应用', '已启用的应用', '已停用的应用', '所有应用包名') 206 | # 设置默认值,即默认下拉框中的内容 207 | xaunze_.current(0) 208 | xaunze_.place(x=20, y=10) 209 | 210 | # 创建下拉菜单 211 | cmb = ttk.Combobox(root, font=('微软雅黑', 14), width=8, state="readonly") 212 | # 设置下拉菜单中的值 213 | cmb['value'] = ('卸载', '停用', '启用') 214 | # 设置默认值,即默认下拉框中的内容 215 | cmb.current(1) 216 | cmb.place(x=40, y=320) 217 | 218 | zhixing = tkinter.Button(root, text="↑ 执行", font=('微软雅黑', 12), width=10, command=zhiing_star) 219 | zhixing.config(fg="red", bg="white") 220 | zhixing.place(x=160, y=314) 221 | 222 | jiangji = tkinter.Button(root, text="降级安装(保留数据)", font=('微软雅黑', 12), command=jiangjianzuhang) 223 | jiangji.config(fg="black", bg="white") 224 | jiangji.place(x=500, y=310) 225 | 226 | jieshu = tkinter.Button(root, text="关闭ADB服务", font=('微软雅黑', 12), command=exio) 227 | jieshu.config(fg="black", bg="white") 228 | jieshu.place(x=580, y=10) 229 | 230 | chaxunde_ = tkinter.Button(root, text="查询", font=('微软雅黑', 12), command=stare_app()) 231 | chaxunde = tkinter.Button(root, text="查询", font=('微软雅黑', 12), width=10, command=chaxun) 232 | chaxunde.config(fg="green", bg="white") 233 | chaxunde.place(x=240, y=10) 234 | 235 | root.mainloop() 236 | finally: 237 | exio() 238 | -------------------------------------------------------------------------------- /AppV2.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | @File : AppV2.py 4 | @Time : 2021/11/10 14:44 5 | @Author : Jingmo 6 | @Software: PyCharm 7 | """ 8 | 9 | import os 10 | import tkinter 11 | from threading import Thread 12 | from tkinter import ttk, messagebox 13 | from tkinter.filedialog import askopenfilename 14 | 15 | 16 | # 服务管理 17 | def exio(): 18 | os.popen('adb kill-server') 19 | os.popen(f'taskkill /f /im adb.exe') 20 | os.popen(f'taskkill /f /im cmd.exe') 21 | 22 | 23 | # 表格内容清空 24 | def delButton(tree): 25 | x = tree.get_children() 26 | for item in x: 27 | tree.delete(item) 28 | 29 | 30 | # 下拉列表框打印列表功能 31 | def chaxun_biaoge_star(get_xaunze_): 32 | def disanfang(): 33 | delButton(tree) 34 | app_all_list = os.popen('adb shell pm list packages -3').read() 35 | apps_list = app_all_list.split('package:') 36 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 37 | ind = 0 38 | for i_app_pkg in app_list: 39 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 40 | ind += 1 41 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 42 | 43 | def xitongyinyong(): 44 | delButton(tree) 45 | app_all_list = os.popen('adb shell pm list packages -s').read() 46 | apps_list = app_all_list.split('package:') 47 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 48 | ind = 0 49 | for i_app_pkg in app_list: 50 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 51 | ind += 1 52 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 53 | 54 | def qiyong(): 55 | delButton(tree) 56 | app_all_list = os.popen('adb shell pm list packages -e').read() 57 | apps_list = app_all_list.split('package:') 58 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 59 | ind = 0 60 | for i_app_pkg in app_list: 61 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 62 | ind += 1 63 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 64 | 65 | def tinyong(): 66 | delButton(tree) 67 | app_all_list = os.popen('adb shell pm list packages -d').read() 68 | apps_list = app_all_list.split('package:') 69 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 70 | ind = 0 71 | for i_app_pkg in app_list: 72 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 73 | ind += 1 74 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 75 | 76 | def suoyouyinyong(): 77 | delButton(tree) 78 | app_all_list = os.popen('adb shell pm list packages').read() 79 | apps_list = app_all_list.split('package:') 80 | app_list = [x.strip() for x in apps_list if x.strip() != ''] 81 | ind = 0 82 | for i_app_pkg in app_list: 83 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 84 | ind += 1 85 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 86 | 87 | # ('第三方应用', '系统应用', '已启用的应用', '已停用的应用', '所有应用包名') 88 | if get_xaunze_ == "第三方应用": 89 | Thread(target=disanfang).start() 90 | 91 | if get_xaunze_ == "系统应用": 92 | Thread(target=xitongyinyong).start() 93 | 94 | if get_xaunze_ == "已启用的应用": 95 | Thread(target=qiyong).start() 96 | 97 | if get_xaunze_ == "已停用的应用": 98 | Thread(target=tinyong).start() 99 | 100 | if get_xaunze_ == "所有应用包名": 101 | Thread(target=suoyouyinyong).start() 102 | 103 | 104 | # 依据列表内容执行下拉列表功能 105 | def zhixing_star(): 106 | def zhixing_(app_pkg): 107 | get_cmb = cmb.get() 108 | if get_cmb == "卸载": 109 | # adb shell pm uninstall[-k][--user USER_ID] 包名 110 | # -k 卸载应用且保留数据与缓存,如果不加 - k 则全部删除。 111 | # –user指定用户 id,Android系统支持多个用户,默认用户只有一个,id = 0。 112 | a1 = messagebox.askokcancel('提示', f'确认卸载:{app_pkg}') 113 | if a1 == True: 114 | cmd_0 = f"adb shell pm uninstall --user 0 {app_pkg}" 115 | print(cmd_0) 116 | os.popen(cmd_0) 117 | 118 | if get_cmb == "停用": 119 | a2 = messagebox.askokcancel('提示', f'确认停用:{app_pkg}') 120 | if a2 == True: 121 | cmd_1 = f"adb shell pm disable-user {app_pkg}" 122 | print(cmd_1) 123 | os.popen(cmd_1) 124 | 125 | if get_cmb == "启用": 126 | # 列出所有停用名单 127 | # adb shell pm list packages -d 128 | a3 = messagebox.askokcancel('提示', f'确认启用:{app_pkg}') 129 | if a3 == True: 130 | cmd_2 = f"adb shell pm enable -d {app_pkg}" 131 | print(cmd_2) 132 | os.popen(cmd_2) 133 | 134 | if str(len(tree.selection())) != "0": 135 | for items in tree.selection(): 136 | item_text = tree.item(items, "values")[1] 137 | print("已选择:" + item_text) # 输出所选行的第一列的值 138 | th_app = messagebox.askokcancel('提示', f"确认对 {item_text} 执行操作?") 139 | if th_app == True: 140 | Thread(target=zhixing_, args=(item_text,)).start() 141 | else: 142 | messagebox.showinfo('提示', "没有对任何应用进行操作!") 143 | 144 | 145 | # 查询函数 146 | def chaxun_star(): 147 | delButton(tree) 148 | get_xaunze_ = xaunze_.get() 149 | Thread(target=chaxun_biaoge_star, args=(get_xaunze_,)).start() 150 | 151 | 152 | # 搜索函数 153 | def sousuo_star(): 154 | def in_suosuo_(get_ent): 155 | delButton(tree) 156 | chaxun_app_list = os.popen(f'adb shell pm list packages | findstr "{get_ent}"').read() 157 | c_apps_list = chaxun_app_list.split('package:') 158 | app_list = [x.strip() for x in c_apps_list if x.strip() != ''] 159 | ind = 0 160 | for i_app_pkg in app_list: 161 | appname = os.popen(f'adb shell pm path {i_app_pkg}').read().split('/')[-1] 162 | ind += 1 163 | tree.insert("", ind, text=f"{ind}", values=(appname, i_app_pkg)) # #给第0行添加数据,索引值可重复 164 | 165 | get_ent = str(app_ss_pkg.get()) 166 | this_a = messagebox.askokcancel('提示', f"{get_ent} 是正确包名关键字吗?\n\n如果不是请重新输入!") 167 | if this_a == True: 168 | Thread(target=in_suosuo_, args=(get_ent,)).start() 169 | 170 | 171 | # 开始弹窗 172 | def stare_app(): 173 | def start_(): 174 | xuliehao = os.popen('adb devices').read() 175 | phone = os.popen('adb shell getprop ro.product.model').read() 176 | lianjie = messagebox.askokcancel('使用说明', 177 | phone + xuliehao + 178 | "显示【手机型号】和【序列号】点击确认即可\n" 179 | "否则请开启手机【USb调试】相关功能, 正确链接手机\n软件由Python制作,运行效率较慢,善待!\n" 180 | "点击取消 退出程序") 181 | if lianjie == False: 182 | root.destroy() 183 | exit() 184 | Thread(target=start_, ).start() 185 | 186 | 187 | # 降级安装 188 | def jiangjianzuhang_star(): 189 | def jiangjianzhuang_(): 190 | apk = askopenfilename(title='选择需要安装的文件 [ apk ]', initialdir='/', filetypes=[('Android File', '*.apk')]) 191 | apkinfo = os.popen(f'adb install -r -d {apk}').read() 192 | messagebox.askokcancel('显示 success 则表示安装完成', f'{apkinfo}') 193 | 194 | jiangji = messagebox.askokcancel('降级安装提示', "降级操作,还请做好备份,\n" 195 | "部分应用降级可能出现闪退,不建议跨大版本降级\n取消关闭应用降级操作") 196 | if jiangji == True: 197 | Thread(target=jiangjianzhuang_).start() 198 | 199 | 200 | # 应用相关信息 201 | def app_info_star(): 202 | def app_info(app_): 203 | this_app_versionCode = os.popen(f'adb shell pm dump {app_} | findstr "versionCode"').read().split("=")[-1].replace('\n', '').replace('\r', '') 204 | this_app_primaryCpuAbi = os.popen(f'adb shell pm dump {app_} | findstr "primaryCpuAbi"').read().split("=")[-1].replace('\n', '').replace('\r', '') 205 | this_app_versionName = os.popen(f'adb shell pm dump {app_} | findstr "versionName"').read().split("=")[-1].replace('\n', '').replace('\r', '') 206 | this_app_firstInstallTime = os.popen(f'adb shell pm dump {app_} | findstr "firstInstallTime"').read().split("=")[-1].replace('\n', '').replace('\r', '') 207 | this_app_lastUpdateTime = os.popen(f'adb shell pm dump {app_} | findstr "lastUpdateTime"').read().split("=")[-1].replace('\n', '').replace('\r', '') 208 | 209 | messagebox.showinfo("App信息", f"{app_}\n目标Sdk:{this_app_versionCode}" 210 | f"\n版本号:{this_app_versionName}" 211 | f"\n支持的CPU架构:{this_app_primaryCpuAbi}" 212 | f"\n首次安装时间:{this_app_firstInstallTime}" 213 | f"\n最后更新时间:{this_app_lastUpdateTime}" 214 | ) 215 | 216 | if str(len(tree.selection())) != "0": 217 | for app_item in tree.selection(): 218 | app_text = tree.item(app_item, "values")[1] 219 | Thread(target=app_info, args=(app_text,)).start() 220 | else: 221 | messagebox.showinfo('提示', "没有对任何应用进行操作!") 222 | 223 | 224 | if __name__ == '__main__': 225 | os.popen('mode con cols=50 lines=10') 226 | try: 227 | root = tkinter.Tk() 228 | root.title("ADB手机应用管理工具") # #窗口标题 229 | root.geometry("700x400+700+360") # #窗口位置500后面是字母x 230 | root.resizable(False, False) 231 | 232 | # 表格 233 | tree = ttk.Treeview(root, height=10, show="headings") # #创建表格对象 234 | tree["columns"] = ("安装包(参考)", "包名") # #定义列 235 | tree.column("安装包(参考)", width=300) 236 | tree.column("包名", width=400) 237 | 238 | tree.heading("安装包(参考)", text="安装包(应用名仅供参考无法准确获取)") 239 | tree.heading("包名", text="应用包名【讲道理-无误】") 240 | 241 | VScroll1 = ttk.Scrollbar(tree, orient='vertical', command=tree.yview) 242 | VScroll1.place(relx=0.971, rely=0.028, relwidth=0.024, relheight=0.958) 243 | # 给treeview添加配置 244 | tree.configure(yscrollcommand=VScroll1.set) 245 | tree.place(x=0, y=60) 246 | 247 | # 创建下拉菜单 248 | xaunze_ = ttk.Combobox(root, font=('宋体', 16, "bold"), width=14, state="readonly") 249 | # 设置下拉菜单中的值 250 | xaunze_['value'] = ('第三方应用', '系统应用', '已启用的应用', '已停用的应用', '所有应用包名') 251 | # 设置默认值,即默认下拉框中的内容 252 | xaunze_.current(3) 253 | xaunze_.place(x=14, y=14) 254 | 255 | app_info_ = tkinter.Button(root, text="获取App信息", font=('宋体', 12, "bold"), width=12, command=app_info_star) 256 | app_info_.config(fg="green", bg="white") 257 | app_info_.place(x=370, y=12) 258 | 259 | app_info_leb = tkinter.Label(root, text="请先查询/查找应用\n←再选择应用获取App信息\n过程较慢,耐心等待", font=('宋体', 12)) 260 | app_info_leb.place(x=500, y=3) 261 | 262 | chaxunde = tkinter.Button(root, text="查询", font=('宋体', 12, "bold"), width=9, command=chaxun_star) 263 | chaxunde.config(fg="green", bg="white") 264 | chaxunde.place(x=210, y=12) 265 | 266 | zhixing_pkg = tkinter.Label(root, text="↑请先查询/查找应用\n再选择列表应用执行↓", font=('宋体', 12)) 267 | zhixing_pkg.place(x=10, y=298) 268 | 269 | # 创建下拉菜单 270 | cmb = ttk.Combobox(root, font=('宋体', 16, "bold"), width=6, state="readonly") 271 | # 设置下拉菜单中的值 272 | cmb['value'] = ('卸载', '停用', '启用') 273 | # 设置默认值,即默认下拉框中的内容 274 | cmb.current(1) 275 | cmb.place(x=30, y=346) 276 | 277 | zhixing = tkinter.Button(root, text="← 执行", font=('宋体', 12, "bold"), width=9, command=zhixing_star) 278 | zhixing.config(fg="red", bg="white") 279 | zhixing.place(x=142, y=345) 280 | 281 | app_ss_pkg = tkinter.Label(root, text="包名\n不要反人类输入\n支持模糊查询→", font=('宋体', 12)) 282 | app_ss_pkg.place(x=218, y=288) 283 | 284 | app_ss_pkg = tkinter.Entry(root, font=('微软雅黑', 14, "bold"), justify='center', width=24) 285 | app_ss_pkg.place(x=340, y=298) 286 | 287 | sousuo = tkinter.Button(root, text="↑ 关键字查找", font=('宋体', 12, "bold"), width=14, command=sousuo_star) 288 | sousuo.config(fg="red", bg="white") 289 | sousuo.place(x=340, y=345) 290 | 291 | jiangji = tkinter.Button(root, text="降级安装(保留数据)", font=('宋体', 12, "bold"), command=jiangjianzuhang_star) 292 | jiangji.config(fg="green", bg="white") 293 | jiangji.place(x=500, y=345) 294 | 295 | stare_app() 296 | root.mainloop() 297 | finally: 298 | exio() 299 | # pass 300 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AdbAppManage 2 | Android应用管理器 3 | 4 | # 感谢各位Star和Fork👍 5 | 6 | ## 一个方便安卓用户管理手机app的程序 7 | 8 | ### 多的不说源码在此,欢迎二改,有好的 idea 记得反馈! 9 | 10 | --------------------------------------------------------------------------------