如何解决Android的13种最常见错误消息

测试是Android开发的关键部分,它可以让您消除在应用中潜伏的所有错误,错误和性能问题,然后再将其发布给公众。

每次遇到错误时,Android都会生成一条错误消息,然后将该消息显示为Android Studio Logcat Monitor的一部分,或在您用来测试应用程序的设备上以对话框的形式显示

这些错误消息通常很简短,而且直截了当,乍看起来似乎并没有那么大的帮助。 但是,这些消息实际上包含使项目重回正轨所需的所有信息-您只需要知道如何解密它们即可!

在本文中,我们将深入研究开发任何 Android应用时最可能遇到的13条错误消息。 我们将仔细研究每一个错误消息的真正含义,检查所有可能导致每个错误的原因,最重要的是,分享有关如何解决它们的逐步说明。

发现错误消息

在测试应用程序时,您可能会遇到各种错误消息,从严重的错误(会导致您在首次尝试将其安装到目标设备上时崩溃)到更细微的错误,这些错误会随着时间的推移降低应用程序的性能。

根据您遇到的错误类型,Android会在用于测试应用程序的设备上或在Android Studio中显示错误消息。

找出出现在物理设备或AVD上的错误消息很容易-您只需要注意设备屏幕上出现的所有对话即可! 但是,发现Android Studio中出现的错误可能很棘手,因为Logcat Monitor会记录大量信息,因此很容易错过重要的错误消息。

确保您不会错过任何错误消息的最简单方法是打开Logcat Monitor的Verbose下拉列表并将其设置为Error ,这将过滤掉错误消息以外的所有内容。

打开Logcat Monitors下拉列表,然后选择Error

1.无法找到R.layout.main /无法解析符号R

当Android Studio无法正确生成R.java文件时,就会导致此错误,并且它经常会突然冒出来-一分钟一切都会正常运行,而下一分钟项目的每个部分都无法编译。 更糟糕的是,当Android Studio遇到R.layout错误时,通常会将所有布局资源文件标记为包含错误,这使得很难知道从哪里开始寻找错误源。

通常,最有效的解决方案是最简单的:清理并重建项目。 从Android Studio工具栏中选择Build> Clean Project ,稍等片刻,然后通过选择Build> Rebuild Project构建项目

如果单个清理/重建周期不起作用,请尝试重复此过程几次,因为一些开发人员在快速连续完成多个清理/重建周期后报告了积极的结果。

如果在移动某些文件和目录后遇到此错误,则可能是R.layout错误是由于Android Studio缓存与项目的当前布局不匹配引起的。 如果您怀疑是这种情况,请从Android Studio的工具栏中选择“ 文件”>“使缓存无效/重新启动”>“无效并重新启动”

资源名称的问题也可能导致R.java文件无法正确创建,因此请检查您是否没有多个具有相同名称的资源,并且文件名中均不包含无效字符。 Android Studio仅支持小写的az,0-9,句号和下划线,即使您实际上不在项目中的任何地方使用此资源,单个无效字符也可能在整个项目中引起R.layout错误!

如果您确实确定并解决了错误,但Android Studio仍显示R.layout错误,则可能需要完成清理/重建周期,然后Android Studio才能正确注册您的更改。

2.字段引用过多…。最大为65,536

编译应用程序时,APK包含Dalvik可执行(DEX)字节码文件形式的可执行字节码文件。 DEX规范指出,单个DEX文件最多可以引用65,536个方法,如果遇到“ 字段太多…”错误,则表明您的应用已超出此限制。 请注意,这是对项目引用的方法数量的限制,而不是对项目定义的方法数量的限制。

如果遇到此错误,则可以:

  • 减少项目中的引用数。 修整方法引用的最有效方法之一是查看应用程序的依赖关系,因为它们通常是方法引用的最大贡献者之一。
  • 通过启用multidex,将您的应用配置为使用多个DEX文件。

启用Multidex支持的过程会因您的项目支持的Android版本而异。

如果您的目标是Android 5.0或更高版本,那么第一步是打开模块级build.gradle文件并将multiDexEnabled设置为true

android {
   defaultConfig {
       minSdkVersion 21
       multiDexEnabled true

但是,如果您的minSdkVersion为20或更低,则需要添加multiDexEnabled true属性,然后将multidex支持库添加为项目依赖项:

dependencies {
 compile 'com.android.support:multidex:1.0.1'
}

下一步取决于您是否要覆盖Application类。

如果您的项目确实覆盖了Application类,则打开Manifest并将以下内容添加到<application>标记中:

<application
           android:name="android.support.multidex.MultiDexApplication" >
       ...
       ...
       ...
   </application>

如果您的项目没有覆盖Application类,则需要扩展MultiDexApplication

public class MyApplication extends MultiDexApplication

最后,如果您确实重写了Application类但不能更改基类,则可以通过重写attachBaseContext()方法并调用MultiDex.install(this)来启用multidex,例如:

@Override
 protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
 }

3.请选择一个有效的JDK目录

如果您每次尝试构建应用程序时都遇到JDK错误,则意味着Android Studio正在努力寻找JDK在开发计算机上的安装位置。

要解决此错误:

  • 从Android Studio工具栏中选择文件>项目结构…
  • 从左侧菜单中选择“ SDK位置 ”。
  • 确保选中“ 使用嵌入式JDK”复选框。
导航到“文件项目”结构“ SDK位置”,然后选择“使用嵌入式JDK”复选框

如果这不能解决问题,请导航回File> Project structure…> SDK Location ,然后手动输入JDK的完整文件路径。 如果不确定开发计算机上JDK的安装位置,则可以通过打开终端(Mac)或命令提示符(Windows)并输入以下命令来查找:

/usr/libexec/java_home

4.安装APK时出错

虽然AVD非常适合在各种不同的硬件和软件上测试您的应用程序,但您应该始终在至少一台物理Android智能手机或平板电脑上测试您的应用程序。 但是,众所周知,Android Studio能够识别已连接的Android设备的能力受到了打击。

如果您已将设备连接到开发计算机,但每次尝试安装APK时都遇到安装APK错误消息,或者设备甚至没有出现在“ 选择部署目标”窗口中,请尝试以下修复:

检查USB调试是否已启用。

打开设备的“设置” ,然后选择“ 开发人员选项” ,并确保已启用“ USB调试” 。 如果您在“ 设置”菜单中没有看到“ 开发人员选项 ,请选择“ 关于电话”并持续点击“ 内部版本号”,直到出现“ 您现在是开发人员”通知。 返回到“ 设置 ”主屏幕,您应该发现已添加了“ 开发人员选项”

检查您的智能手机或平板电脑的屏幕。

有时,您的设备在连接到开发计算机之前可能需要一些其他输入。 例如,可能要求您在不同的模式之间进行选择,或者明确授权连接。

确保您安装了正确的USB驱动程序。

如果您在Windows上进行开发,则需要为设备下载适当的OEM USB驱动程序 。 如果您是Nexus用户,则可以通过Android Studio的SDK Manager下载Google USB驱动程序。

检查您的设备是否满足项目的最低SDK要求。

您可以在模块级gradle.build文件中找到项目的最低SDK,并可以通过打开设备的“设置”并滑动到“ 关于手机”部分来检查设备上安装了哪个版本的Android。

尝试重新启动adb(Android调试桥)进程。

打开终端或命令提示符窗口,然后更改目录( cd ),使其指向平台工具窗口,例如:

cd /Users/Downloads/adt-bundle-mac/sdk/platform-tools

然后,依次输入以下命令,终止并重新启动adb进程:

./adb kill-server
./adb start-server
重新启动一切!

如果所有其他方法均失败,请尝试断开连接,然后重新连接设备,重新启动设备,重新启动Android Studio,并且绝对不得已时,重新启动开发计算机。

5. INSTALL_FAILED_INSUFFICIENT_STORAGE

如果在尝试安装项目时遇到此错误,则表明目标设备没有足够的内存。

如果要在AVD上安装项目,则应检查已为该特定的AVD分配了多少空间:

  • 启动AVD管理器。
  • 找到有问题的AVD,然后单击随附的“ 编辑此AVD”图标。
  • 在出现的窗口中,点击显示高级设置
  • 滚动到“ 内存和存储”部分。

本节列出了分配给此特定AVD的各种类型的内存。 如果这些值中的任何一个都异常低,那么您应该增加它们以更接近地反映典型的Android智能手机或平板电脑可用的内存:

  • 内存。 仿真设备可用的RAM量。
  • VM堆。 多少堆空间(即内存)分配给模拟的智能手机或平板电脑的虚拟机(VM)。
  • 内部存储器。 仿真设备可用的不可移动内存量。
  • SD卡。 可用的可移动内存量。 如果要使用Android Studio管理的虚拟SD卡,请选择Studio管理的 ,然后输入要创建的虚拟SD卡的大小(最小建议值为100 MB)。 或者,您可以通过选择“ 外部文件” ,然后指定要使用的位置来管理文件中SD卡的“空间”。

如果您的AVD内存没什么奇怪的,或者您尝试在物理Android智能手机或平板电脑上安装您的应用程序,则此错误通常表示您编译的应用程序太大。 在安装时占用大量设备内存的应用程序永远不会崩溃。

如果您需要大幅减少APK的大小,请尝试以下方法:

  • 使用ProGuard删除未使用的类,字段,方法和属性。 要启用ProGuard,请打开您的模块级build.gradle文件并添加以下内容:

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工具栏中选择“ 分析”>“检查代码... ”。
  • 通过将shrinkResources true添加到项目的build.gradle文件来启用资源缩减。
  • 如果需要使用同一图像的变体,请使用同一基础图像并在运行时对其进行自定义,而不是将同一图像的多个版本添加到项目中。 例如,您可以使用android:tinttintMode将不同的颜色应用于图像,还可以使用android:fromDegreesandroid:toDegreesandroid:pivotXandroid:pivotY旋转图像。
  • 优化您的库。 尝试从项目中删除任何不必要的或占用大量内存的库。 如果确实需要使用大型库,请检查是否有任何方法可以针对移动环境优化此库,因为外部库代码通常不会考虑移动性。 您还应该记住,许多库包含大量的本地化字符串。 如果您的应用程序不正式支持这些库,则可以通过告诉Gradle不要在编译的APK中包含这些字符串来减小库的大小。 要指定您的应用正式支持的语言,请打开您的模块级build.gradle文件并使用resConfigs属性。 例如,在这里我们指定我们只想在项目中包括英语字符串:

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

6. ActivityNotFoundException

当对ActivityNotFoundException startActivity(Intent)或其变体之一的调用失败,因为Activity无法执行给定的Intent会发生Activity

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

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

如果您的清单没有发现任何问题,那么还有其他一些可能的原因导致ActivityNotFoundExceptions 。 首先,如果将Activity类从一个程序包移动到另一个程序包后遇到此错误,则可能是您混淆了Android Studio,而只需要清理并重建项目。

一个ActivityNotFoundException也可以如果目标中的错误引起Activity没有正确加载。 要检查项目中是否发生了这种情况,请将意图代码放入try-catch块中:

try {

//Your code here//

} catch ( ActivityNotFoundException e) {
      e.printStackTrace();

}

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

7. ClassCastException

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

Object x = new Integer(0);
System.out.println((String)x);
ImageView image = (ImageView)context.findViewById(R.id.button);

该错误消息包含有关导致ClassCastException错误的行的信息,因此请导航至项目的这一部分,检查正在此处投射的对象,并解决所有不匹配问题。

如果您无法发现转换问题,请考虑您是否最近在布局资源文件中移动了一些Views ,因为一些用户报告说在重新排列其Views后遇到了ClassCastException 。 如果您怀疑这可能是ClassCastException的原因,请告诉Android Studio通过执行清理/重建周期从头开始重新生成布局文件。 这会强制Android Studio正确注册您最近的布局更改,这应该可以解决ClassCastException

8. NullPointerException

在Java中,当您声明引用变量时,实际上是在创建指向对象的指针。 您可以通过为该对象的引用分配空值来声明该对象当前指向未知数据。 空值在编码某些设计模式时很有用,但是如果遇到NullPointerException(NPE),则意味着您试图使用指向空值的引用,就好像它在引用对象一样。 由于在此引用指向的位置没有代码可执行,因此您将获得NPE。

NPE通常伴随着有关捕获此异常的位置的信息,因此Logcat Monitor应该包含发生此错误的确切行。 导航到项目的此区域,并标识等于null的引用。 然后,您需要找到应该设置值的位置,并进行设置。

如果找不到请求的ViewfindViewById方法也可以返回null,因此,如果您的NPE发生在包含findViewById的行中,请检查是否已初始化包含该View的布局。 此外,还要注意findViewById调用中可能存在的任何拼写错误或拼写错误,因为它们也可能导致NPE。

为了避免在项目中发生NPE,请在尝试使用所有对象之前确保对其进行初始化,并在向该对象请求方法或字段之前始终验证变量是否为null。

9.应用程序无响应错误

这是一个错误,在您用来测试应用程序的Android设备或AVD上显示为对话框。 当您的应用程序的UI冻结并且超过五秒钟对用户输入无响应时,将发生“ 应用程序无响应” (ANR)错误。 这通常是因为您的应用正在尝试在Android的主UI线程上执行冗长或密集的操作。

在Android中,主UI线程负责将所有用户输入事件分配到相应的UI小部件,并负责更新应用的UI。 但是,此线程一次只能处理一个任务,因此,如果您使用任何长时间运行或密集的操作来阻塞主线程,则在完成此任务之前,您的UI将完全无响应。

如果在测试应用程序时遇到ANR消息,那么您肯定需要看一下在主线程上执行的工作。 但是,如果您没有明确遇到此错误,但是注意到您的应用有时会显得呆滞或缓慢,则表明您正处于ANR错误的边缘,应再次查看该状态UI线程。

要解决ANR错误(和接近 -ANR的错误),您需要确定所有有可能运行缓慢或需要大量处理能力的操作,然后将其从主线程中移出。 您可以通过创建一个工作线程来执行此操作,在这些工作线程中可以以零风险阻塞主UI线程的方式执行这些操作。

有几种创建其他线程的方法,但是最简单的解决方案是使用AsynTask ,因为此类已经包含自己的工作线程 onPostExecute()回调,您可以使用该回调与Android的主UI线程进行通信。

但是,AsyncTasks更适合执行短后台操作,因此,如果需要执行长时间运行的操作,则应改用ServiceIntentService

尽管将长时间运行且繁重的任务从主线程中移出将对应用程序的性能产生最大影响,但最佳实践是在主UI线程上执行尽可能少的工作。 即使在主线程上运行少量不必要的代码也可能对应用程序的响应性产生影响,因此,一旦成功重新定位了所有长时间运行且费力的操作,您就应该查看是否还有更多代码可以使用离开主线程。

10.只有创建视图层次结构的原始线程才能触摸其视图

在Android中,您只能从主线程更新UI。 如果您尝试从任何其他线程访问UI元素,那么您将遇到此错误。

要解决此问题,请确定后台任务中尝试更新UI的部分并将其移至runOnUiThread ,例如:

runOnUiThread(new Runnable() {
         @Override
          public void run() {

//Update your UI//

      }

});

11. NetworkOnMainThreadException

当您的应用尝试在主线程上执行网络操作(例如发送API请求,连接到远程数据库或下载文件)时,将引发此异常。 由于网络操作可能很耗时且费力,因此它们很可能会阻塞主线程,因此,每当您尝试在主线程上发出网络请求时,Android 3.0(Honeycomb)及更高版本都会抛出此错误。

如果确实遇到NetworkOnMainThreadException ,则找到在主线程上运行的网络代码,然后将其移至单独的线程。

如果确实需要频繁进行联网请求,那么您可能需要看一下Volley ,这是一个HTTP库,它会初始化其自己的后台线程,以便默认情况下在主线程之外执行所有联网请求。

12.活动泄漏了最初在此处添加的窗口

尝试退出活动后显示对话时,会发生此错误。 如果确实遇到此问题,请通过在Activity的onDestroy()onPause()方法中调用dismiss()来打开Activity并确保正确关闭了对话框,例如:

@Override
protected void onDestroy()
{
       super.onDestroy();
        if(pDialogue!= null)
            pDialogue.dismiss();   
            
}

13. OutofMemoryError

当您的应用发出系统无法满足的内存请求时,会发生此错误。 如果遇到此错误消息,请先排除所有最常见的内存管理错误。 检查您是否记得已注销所有广播接收器,并且已停止所有服务; 确保您没有保留任何静态成员变量中的引用,并且没有尝试加载任何大的位图。

如果您已经排除了OutOfMemoryError所有明显原因,那么您将需要更深入地研究并准确检查应用程序如何分配内存,因为有很多地方可以改善应用程序的内存管理。

Android Studio的整个区域致力于帮助您分析应用程序的内存使用情况,因此首先从Android Studio工具栏中选择“ 视图”>“工具窗口 ”。 此时,您将看到一个Android MonitorAndroid Profiler选项,具体取决于您安装的Android Studio版本。

我们之前曾在此网站上讨论过与Memory Monitor一起使用的方法 ,但是由于Android Profiler是Android Studio的新增功能,因此让我们快速看一下它的主要功能。

当您打开Android Profiler时,它将自动开始记录三段信息。

The Android Profiler tracks the apps CPU Memory and Network information automatically

由于我们对应用程序使用内存的方式感兴趣,因此请单击“ 内存”部分,这将启动Memory Profiler

Memory Profiler由一个时间线组成,该时间线显示了您的应用当前正在分配的不同类型的内存,例如Javanativestack 。 在此图上方,您会发现一行图标,可用于触发不同的操作:

  • 强制执行垃圾回收事件。
  • 拍摄应用程序内存的Hprof快照。 这是应用程序堆中所有对象的快照,包括应用程序分配的对象类型,分配的对象数量以及这些对象占用的空间。
  • 记录内存分配。 通过在执行某些操作时记录应用程序的内存分配,可以确定消耗过多内存的特定操作。
The Memory Profiler displays the different kinds of memory your app is allocating

为了确定应用程序中负责OutOfMemoryError ,花一些时间与应用程序交互,并监视应用程序的内存分配如何响应不同的操作而变化。 一旦确定了导致问​​题的项目部分,请花一些时间仔细检查它是否存在内存泄漏以及内存使用效率低下的问题。

结论

在本文中,我们研究了在为Android开发时最可能遇到的13条错误消息。 我们讨论了可能导致这些错误的所有不同因素,以及解决这些问题所需采取的步骤。

如果您遇到了我们未涵盖的错误消息所困扰,那么您的第一步应该是将整个错误消息复制/粘贴到Google中,因为这通常会导致人们在讨论如何解决的话题和博客文章。这个特定的错误。

而且,如果您在网络上的任何地方都找不到解决方案,则可以随时通过将问题发布到Stack Overflow来直接与Android社区联系以寻求帮助。

翻译自: https://code.tutsplus.com/tutorials/how-to-solve-androids-most-common-error-messages--cms-28706

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值