You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 6应用二次启动崩溃问题求助(附崩溃日志)

Android 6应用二次启动崩溃问题解决

问题现象

  • 首次安装应用可正常运行,第二次启动时无响应崩溃
  • 删除应用数据后重启可恢复,但无法每次手动执行清理操作
  • 应用数据仅约3MB

崩溃日志

2022-10-15 21:05:55.389 32404-32404/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.my.app, PID: 32404
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/com.my.app.MainActivity}: android.view.InflateException: Binary XML file line #12: Binary XML file line #36: Error inflating class android.widget.ListView
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
        at android.app.ActivityThread.access$1100(ActivityThread.java:221)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:158)
        at android.app.ActivityThread.main(ActivityThread.java:7225)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
     Caused by: android.view.InflateException: Binary XML file line #12: Binary XML file line #36: Error inflating class android.widget.ListView
        at android.view.LayoutInflater.inflate(LayoutInflater.java:551)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:429)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:380)
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
        at com.rif3i.alashaeatliashiratalsaaea.MainActivity.onCreate(MainActivity.java:97)
        at android.app.Activity.performCreate(Activity.java:6876)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7225) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
     Caused by: android.view.InflateException: Binary XML file line #36: Error inflating class android.widget.ListView
        at android.view.LayoutInflater.createView(LayoutInflater.java:657)
        at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58)
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:706)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:774)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:847)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:855)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:843)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001)
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:843)
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:527)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:380) 
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696) 
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170) 
        at com.rif3i.alashaeatliashiratalsaaea.MainActivity.onCreate(MainActivity.java:97) 
        at android.app.Activity.performCreate(Activity.java:6876) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7225) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Constructor.newInstance(Native Method)
        at android.view.LayoutInflater.createView(LayoutInflater.java:631)
        at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:58) 
        at android.view.LayoutInflater.onCreateView(LayoutInflater.java:706) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:774) 
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:716) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:847) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:855) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:843) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
        at android.view.LayoutInflater.parseInclude(LayoutInflater.java:1001) 
        at android.view.LayoutInflater.rInflate(LayoutInflater.java:843) 
        at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:810) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:527) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:429) 
        at android.view.LayoutInflater.inflate(LayoutInflater.java:380) 
        at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696) 
        at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170) 
        at com.rif3i.alashaeatliashiratalsaaea.MainActivity.onCreate(MainActivity.java:97) 
        at android.app.Activity.performCreate(Activity.java:6876) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:158) 
        at android.app.ActivityThread.main(ActivityThread.java:7225) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
     Caused by: java.lang.OutOfMemoryError: Failed to allocate a 756236 byte allocation with 275456 free bytes and 269KB until OOM
        at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
        at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
        at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:856)
        at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:675)
        at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:2228)
        at android.content.res.Resources.loadDrawableForCookie(Resources.java:4215)
        at android.content.res.Resources.loadDrawable(Resources.java:4089)
        at android.content.res.Resources.loadDrawable(Resources.java:3939)
        at android.content.res

问题根因

从日志可见,崩溃核心原因是OutOfMemoryError:启动时加载ListView布局,解码图片时内存不足。首次启动正常、二次启动崩溃,说明首次启动后Bitmap资源未被正确回收,或存在内存泄漏,导致二次启动时剩余内存不足以加载图片。

解决方案

一、根本解决OOM问题

1. 优化Bitmap加载

  • 压缩图片尺寸:使用BitmapFactory.Options设置inSampleSize,按比例缩小图片后加载,减少内存占用:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2; // 图片宽高均为原尺寸的1/2,内存占用为原1/4
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image, options);
  • 复用Bitmap对象:设置inBitmap选项,复用已存在的Bitmap,避免重复分配内存:
options.inBitmap = reusableBitmap; // 需确保reusableBitmap的尺寸和格式与要加载的图片兼容
  • 及时释放资源:在Activity销毁时,清空ListView的Adapter,回收所有Bitmap:
@Override
protected void onDestroy() {
    super.onDestroy();
    if (listView.getAdapter() != null) {
        ((BaseAdapter) listView.getAdapter()).clear();
    }
    // 手动回收Bitmap
    if (bitmap != null && !bitmap.isRecycled()) {
        bitmap.recycle();
        bitmap = null;
    }
    System.gc();
}

2. 排查布局与资源问题

  • 检查ListView的Item布局中是否引用了大尺寸图片,改用压缩后的资源
  • 避免在XML布局中直接设置大尺寸背景图,改用代码动态加载并压缩

3. 排查内存泄漏

  • 检查是否存在静态变量持有Activity、ListView或Bitmap实例,导致GC无法回收
  • 使用Android Studio的Profiler工具,分析内存快照,定位泄漏点

二、临时方案:应用退出时自动清理数据

若暂时无法彻底修复OOM,可实现退出时自动清理应用数据,模拟手动清理效果。注意:此操作会清除用户设置、本地缓存等所有数据,需评估业务影响。

代码实现

@Override
protected void onDestroy() {
    super.onDestroy();
    // 清除SharedPreferences
    SharedPreferences sp = getSharedPreferences("your_sp_name", MODE_PRIVATE);
    sp.edit().clear().apply();
    
    // 清除数据库
    deleteDatabase("your_db_name.db");
    
    // 清除文件目录
    deleteDir(getCacheDir());
    deleteDir(getFilesDir());
}

private boolean deleteDir(File dir) {
    if (dir == null || !dir.isDirectory()) return false;
    for (File file : dir.listFiles()) {
        if (file.isDirectory()) {
            if (!deleteDir(file)) return false;
        } else if (!file.delete()) {
            return false;
        }
    }
    return dir.delete();
}

内容的提问来源于stack exchange,提问作者abo3bdo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:40:33