如何解决Android的13个最常见的错误消息(二)

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

buildTypes {

      release {

 

//Enable ProGuard//

 

          minifyEnabled true

 

//Since we want to reduce our APK size as much as possible, I’m using the settings from the proguard-android-optimize.txt file//

 

          proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'

 

      }

  }

 

}

  • 使用AAPT工具与无损压缩优化您可绘制或使用该设计旨在减少您的PNG文件(大小的程序zopflipngpngcrush使用OptiPNGTinyPNG,或pngquant)或您的JPEG文件的大小(packJPG)。或者,您可能希望尝试使用WebP格式的图像替换PNG和JPEG文件。
  • 请记住从应用程序的发行版中删除所有与调试相关的功能。Android不需要运行此信息,因此它只占用不必要的空间。
  • 在您的项目中搜索任何重复的资源。即使像重复字符串这样的轻量级资源也可以为您的最终APK大
  • 使用Lint标识代码中未引用的任何资源,并删除这些资源。要运行Lint,请从Android Studio工具栏中选择Analyze> Inspect Code ....
  • 通过添加shrinkResources true到项目的build.gradle文件来启用资源收缩。
  • 如果需要使用相同图像的变体,则使用相同的基本图像并在运行时自定义它,而不是将同一图像的多个版本添加到项目中。例如,您可以将不同的颜色,使用图像android:tinttintMode,你可以使用旋转图像android:fromDegreesandroid:toDegreesandroid:pivotX,和android:pivotY
  • 优化您的库。尝试从项目中删除任何不必要的或内存密集型库。如果您确实需要使用大型库,那么请检查是否有任何方法可以针对移动环境优化此库,因为外部库代码通常不会考虑移动设备。您还应该记住,许多库包含大量本地化字符串。如果您的应用程序没有正式支持这些库,那么您可以通过告诉Gradle不要在编译的APK中包含这些字符串来减小库的大小。要指定应用程序正式支持的语言,请打开模块级build.gradle文件并使用该resConfigs属性。例如,这里我们指定我们只想在项目中包含英语字符串:

1

2

3

android {

defaultConfig {

  resConfigs "en"

  • 考虑一下您的APK是否包含单个用户可以下载但从不使用的大量内容。例如,具有hdpi屏幕的设备对xxxhdpi资产没有多大用处!减少APK大小的最有效方法之一是将其分成多个APK,因此当用户下载您的应用时,他们会收到一个仅包含对其特定设备有意义的代码和资源的APK。您可以在官方Android文档中找到有关创建针对不同屏幕密度和特定ABI(应用程序二进制接口)的APK的更多信息。

 

6. ActivityNotFoundException

一个ActivityNotFoundException当一个呼叫发生startActivity(Intent)或它的变体之一,因为该故障Activity无法执行给定的Intent

最常见的原因ActivityNotFoundException是忘记在清单中声明活动,因此打开清单并检查您是否已宣布所有活动。您还应检查是否已正确声明每个活动,使用完全限定的类名称或句点作为包名称的简写。例如,以下两个都是有效的:

1

<activity android:name=".MainActivity">

1

<activity android:name="com.jessicathornsby.myapplication.MainActivity">

如果您无法发现舱单的任何问题,那么还有其他一些可能的原因ActivityNotFoundExceptions。首先,如果您在将一个Activity类从一个包移动到另一个包后遇到此错误,那么您可能会混淆Android Studio并且只需要清理并重建您的项目。

ActivityNotFoundException,如果在目标的错误也可能导致Activity不正确加载。要检查项目中是否发生这种情况,请将您的意图代码放在try-catch块中:

1

2

3

4

6

7

8

try {

 

//Your code here//

 

} catch ( ActivityNotFoundException e) {

      e.printStackTrace();

 

}

再次运行您的应用程序,然后查看Android Studio的Logcat Monitor以查看是否捕获了可能阻止创建目标活动的任何异常。如果是这种情况,那么解决这些错误也应解决这个问题ActivityNotFoundException

7. ClassCastException

ClassCastException错误与Java的类型转换功能有关,该功能允许您将一种类型的变量转换为另一种类型。ClassCastException当您尝试将对象强制转换为不是实例的类时,会遇到一个问题。例如,以下两个代码段将导致ClassCastException

1

2

Object x = new Integer(0);

System.out.println((String)x);

1

ImageView image = (ImageView)context.findViewById(R.id.button);

此错误消息包含有关导致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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值