引言
Android应用最终是以APK文件的形式发布,在开发和调试过程中,经常需要安装某个apk,一般情况下有两种选择:
- 使用第三方软件,比如各大厂商的手机助手等。
- 优点:简单省事
- 缺点:国内流氓厂家太多,安装一个软件经常附带安装很多其他杂七杂八的东西,对用户造成困扰不说,个人数据的安全性和隐私有泄露的隐患
- 使用Android自带adb命令
- 优点:非侵入,透明
- 缺点:每次都要在命令行窗口输入命令,繁琐,效率较低
自己造轮子(invent the wheel)
基于上述的背景,作为开发者,自己实现一个小工具,该工具需要满足以下条件:
- 快捷安装
实现便捷安装apk(双击apk文件即自动安装至调试手机) - 定制文件显示图标
可以定制apk文件在文件系统中显示时的图标,即在资源管理器中查看时不会显示空白(因为未设置默认打开程序),如下图所示(这里以yml文件为例):
思路
要达到上述要求,那么即需要编写一个简单的可执行程序,并且设置为apk文件的默认打开程序,由该程序调用adb install
进行apk文件安装,同时该程序的icon即用于apk文件的展示图标。在windows系统下,要编写一个exe文件非常方便。
实施
这里选择采用python脚本+Pyinstaller来开发。
- python脚本
处理参数传入和adb intall调用安装,可以扩展功能 - pyinstaller
官方描述:Freeze (package) Python programs into stand-alone executables,简单来说就是将python脚本转换成可独立运行的程序,在windows平台即exe,其具体原理可以参见官方的介绍。
1.python脚本示例(apk_installer.pyw):1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26import sys
import os
import time
import shlex,subprocess
try:
apk_name = sys.argv[1]
#print apk_name
#os.system('adb install -r ' + apk_name) #will spawn command prompt,so
cmd = 'adb install -r ' + apk_name
si = subprocess.STARTUPINFO()
si.dwFlags |= subprocess.STARTF_USESHOWWINDOW
si.wShowWindow = subprocess.SW_HIDE
#si.wShowWindow = subprocess.SW_HIDE # hide command prompt window
# p = subprocess.Popen(shlex.split(cmd),shell=True)
p = subprocess.Popen(cmd,startupinfo = si,shell = True)
p.wait() #waitting for child process to terminate
# DETACHED_PROCESS = 0x00000008
# subprocess.call(cmd, creationflags = DETACHED_PROCESS)
except:
pass
2.先利用python pip命令安装pyinstaller,然后利用pyinstaller将上述python脚本转换成exe:
命令行模式下切换到python脚本的目录(D:\cstsinghua\apk install)
cd D:\cstsinghua\apk install
执行转换命令
pyinstaller -F –nowindow -i android.ico apk_installer.pyw
-F
表示只生成一个exe,所有需要的文件都包含在生成的exe内;--nowindow
隐藏命令行窗口,-i
参数后面跟exe文件的ico文件,可以根据自己的喜好制作成想要的图(可以用png图片转成ico文件,可参见在线制作ico图标)。pyinstaller命令参数请参考pyinstaller参数详解
这里提供完整示例(包含python脚本和ico文件,以pyinstaller的spec文件,最终的exe文件),请下载:apk install.zip
后记
这里仅提供一种简单的思路,当然也可以采用加入鼠标右键菜单的方式来实现apk安装,可参考https://github.com/pwelyn/SignapkTools