安卓性能优化简单总结

1. APP启动优化

1.1 APP启动黑白屏问题

原因:在入口界面被渲染出来之前,需要一个默认的窗体背景,这个窗体的背景就造成了黑白屏问题
解决方法:为入口界面添加一个主题,用图片来替代默认背景
代码如下
style.xml

  

AndroidManifest.xml

  
        
            

            
        
    

drawable.xml(layer_splash)

    
    
    
     
    
    
   
   
1.2 APP启动慢的问题

影响启动速度主要有两点

  • Application的onCreate
    APP集成第三方SDK时,往往需要在这里做一些初始化操作,少了还可以,当集成的第三方多了,当然耗时了
  • 入口Activity的渲染
    布局过于复杂,嵌套太深

SDK的init方法,解决方案有两种
方案一:
APP启动过程都是主线中进行的,因此我们可以将这些初始化的方法放在一个单独的线程中去。

方案二:
我们可以给这些初始化方法按优先级分个级,启动之后马上就会用到的第三方SDK被定为高优先级,不会马上就用的第三方SDK被定为低优先级,高优先级还是放在Application的onCreate方法里面,低优先级的可以放在入口Activity渲染之后,如onStop方法中做SDK的初始化操作

布局问题的解决方案
减少布局的层级
可以用ViewStub,merge等标签优化布局

2. 布局优化

include 重用布局
merge 减少布局层级
ViewStub 延迟加载布局

3. 内存优化(OOM)

3.1 占用内存过大

bitmap
压缩,手动回收
质量压缩(不改变像素)
改变图片在磁盘中的存储大小
比例压缩(改变像素)
改变图片在内存中的存储大小
百度可搜Luban压缩

频繁地创建对象
合理使用池化对象
如线程池,消息池(Message msg=Message.obtain())

3.2 内存泄漏

可以用leakcanary这个库来检测内存泄漏

Handler
内部类默认持有外部类的引用,而Handler周期往往比Activity生命周期长,从而导致内存泄漏

//泄漏案例
public class MainActivity extends AppCompatActivity{

private  Handler mHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

        }
    };

    Message message = Message.obtain();
    message.what = 1;
    mHandler.sendMessageDelayed(message,10*60*1000);
  }
}

解决方案一

public class MainActivity extends AppCompatActivity {

private Handler mHandler=new Handler(){
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
};


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Message msg=Message.obtain();
    msg.what=1;
    mHandler.sendMessageDelayed(msg,5*60*1000);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null);
  }
}

解决方案二

public class MainActivity extends AppCompatActivity {

private  MyHandler mHandler;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mHandler=new MyHandler(this);

    Message msg=Message.obtain();
    msg.what=1;
    mHandler.sendMessageDelayed(msg,5*60*1000);
}

@Override
protected void onDestroy() {
    super.onDestroy();
  //  mHandler.removeCallbacksAndMessages(null);
}

private static class MyHandler extends Handler{

    private WeakReference mActivity;

    public MyHandler(MainActivity activity){
        mActivity=new WeakReference<>(activity);
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
    }
  }
}

单利模式
静态对象持有Activity的上下文对象,但静态实例的生命周期和Application的生命周期一致,从而导致内存泄漏

这个就不搬代码了,解决方法也很简单
用 context.getApplicationContext() 替代 context即可

广播未注销

Cursor,IO等对象未及时关闭

Bitmap未使用recycle()进行回收

4. ANR(只有主线程会发生)

(1) 主线程对输入事件5秒内没有处理完毕
(2)主线程在执行BroadcastReceiver的onReceive()函数时10秒内没有处理完毕
(3) 主线程在Service的各个生命周期函数时20秒内没有处理完毕。
上述3点发生其一就会发生ANR现象

解决方法
将耗时操作交给子线程,减少主线程的负荷

5. APK包瘦身

  • 优化代码,去除冗余代码
  • 对代码进行混淆
  • 可以只用一套图片,最好的方案是用字体库代替图片
  • 减少so库,可以只保留armeabi-v7a文件下的即可

你可能感兴趣的:(安卓性能优化简单总结)