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
相关产品推荐
相关产品推荐

