在模拟器中删除应用程序(.apk)?

时间:2011-02-23 14:07:29

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

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

  1. 使用模拟器GUI:设置> 应用程序>管理应用程序> 卸载
  2. 使用ADB:adb uninstall
  3. 我可能已经发现了第三种方法,使用'adb shell':

    rm /data/app/<package>.apk
    

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

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

5 个答案:

答案 0 :(得分:4)

你提到这个很有意思。我跑了一个快速的自制测试来解释你的问题。

通常,当您安装.apk文件时,Android会为其创建一个内部存储区域,位于/ data / data /&lt;启动活动的包名称&gt;。这主要用作内部缓存区域,其他应用程序或电话用户无法访问。您可以在Androids数据存储部分的Internal storage章节中详细了解相关内容。这是您的应用程序专用的区域,您可以在那里编写私人数据。

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

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

答案 1 :(得分:2)

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

继承我的代码,从app文件夹中删除损坏的链接:

  

<强> 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修复程序)以使它们修复它们找到的内容。运行需要您自担风险,并备份您的文件。如果此代码以任何方式破坏任何内容,我不负责任。

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

答案 2 :(得分:2)

adb uninstall com.example.test

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

答案 3 :(得分:1)

我相信应用程序在SD卡上创建的任何文件都不会被删除。

答案 4 :(得分:0)

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