引言

Android应用最终是以APK文件的形式发布,在开发和调试过程中,经常需要安装某个apk,一般情况下有两种选择:

  1. 使用第三方软件,比如各大厂商的手机助手等。
    • 优点:简单省事
    • 缺点:国内流氓厂家太多,安装一个软件经常附带安装很多其他杂七杂八的东西,对用户造成困扰不说,个人数据的安全性和隐私有泄露的隐患
  2. 使用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
26
import 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