5. INSTALL_FAILED_INSUFFICIENT_STORAGE
如果在尝试安装项目时遇到此错误,则表示目标设备没有足够的内存。
如果您尝试在AVD上安装项目,那么您应该检查您为此特定AVD分配了多少空间:
- 启动AVD Manager。
- 找到有问题的AVD,然后单击其随附的编辑此AVD图标。
- 在出现的窗口中,单击“ 显示高级设置”。
- 滚动到“ 内存和存储”部分。
本节列出了您为此特定AVD分配的各种类型的内存。如果这些值中的任何一个异常低,那么您应该增加它们以更接近地反映典型Android智能手机或平板电脑可用的内存:
- 内存。可用于模拟设备的RAM量。
- VM堆。将多少堆空间(即内存)分配给模拟智能手机或平板电脑的虚拟机(VM)。
- 内部存储器。模拟设备可用的不可移动内存量。
- SD卡。 可移动内存量。如果要使用由Android Studio管理的虚拟SD卡,请选择Studio-managed并输入要创建的虚拟SD卡的大小(建议的最小值为100 MB)。或者,您可以通过选择外部文件然后指定要使用的位置来管理文件中的SD卡“空间” 。
如果您的AVD内存没什么奇怪的,或者您尝试在物理Android智能手机或平板电脑上安装应用程序,那么此错误通常意味着您编译的应用程序太大了。在安装时从设备内存中获取大量内容的应用程序永远不会顺利进行。
如果您需要大幅缩小APK的大小,请尝试以下技巧:
-
使用ProGuard删除未使用的类,字段,方法和属性。要启用ProGuard,请打开模块级build.gradle文件并添加以下内容:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 |
|
- 使用AAPT工具与无损压缩优化您可绘制或使用该设计旨在减少您的PNG文件(大小的程序zopflipng,pngcrush,使用OptiPNG,TinyPNG,或pngquant)或您的JPEG文件的大小(packJPG)。或者,您可能希望尝试使用WebP格式的图像替换PNG和JPEG文件。
- 请记住从应用程序的发行版中删除所有与调试相关的功能。Android不需要运行此信息,因此它只占用不必要的空间。
- 在您的项目中搜索任何重复的资源。即使像重复字符串这样的轻量级资源也可以为您的最终APK大
- 使用Lint标识代码中未引用的任何资源,并删除这些资源。要运行Lint,请从Android Studio工具栏中选择Analyze> Inspect Code ....
- 通过添加
shrinkResources true
到项目的build.gradle文件来启用资源收缩。 - 如果需要使用相同图像的变体,则使用相同的基本图像并在运行时自定义它,而不是将同一图像的多个版本添加到项目中。例如,您可以将不同的颜色,使用图像
android:tint
和tintMode
,你可以使用旋转图像android:fromDegrees
,android:toDegrees
,android:pivotX
,和android:pivotY
。 -
优化您的库。尝试从项目中删除任何不必要的或内存密集型库。如果您确实需要使用大型库,那么请检查是否有任何方法可以针对移动环境优化此库,因为外部库代码通常不会考虑移动设备。您还应该记住,许多库包含大量本地化字符串。如果您的应用程序没有正式支持这些库,那么您可以通过告诉Gradle不要在编译的APK中包含这些字符串来减小库的大小。要指定应用程序正式支持的语言,请打开模块级build.gradle文件并使用该
resConfigs
属性。例如,这里我们指定我们只想在项目中包含英语字符串:
1 2 3 |
|
-
考虑一下您的APK是否包含单个用户可以下载但从不使用的大量内容。例如,具有hdpi屏幕的设备对
xxxhdpi
资产没有多大用处!减少APK大小的最有效方法之一是将其分成多个APK,因此当用户下载您的应用时,他们会收到一个仅包含对其特定设备有意义的代码和资源的APK。您可以在官方Android文档中找到有关创建针对不同屏幕密度和特定ABI(应用程序二进制接口)的APK的更多信息。
6. ActivityNotFoundException
一个ActivityNotFoundException
当一个呼叫发生startActivity(Intent)
或它的变体之一,因为该故障Activity
无法执行给定的Intent
。
最常见的原因ActivityNotFoundException
是忘记在清单中声明活动,因此打开清单并检查您是否已宣布所有活动。您还应检查是否已正确声明每个活动,使用完全限定的类名称或句点作为包名称的简写。例如,以下两个都是有效的:
1 |
|
1 |
|
如果您无法发现舱单的任何问题,那么还有其他一些可能的原因ActivityNotFoundExceptions
。首先,如果您在将一个Activity
类从一个包移动到另一个包后遇到此错误,那么您可能会混淆Android Studio并且只需要清理并重建您的项目。
一ActivityNotFoundException
,如果在目标的错误也可能导致Activity
不正确加载。要检查项目中是否发生这种情况,请将您的意图代码放在try-catch块中:
1 2 3 4 五 6 7 8 |
|
再次运行您的应用程序,然后查看Android Studio的Logcat Monitor以查看是否捕获了可能阻止创建目标活动的任何异常。如果是这种情况,那么解决这些错误也应解决这个问题ActivityNotFoundException
。
7. ClassCastException
该ClassCastException
错误与Java的类型转换功能有关,该功能允许您将一种类型的变量转换为另一种类型。ClassCastException
当您尝试将对象强制转换为不是实例的类时,会遇到一个问题。例如,以下两个代码段将导致ClassCastException
:
1 2 |
|
1 |
|
此错误消息包含有关导致ClassCastException
错误的行的信息,因此导航到项目的这一部分,检查在那里投射的对象,并解决任何不匹配问题。
如果您无法发现您的投射问题,请考虑您最近是否Views
在布局资源文件中移动了一些,因为有些用户报告ClassCastException
在重新排列后遇到了问题Views
。如果您怀疑这可能是您的原因,请ClassCastException
告诉Android Studio通过执行清理/重建周期从头开始重新生成布局文件。这迫使Android Studio正确注册您最近的布局更改,这应该可以解决您的问题ClassCastException
。
8. NullPointerException
在Java中,当您声明引用变量时,实际上是在创建指向对象的指针。您可以通过为该对象的引用指定空值来声明对象当前指向未知数据。空值可用于编码某些设计模式,但如果遇到NullPointerException(NPE),则表示您已尝试使用指向空值的引用,就好像它引用了一个对象一样。由于在此引用指向的位置没有要执行的代码,因此最终会使用NPE。
NPE通常伴随有关捕获此异常的位置的信息,因此Logcat监视器应包含发生此错误的确切行。导航到项目的此区域,并标识等于null的引用。然后,您需要找到应设置值的位置,然后进行设置。
findViewById
如果View
找不到请求,该方法也可以返回null ,因此如果您的NPE出现在包含a的行中findViewById
,请检查您是否已初始化包含此内容的布局View
。还要注意可能已经悄悄进入你的findViewById
电话的任何拼写错误或拼写错误,因为这些也可能导致NPE。
要避免项目中出现NPE,请确保在尝试使用它们之前初始化所有对象,并始终在从该对象请求方法或字段之前验证变量是否为null。