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

合并Android项目后触发java.lang.OutOfMemoryError问题求助

解决Android合并项目后的OutOfMemoryError问题

嘿,看了你的Logcat日志,问题一目了然——OutOfMemoryError,而且是在加载Bitmap资源时触发的:系统尝试分配约58MB的内存来解码图片,但当前App剩余内存不足,直接导致崩溃,崩溃点在你的tab1Home.java第20行加载布局的位置。

先贴出你的错误日志方便参考:

01-22 17:21:57.659 21340-21340/innotech.inlearn E/AndroidRuntime: FATAL EXCEPTION: main Process: innotech.inlearn, PID: 21340 java.lang.OutOfMemoryError: Failed to allocate a 58982412 byte allocation with 4182376 free bytes and 51MB until OOM at dalvik.system.VMRuntime.newNonMovableArray(Native Method) at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method) at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:655) at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:483) at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:1157) at android.content.res.ResourcesImpl.loadDrawableForCookie(ResourcesImpl.java:794) at android.content.res.ResourcesImpl.loadDrawable(ResourcesImpl.java:645) at android.content.res.Resources.loadDrawable(Resources.java:976) at android.content.res.TypedArray.getDrawable(TypedArray.java:931) at android.view.View.<init>(View.java:4274) at android.widget.TextView.<init>(TextView.java:737) at android.widget.Button.<init>(Button.java:109) at android.widget.Button.<init>(Button.java:105) at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:71) at android.support.v7.widget.AppCompatButton.<init>(AppCompatButton.java:67) at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:109) at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1024) at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1081) at android.view.LayoutInflater$FactoryMerger.onCreateView(LayoutInflater.java:192) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:769) at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) at android.view.LayoutInflater.rInflate(LayoutInflater.java:858) at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821) at android.view.LayoutInflater.inflate(LayoutInflater.java:518) at android.view.LayoutInflater.inflate(LayoutInflater.java:426) at innotech.inlearn.tab1Home.onCreateView(tab1Home.java:20) at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:799) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2580) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2367) at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2322) at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2199) at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:145) at android.support.v4.view.ViewPager.populate(ViewPager.java:1236) at android.support.v4.view.ViewPager.populate(ViewPager.java:1084) at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1614) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714) at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:91) at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1361) at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:784) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.widget.FrameLayout.onMeasure(FrameLayout.java:214) 01-22 17:21:57.660 21340-21340/innotech.inlearn E/AndroidRuntime: at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1705) at android.widget.LinearLayout.measureVertical(LinearLayout.java:797) at android.widget.LinearLayout.onMeasure(LinearLayout.java:657) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.widget.FrameLayout.onMeasure(FrameLayout.java:214) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1705) at android.widget.LinearLayout.measureVertical(LinearLayout.java:797) at android.widget.LinearLayout.onMeasure(LinearLayout.java:657) at android.view.View.measure(View.java:20132) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6282) at android.widget.FrameLayout.onMeasure(FrameLayout.java:214) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:714) at android.view.View.measure(View.java:20132) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2640) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1577) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1846) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1462) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6965) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:907) at android.view.Choreographer.doCallbacks(Choreographer.java:709) at android.view.Choreographer.doFrame(Choreographer.java:644) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:893) at android.os.Handler.handleCallback(Handler.java:836) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:203) at android.app.ActivityThread.main(ActivityThread.java:6361) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1063) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)

接下来给你几个针对性的解决步骤,都是新手能上手的:

  • 先排查超大图片资源
    日志里显示是加载Button的Drawable时出的问题,你去看看tab1Home对应的布局文件里,所有Button或者带背景图的View,用的图片是不是尺寸过大?比如本来只需要200x200px的按钮背景,你放了一个4000x4000px的原图,这会直接占用巨量内存。
    解决办法:用图片工具(比如Photoshop、在线压缩工具)把图片压缩到合适尺寸,并且按照Android的dpi规范,把不同分辨率的图片放到对应的drawable-hdpi、drawable-xhdpi等文件夹里,不要把所有图都丢进drawable默认文件夹。

  • 优化Bitmap加载逻辑
    如果必须使用大尺寸图片(比如全屏背景),不要让系统直接解码原图,用BitmapFactory.Options进行采样压缩:

    // 在加载图片的地方加入这段代码
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4; // 采样率,数值越大压缩比例越高,比如4就是把宽高都缩小为原来的1/4,内存占用变成1/16
    Bitmap compressedBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_large_image, options);
    // 然后把这个压缩后的Bitmap设置给View
    yourView.setBackground(new BitmapDrawable(getResources(), compressedBitmap));
    

    另外更省心的方式是用Glide这类图片加载库,它会自动处理图片压缩、内存缓存和回收,比手动处理靠谱多了,只需要几行代码就能搞定。

  • 检查合并项目带来的内存泄漏
    合并多个项目时,很容易出现Fragment没有正确销毁、持有Activity引用等内存泄漏问题,导致内存被占满。你可以用Android Studio自带的Profiler工具(打开View > Tool Windows > Profiler,选择Memory面板),观察App运行时的内存变化,看看有没有内存持续增长不回收的情况。

  • 临时应急方案(不推荐长期使用)
    如果你赶毕业论文时间,暂时来不及优化图片和代码,可以在AndroidManifest.xml的<application>标签里加上android:largeHeap="true",让系统给你的App分配更多内存:

    <application
        android:name=".YourApplication"
        android:largeHeap="true"
        ...>
        ...
    </application>
    

    注意这只是权宜之计,不能从根本上解决问题,而且不同设备的最大heap限制不一样,还是建议优先优化图片资源。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:16:13