文件信息,所以,大家在安装APK程序的时候,请将 APK 文件名改成英文并且不要包含空格。 本来 AAPT与 ADB 这两个工具在 Android 源码中都可以找到,但是提取所需相关功能出 来还绝非易事,研究了一下果断的放弃了,不过从技术研究的角度出发,我觉得大家还是可 以深入研究的。整个APK安装器的思路就是通过CreateProcess调用 AAPT 与ADB 进行相应 的操作,而返回数据的获取我用到了管道,使用 CreatePipe 创建读句柄,在父进程中通过 ReadFile来读取数据。 介绍到这里,我们需要的信息都已经获取了,下面是代码时间。APK 文件的操作我封装 进了 CAPKHeaper类,类的声明如下: class CAPKHelper { protected: map<string,string> m_mapPermission; string m_adbPath; string m_aaptPath; string m_apkName; string m_softName; string m_PkgName; string m_Version; string m_OSVersion; string m_FileSize; string m_Permission; string m_iconFile; public: CAPKHelper(const char *aaptPath, const char *adbPath, const char* apkFile); ~CAPKHelper(void); protected: const string PrePare(APKFTyte flag); //准备命令字符串 const string DoCommand(const string cmd); //执行命令并返回结果 void InitPermissionMap(); public: void AdbPath(const char* val); void AaptPath(const char* val); const char* ApkName() const; void ApkName(const char * val); const char* AdbPath() const; const char* AaptPath() const; const char* Permission() const ; const char* AppName() const; const char* PkgName() const; const char* Version() const; const char* OSVersion() const; const char* FileSize() const; void GetInfo(); BOOL GetDevices(); BOOL Install(BOOL bSDCard); BOOL UnInstall(); void UnzipIcoFile(string outPath); }; 设备的检查使用GetDevices()方法,信息的获取使用GetInfo()方法,安装与卸载则分 别是 BOOL Install(BOOL bSDCard)与BOOL UnInstall(),看看GetDevices()的代码如下 BOOL CAPKHelper::GetDevices() { string str; str = DoCommand(PrePare(APKF_DEVICES)); string::size_type posbegin; posbegin = str.find(devices); if (posbegin == string::npos) return false; else { posbegin = posbegin + devices.size(); string strDevice = ""; strDevice.assign(str, posbegin, str.size()-posbegin); posbegin = strDevice.find("device"); if(posbegin == string::npos) return false; } return true; } 代码首先通过PrePare(APKF_DEVICES)来获取需要执行的命令字符串,不同的命令类型 用了一个枚举量来表示: typedef enum tagApkFType{//flags for PrePare APKF_INFO, APKF_DEVICES, APKF_INSTALL, APKF_INSTALLSDCARD, APKF_UNINSTALL } APKFTyte; 获取命令后通过DoCommand()来执行并返回执行结果,然后对结果进行处理。接下来看 看PrePare的代码: const string CAPKHelper::PrePare( APKFTyte flag ) { string cmd = ""; switch (flag) { case APKF_INFO: if(m_apkName.empty() || m_aaptPath.empty()) return ""; cmd = m_aaptPath + " d badging \"" + m_apkName + '"'; break; case APKF_DEVICES: if(m_adbPath.empty()) return ""; cmd = m_adbPath + " devices "; break; case APKF_INSTALL: if(m_apkName.empty() || m_adbPath.empty()) return ""; cmd = m_adbPath + " install \"" + m_apkName + '"'; break; case APKF_INSTALLSDCARD: if(m_apkName.empty() || m_adbPath.empty()) return ""; cmd = m_adbPath + " install -s \"" + m_apkName + '"'; break; case APKF_UNINSTALL: if(m_appName.empty() || m_adbPath.empty()) return ""; cmd = m_adbPath + " uninstall " + m_PkgName; |