【问题标题】:Delete App (.apk) in emulator?在模拟器中删除应用程序(.apk)?
【发布时间】:2011-02-23 14:07:29
【问题描述】:

我知道从模拟器中删除正在开发的应用程序的两种方法:

  1. 使用模拟器 GUI:设置 > 应用程序 > 管理应用程序 > 卸载
  2. 使用 ADB:adb 卸载

我可能发现了第三种方法,使用 'adb shell':

rm /data/app/<package>.apk

然而,这似乎并不是删除应用程序的好方法,因为可能存在与之相关的其他信息(注册?)。

这些信息是什么?在哪里可以找到?

【问题讨论】:

    标签: android-emulator apk adb android-install-apk


    【解决方案1】:

    你提到这个很有趣。我进行了一个快速的自制测试,以阐明您的问题。

    通常,当您安装 .apk 文件时,Android 会为其创建一个位于 /data/data/ 的内部存储区域。这主要用作其他应用程序或手机用户无法访问的内部缓存区域。您可以在 Android 数据存储部分的Internal storage 章节中更详细地了解这一点。这是您的应用程序专用的区域,您可以在其中写入私有数据。

    理论上,一旦您卸载应用程序,该内部存储区域也会被删除。您概述的前两种方式确实可以做到这一点:删除 /data/app/ 中的 .apk 文件以及 /data/data/ 中的内部存储区域。

    但是,如果您使用 adb shell 并运行 rm 命令,则删除的只是 /data/app/ 中的 .apk 文件。 /data/data/中的内部存储区域没有被删除。所以本质上你是正确的,应用程序的附加信息不一定被删除。但另一方面,如果您在运行命令后重新安装应用程序,则现有的内部存储区域将被覆盖,因为正在安装它的新副本。

    【讨论】:

    • 很好的答案,但 'rm /data/data/' 不会卸载应用程序,因为它仍在设置的“管理应用程序”部分中。我确信答案可以在某处的 AOSP 源代码中找到,我只是希望有人已经知道答案。
    • 是的,我含蓄地说 rm /data/data/ 不会卸载应用程序,答案应该更明确!
    【解决方案2】:

    adb uninstall com.example.test

    com.example.test 可能会因您的应用而异。

    【讨论】:

      【解决方案3】:

      我也遇到了这个问题。我的手机上有 Link2SD,但我的 SD 卡上的 ext4 分区已损坏,所以我重新格式化,但所有链接的文件仍在 /data/app 文件夹中。所以我创建了一个脚本来删除所有损坏的链接,并遇到了和你一样的问题,应用程序管理器说它们仍然安装!所以我制作了另一个脚本来解决这个问题,使用手机上的 pm 程序。

      这是我从应用文件夹中删除损坏链接的代码:

      fixln.sh

      #!/system/bin/sh
      #follow and fix symlinks
      
      appfolder="/data/app/"
      files=`ls ${appfolder}*`
      fix=$1
      badstring="No such file or directory"
      for i in $files
      do
          if [ -h $i ]
          then
              if [ -a `readlink $i` ]
              then
                  echo -e "\e[32m$i is good\033[0m";
              else
                  if [ $fix == "fix" ]
                  then
                      `rm $i`
                      echo -e "\e[31m$i is bad, and was removed\033[0m";
                  else
                      echo -e "\e[31m$i is bad\033[0m";
                  if
              fi
          else
              echo -e "\e[36m$i is not a symlink\033[0m";
          fi
      done
      

      这是我卸载没有 apk 的应用程序的代码:

      fixmissing.sh

      #!/system/bin/sh
      #searches through a list of installed apps, and removes the ones that have no apk file
      
      appfolder="/data/app/"
      fix=$1
      
      installed=`pm list packages -f -u`
      
      for i in $installed
      do
          usefull=${i#*:}
          filename=${usefull%=*}
          package=${usefull#*=}
      
          if [ -a $filename ]
          then
              echo -e "\e[32m$package ($filename) is good\033[0m"
          else
              if [ "$fix" == "fix" ]
              then
                  uninstall=`pm uninstall $package`
                  if [ "$uninstall" == "Success" ]
                  then
                      echo -e "\e[31m$package ($filename) is bad, and was removed\033[0m"
                  else
                      echo -e "\e[31m$package ($filename) is bad, and COULD NOT BE REMOVED\033[0m"
                  fi
              else
                  echo -e "\e[31m$package ($filename) is bad\033[0m"
              fi
          fi
      done
      

      将这些文件复制到您的手机,然后不带参数运行它们以查看它们找到的内容,或者在末尾添加修复(fixmissing.sh fix)以使它们修复找到的内容。运行风险自负,并备份您的文件。如果此代码以任何方式破坏任何内容,我概不负责。

      如果有人想将这些脚本更新/合并在一起,那很好。这些只是为了解决我的问题,他们已经这样做了,只是想我会分享它们。

      【讨论】:

        【解决方案4】:

        我相信该应用在 sdcard 上创建的任何文件都不会被删除。

        【讨论】:

        • 谢谢,但我不认为 SD 卡会包含注册信息,即使在删除 .apk 文件后,该应用程序仍会被列为已安装。一定有别的东西。第一次尝试 +1。
        【解决方案5】:

        还有另一种方法 - 像使用真实设备一样使用模拟器 - 在模拟器中找到该应用程序并将其向上拖动以将其卸载。

        【讨论】:

          猜你喜欢
          • 2014-04-30
          • 2011-02-28
          • 1970-01-01
          • 2020-09-30
          • 2012-09-18
          • 2012-10-27
          • 2023-04-04
          • 2021-04-26
          • 1970-01-01
          相关资源
          最近更新 更多