3

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

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

我可能已经发现了第三种方法,使用“adb shell”:

rm /data/app/<package>.apk

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

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

4

5 回答 5

4

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

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

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

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

于 2011-03-06T16:03:10.933 回答
3

adb uninstall com.example.test

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

于 2013-07-19T18:12:20.623 回答
2

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

这是我从应用程序文件夹中删除断开链接的代码:

修复文件

#!/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的应用程序的代码:

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

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

于 2011-10-23T05:29:44.723 回答
1

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

于 2011-02-26T18:53:24.617 回答
0

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

于 2019-03-07T14:08:29.873 回答