免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > 各类编程 > 详解如何制作APK安装器(2)

详解如何制作APK安装器(2)

时间:2012-04-14 19:31来源:未知 整理:寂涯网络 点击:


文件信息,所以,大家在安装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;

本页地址 http://www.jybase.net/biancheng/20120414825.html

百度搜索更多

谷歌搜索更多

顶一下
(3)
100%
踩一下
(0)
0%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com