And*_*ith 505 installation android android-sdcard
这个INSTALL_FAILED_INSUFFICIENT_STORAGE错误是每个Android开发人员生活中的祸根.无论应用程序大小或可用存储空间如何,都会发生这种情况.重新启动目标设备可以简单地解决问题,但很快就会回来.有数百个(如果不是数千个)消息板帖子来自人们询问问题发生的原因,但谷歌的人们对这个问题感到沮丧.
有一个简单的解决方法.如果您的测试设备运行的是Android 2.2或更高版本,则android:installLocation使用该值将该属性添加到应用程序的清单文件中"preferExternal".这将强制将应用程序安装在设备的外部存储设备上,例如手机的SD卡.
例如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.andrewsmith.android.darkness"
android:installLocation="preferExternal"
Run Code Online (Sandbox Code Playgroud)
这更像是一个创可贴,而不是一个修复,如果您希望您的已完成的应用程序安装在设备的内部存储器上,它可能并不理想.但它至少会让开发过程变得更加令人沮丧.
小智 170
这只是一个临时的解决方法,而不是一个真正的修复.
在我遇到这种情况并且对目前的反应不满意之后,我开始尝试从AOSP来源解决这个问题.我找到了一个真正的解决方案.
首先,关于Android如何安装和更新的一些(简化)背景
第一次安装应用程序:
将APK文件保存为
/data/app/-1.apk(1.apk)
当应用程序要更新时:
更新的APK文件保存为:
/data/app/-2.apk(2.apk)
第一个版本(1.apk)被删除.
在我们的下一次更新中:
- 新的APK保存为(1.apk),(2.apk)被删除(永远重复).
当应用程序更新时,我们大多数人都会遇到这个问题,但删除旧的APK失败了.哪个本身还没有导致更新失败,但它确实导致有两个APK文件/data/app.
下次尝试更新应用程序时,系统无法移动其临时文件,因为(1.apk)和(2.apk)都不为空.由于File#renameTo(File)不会抛出异常,而是返回一个布尔的PackageManager,它无法告诉为什么它返回INSTALL_FAILED_INSUFFICIENT_STORAGE,即使失败与可用空间量无关.
跑:
adb shell "pm uninstall <full.packge.name>"
adb shell "rm -rf /data/app/<full.package.name>-*"
Run Code Online (Sandbox Code Playgroud)
要么
卸载应用程序
使用您喜欢的方法删除两个:
/data/app/<full.package.name>-1.apk
/data/app/<full.package.name>-2.apk
确保没有其他任何东西以类似的方式阻止未来的安装.在我的情况下,我有一个/data/app-lib/<full.package.name>-1目录挥之不去!在这种情况下,SD卡的安装工作,以及随后移动到内部存储器.(/data/app-lib/<full.package.name>没有-1结尾的创作.)
安装到外部存储器的代码明显不同,没有相同的问题
卸载应用程序只会删除一个版本的APK文件/data/app.这就是为什么你可以重新安装一次,但不能更新它.
发生此错误时,模拟器中的可用空间量并不真正相关
Osc*_* S. 108
您需要增加Android模拟器的内存容量.有两种方法:
右键单击Android项目的根目录,转到"运行方式",然后转到"运行配置...".在左侧的树中找到"Android应用程序"节点,然后选择您的项目并转到窗口右侧的"目标"选项卡,向下看"其他模拟器命令行选项"字段(有时您'我需要使窗口更大)并最终粘贴"-partition-size 1024".单击"应用",然后单击"运行"以使用模拟器.
转到Eclipse的 Preferences,然后选择"Launch"在"Default emulator option"字段中添加"-partition-size 1024".单击"应用"并像往常一样使用您的模拟器.
Lou*_*ini 29
感谢您发布此问题.我有一些额外的见解可能会帮助一些开发人员.
我正在设备(而不是模拟器)上调试我的应用程序.该设备有21 MB免费开启/data(由"df"显示做"adb shell"),我的应用程序只有5 MB.但是,我确实发现如果我删除了设备上的其他应用程序(无需重新启动手机或重新启动adbd),INSTALL_FAILED_INSUFFICIENT_STORAGE会消失一段时间然后再回来.
因此,调试我的5 MB应用程序似乎需要更多20 MB的空间/data,此外每次调试我的应用程序时都会出现漏洞.
所以我做了"adb shell"并列出了ENTIRE /data目录
cd /data
ls -a -l -R
Run Code Online (Sandbox Code Playgroud)
我查看了5000行输出,看看所有空间的去向.
我在/data/klog目录中的设备上发现了大量浪费的空间,这些空间来自几个月的调试会话中的旧日志文件.
这些不是我的日志文件:它们是由Android基础架构的某些部分创建的.
我删除了它们并立即保存了58 MB,这些设置应用程序中未归因于任何特定应用程序.我有一个小设备,所以58 MB是非常重要的(约40%).
到目前为止,经过多次运行后,我还没有再次获得INSTALL_FAILED_INSUFFICIENT_STORAGE.让我们希望这是真正的问题,尽管OP表明他的设备有足够的空间(但没说多少).
希望你们中的一些人也可以通过定期删除来逃避INSTALL_FAILED_INSUFFICIENT_STORAGE /data/klog/*.
或者,你至少可以做ls -a -l -R的/data,看看你所有的空间是怎么回事,如果确实有真有些(隐藏)空间的问题.
Saa*_*ooq 20
以下有助于:
打开设备的shell
adb shell
Run Code Online (Sandbox Code Playgroud)导航到首次复制传入APK的临时目录
cd /data/local/tmp
Run Code Online (Sandbox Code Playgroud)列出可用文件并根据需要删除
rm * // use at your own risk, good practice to list files first
Run Code Online (Sandbox Code Playgroud)到目前为止,这对我来说在实际设备上是可靠的.
编辑:事实证明,这不像上面那样可靠.
我尝试了很多解决方案.什么都没有帮助.最后我找到了一个名为SD Maid的应用程序.这有帮助.
它说功能仅限于无根设备.我的根深蒂固,所以很高兴看到人们在那些场景中听到有效的声音,如果它只是一个对我有用的侥幸(无论如何这是一个不可预测的问题).
注意:我与该应用程序无关.刚刚用搜索找到它.
nas*_*han 16
我在应用程序的清单文件中添加了一行,即android:installLocation="preferExternal".通过使用此行,它强制将应用程序安装到外部存储.看下面的例子,
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nasir.phonegap"
android:installLocation="preferExternal" >
Run Code Online (Sandbox Code Playgroud)
小智 16
我通过在AndroidManifest.xml文件中包含android:installLocation="auto"inside <manifest>标签来解决它.
模拟器上的相关问题是/data分区中没有剩余空间.
例如,
% adb shell df
Filesystem Size Used Free Blksize
/dev 252M 32K 252M 4096
/mnt/asec 252M 0K 252M 4096
/mnt/obb 252M 0K 252M 4096
/system 154M 154M 0K 4096
/data 64M 57M 6M 4096
/cache 64M 1M 62M 4096
Run Code Online (Sandbox Code Playgroud)
以下是/data/app目录的示例视图:
% adb shell ls -l /data/app
-rw-r--r-- system system 19949 2011-10-12 17:09 CubeLiveWallpapers.apk
-rw-r--r-- system system 27670 2011-10-12 17:09 GestureBuilder.apk
-rw-r--r-- system system 34341 2011-10-12 17:09 SoftKeyboard.apk
-rw-r--r-- system system 20151 2011-10-12 17:09 WidgetPreview.apk
Run Code Online (Sandbox Code Playgroud)
我删除了额外的APK文件.在每次安装时,您都会看到一个新的APK文件.只需删除额外的APK文件.
例如,
adb shell rm /data/app/com.brooklynmarathon.calendarapi2-1.apk
Run Code Online (Sandbox Code Playgroud)
在我的情况下失败是由com.android.providers.media应用程序引起的.我在x86 android模拟器上面对这个.我做了什么:
$ adb shell df
Filesystem Size Used Free Blksize
...
/data 224M 209M 14M 4096
....
Run Code Online (Sandbox Code Playgroud)
可用空间太小 /data
$ adb shell du /data
...
409870 /data/data/com.android.providers.media
...
Run Code Online (Sandbox Code Playgroud)
几乎全部都是由单个应用程序消耗的!它是系统应用程序,所以我认为最好不要删除它.相反,我清理了应用数据.
$ adb shell pm clear com.android.providers.media
Success
$ adb shell df
Filesystem Size Used Free Blksize
...
/data 224M 8M 215M 4096
...
Run Code Online (Sandbox Code Playgroud)
磁盘已清除,应用安装成功.
小智 7
我尝试了以下方法:
检查它是否与您相同。
仿真器解决方案
打开你的.Android目录。通常在您的主目录中。然后转到avd并打开包含您要更改的 avd 名称的目录。
现在编辑该config.ini文件并添加以下行或修改以下行:
disk.dataPartition.size=1024
1024您想要使用的大小(以 MB 为单位)在哪里。保存文件,然后启动模拟器并wipe user data选中。您的模拟器现在应该具有新的大小。
我觉得写这个有点奇怪,但我不能100%肯定在某些情况下这不是真的(它对我有用).如果您有以下症状:
然后,试试这个:
我拔掉了手机,让它休息了整整一天.我的电池消失了一点.在此之后,我重新连接它并再次开始调试.这次一切都很好!我的意思真的很好,就像以前一样.
这个错误是否可能是由于某些与电池相关的硬件原因造成的?用这种方式感觉仍然很奇怪,但是现在我时不时地断开手机(以及夜晚)并且问题没有恢复.
小智 6
回答这个话题的第一篇文章......
症状:有些应用程序没有安装,说没有空间,而且内部和外部存储都有足够的空间!解决方案:默认情况下禁用外部安装
通过defaut设置外部安装:
adb shell pm set-install-location 2
Run Code Online (Sandbox Code Playgroud)
许多无法在外部安装的应用程序(例如adblock +等)无法安装
然后解决方案是
adb shell pm set-install-location 0
Run Code Online (Sandbox Code Playgroud)
要么
adb shell pm set-install-location 1
0: auto (if one is full - or irrelevant !!! - it select the other)
1: internal
2: external
Run Code Online (Sandbox Code Playgroud)
三星Galaxy Ace在其规格中宣传了158 MB的内部存储,但核心应用程序和服务消耗了大约110 MB(我使用设备上的任务管理器来检查).我的应用程序是52 MB,因为它有很多资产.一旦我删除了一些低至45 MB的应用程序,该应用程序设法安装没有问题.该设备仍然提醒我内部存储几乎已满,我应该卸载一些应用程序,即使我只安装了一个应用程序.
安装.apk软件包的发行版本然后卸载它后,我的设备显示99 MB的可用空间,因此可能是调试信息使设备混乱.请参阅Louis Semprini的回答.
小智 5
由于这个问题仍然存在,我想我会出于开发目的在RacZo 的答案中添加一些内容。如果您没有使用Eclipse插件或由于某种原因您没有源代码,而只有 .apk,您可以在启动模拟器时使用相同的选项从命令行增加分区大小:
emulator -avd <emulator name> -partition-size 1024
Run Code Online (Sandbox Code Playgroud)
据我所知,developer.android.com 上没有记录这个选项,所以我想我会把它贴在这里,这样人们可能会找到这个解决方案。
解决方法:
编译为 2.1,不带android:installLocation="preferExternal".
好的?
编译为 2.2,包括android:installLocation="preferExternal".
这仍然会安装在低于 8 的 SDK 版本上(XML 标记被忽略)。
| 归档时间: |
|
| 查看次数: |
352813 次 |
| 最近记录: |