为了方便安装Android软件,APK安装器这类软件在网上出现了,大家用的最多的可能 就属 91 手机助手自带的安装器了。今天我们使用 C++动手来编写一个这样的工具,在开始 之前,我们有必要了解一下APK文件是怎样的方式安装到用户手机中的。细分起来, Android 程序的安装有下面四种方式: 1.系统程序安装:开机时安装,这类安装没有安装界面 2.通过 Market安装:直接通过Market进行网络安装,这类安装没有安装界面 3.ADB 工具安装:使用ADB工具进行安装,这类安装没有安装界面 4.手机自带安装:通过SD卡里的 APK 文件安装,这类安装有安装界面 这四种方法,仔细想想,我们能下手的就是通过 ADB 工具来安装了,ADB(Android 调 试桥)是 Android SDK中为开发人员提供的一款强大的程序调试测试工具,集成了安装,卸 载,调试,设备管理等多个功能,详细的adb命令参数自己可以运行adb 得到。现在我们只 关心需要用到的功能。当 Android 手机设备使用 USB 调试模式连上计算机后,可以运行 adb.exe devices来列出连接上的设备,如图1 所示为开启一个Android模拟器后的截图: ![]() 在设备已连接的情况下,可以直接运行 adb install <APK file>安装一个 APK 程序或 运行 adb -s <serial number> install <APK file>来对指定的设备进行软件安装,后者是 在连接多个设备的情况下才用的,我们这里为了简单就不考虑了,安装效果如图2所示 ![]() 在经过一小段时间的等待后,提示Success说明安装成功,不过在实际安装的过程中, 有时候 adb返回后没有Success提示但程序也安装成功了,这让人很郁闷,因为这样就无法 捕获 APK 是否已经正确安装了,为了简化,我直接返回成功了。 APK 程序的卸载也很简单,输入adb uninstall <package>就可以了,这里的package 是软件的包名,每个APK程序安装后有个APK程序名,也有个包名,我们可以通过获取APK 文件里面的信息来获取这个包名。卸载效果如图3所示: ![]() 如果输入的package在手机中不存在的话,会返回如图4所示的结果 ![]() 这样就可以通过查看返回的数据里面有无Failure来判断APK是否成功卸载。到这里, 我们可以完成手机是否已经正常连接、安装、卸载等功能了,我们继续看看如何获取 APK 文件本身的信息,我们通常见到的APK 安装器都可以显示APK文件的软件名、包名、文件大 小、最低系统版本、权限等数据。这些数据的获取可以通过运行AAPT.exe来获取,AAPT 是 Android SDK中提供的另外一个工具,它提供了对APK进行信息列举、文件添加、文件删除 及资源打包到APK 等功能。我们要用到的是它的 dump 命令,如图5 所示: ![]() 我们只需运行aapt d badging <APK file>就可以获取一个APK的详细信息,如图6所示: ![]() 这里的“package:name=”就是软件的包名,“versionName”就是软件的版本, “application: label”就是软件对外显示的名称,“icon=”就是软件显示的图标, “uses-permission:”就是软件用到的权限,这些权限有一部分是流氓及病毒软件需要用到 的,在安装 APK 之前,我们有必要查看它所需的权限来对它的危险度进行粗略的判断, “sdkVersion:”就是软件运行允许的Android最低版本,这里的数字7表示是 Android2.1 系统,不同版本的 Android 都有相应数字版本号,截止到最新的 Android4.0版本它们的对 应关系如表1 所示: ![]() 还有一种情况,当APK文件名无效或非法的APK文件的时候, aapt d badging <APK file> 会返回错误信息,如图7所示: ![]() 这可能是 AAPT 处理上的一个 BUG, 我们将文件名改成普通英文名后即可正常返回 APK |