Android优化

2023-11-17

一、布局优化

      布局优化就是删除布局中无用的控件和层级,可以用Hierarchy Viewer工具来检测,其次有选择地使用性能较低的ViewGroup。

  • include标签

     include标签只支持以android:layout开头的属性,比如android:layout_width;android:layout_height等,其他属性不支持,比如android:background.当然属性id还是支持的,如果include制定了这个id属性,同时被包含的布局文件也指定了id属性,那么以<include>指定的id属性为准,需要注意的是,如果include指定了android:layout_*这种属性,那么width,height必须存在,否则其他的android:layout形式的属性无法生效。

  • merge标签

      merge标签一般和include标签一起使用从而减少布局的层级,由于当前布局是一个竖直方向的Linearlayout,被包含的布局文件中的根布局也是Linearlayout,显然这个Linearlayout是多余的,通过merge标签就可以去掉多余的这一层。

  • ViewStub

      ViewStub继承了View,它非常轻量级且宽/高都是0,因此它本身不参与任何的布局和绘制过程。ViewStub的意义在于按需加载所需的布局文件,在使用的时候再加载,提高了程序初始化时的性能。例子如下:

 <ViewStub
     android:id="@+id/tv"
     android:layout_width="match_parent"
     android:layout_height="wrap_content" />

   //用法一
  ((ViewStub)findViewById(R.id.tv)).setVisibility(View.VISIBLE);
  //用法二
  View view=((ViewStub)findViewById(R.id.tv)).inflate();

二、卡顿优化

1、绘制优化  onDraw

 (1)首先,onDraw中不要创建新的局部对象,这是因为onDraw方法可能会被频繁调用,这样一瞬间产生大量的临时对象,不仅占用过多的内存而且还频繁GC,降低了程序的执行效率。

(2)在onDraw中不要做耗时的操作,也不能执行成千上万的循环操作。View的绘制帧率保证60fps是最佳的,这就要求每帧的绘制时间不超过16ms(16ms=1000/60)。

2、过度绘制  使用手机开发者模式GPU

3、事件冲突

4、处理数据,内存抖动

 

三、内存泄漏优化

  • 1、静态变量导致的内存泄漏
public  class  MainActivity  extends  Activity{

     private  static  Context  sContext;
     
     protected  void   onCreate(Bundle  savedInstanceState){
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);  
       sContext=this;
     }
}
  • 单利模式导致的内存泄漏

      (1)如果参数是context,不要用某个activity的context,使用application的context。

  • 观察者模式类型的

       只注册,未反注册

private List<DataListener>  list=new ArrayList<>();

public void  registerListener(DataListener  listener){
     list.add(listener);
}

public void  unRegisterListner(DataListener  listener){
    list.remove(listener);
}
  • 属性动画导致的内存泄漏

      属性动画中的无线循环动画,如果没有在activity的ondestory()方法中去停止动画,尽管看不到动画效果,但是动画会一直播放下去,这时候动画持有了view,view只有了activity,最终activity无法释放,调用animator.cancel()来停止动画。

ObjectAnimatior  animatior=ObjectAnimatior.ofFloat(mButton,"rotation",0,360).setDuration(2000);
animator.cancel();
  • 数据库导致的内存泄漏
  • 自定义view中获取自定义属性,没有释放recycle
  • 非静态内部类导致的内存泄漏(handler)
  • Bitmap未释放
  • 强引用,弱引用,软应用,虚引用类型
  • 点9图片
  • webview

 

四、响应速度优化

       响应速度优化的核心思想是避免在主线程中做耗时操作,如果在主线程中做耗时操作,activity启动时出现黑屏现象,甚至出现ANR,所以耗时操作在工作线程中完成。

(1)数据传递  序列化

(2)ANR    Application  Not   Responding应用程序无响应

    以下四个条件都可以造成ANR:

  • InputDispatching   Timeout     5s没无法响应屏幕触摸事件或键盘输入事件
  • BroadcastQueue  Timeout   在执行前台广播(BroadcastRrceiver)的onReceive()函数时10s没有处理完成,后台为60s
  • Service  Timeout   前台服务20s内,后台服务在200s内没有执行完毕
  • ContentProvicer  Timeout      ContentProvider的publish在10s内没进行完

四、启动优化

1、分类 

  • 冷启动       

           现象:  点击app的icon,显示白屏或者黑屏

  冷启动流程:  加载启动app-->app启动之后展示一个空白的window-->创建app进程-->创建app对象-->启动MainThread-->创建启动的activity对象-->加载view

    解决办法:1、设置默认启动activity的主题里面windowback属性为透明

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@null</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowDisablePreview">@null</item>
</style>

                      2、设置默认启动activity的主题里面windowback属性为默认图片

<style name="SplashTheme" parent="AppTheme">
    <item name="android:windowBackground">@drawable/abc_vector_test</item>
    <item name="android:windowContentOverlay">@null</item>
     <item name="android:windowDisablePreview">@null</item>
</style>

                    3、上面的1,2方法只是治标,辅以下面方法

                           applicaiton的oncreate方法初始化各种sdk判断是否在当前进程

                           applicaiton的onCreate方法不做耗时操作

                           sdk的初始化如果可以最好延迟加载 

 

  •  热启动

    最快,从后台到前台

  •  温启动

2、启动时间测量方式

  • adb命令(不严谨,线下使用方便,不能线上使用)

     ThisTime:最后一个activity启动耗时

     TotalTime:所有Activity启动耗时

     WaitTime:AMS启动Activity的总耗时

  • 手动打点(精确,可带到线上,进行统计)
public class SingleApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        //记录开始时间
    }
//在activity中加载完xml,记录结束时间

(3)启动优化工具

         两种工具互补

   traceview

     图形的形式展示执行时间,调用栈等,信息全面,包含所有线程

    使用方式:

   Debug.startMethodTracing("文件名")

   Debug.stopMetodTracing();

   生成文件在sd卡:Android/data/packagename/files/名字.trace

五、耗电优化

六、安装包大小优化

  • res图片一套,删除无用的文件
  • 代码混淆

七、线程优化

       使用线程池

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android优化 的相关文章

  • java.lang.IllegalArgumentException:此组件要求您指定有效的 android:textAppearance 属性

    我的布局文件之一中有一个 com google android material button MaterialButton 组件 当我使用最新版本的 Material Components 库 com google android mat
  • 设置文本视图 Android 的文本颜色

    在 string xml 文件中我使用以下标签
  • gradle更新后无法找到方法(无法编译项目)

    我尝试将项目中的 gradle 版本更新为 4 1 milestone 1 以下这些说明 https developer android com studio build gradle plugin 3 0 0 migration html
  • Android短音的正确播放方法?

    我正在创建一个应用程序 屏幕上将有多个图像 这些图像将是按钮 点击时会播放短促的声音 我对此进行了研究 只能找到我当前用来播放声音的方法 这似乎根本没有响应 我希望声音能够快速播放并且能够响应多次快速点击 我不确定这在 Android 中是
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • 将现有 VARCHAR 列与 Room 结合使用

    我正在尝试将现有的数据库与 Android Room 一起使用 但是 我的一个表有一个 VARCHAR 列 Room 似乎只支持 TEXT 不支持 VARCHAR 而且 sqlite 不允许修改列类型 那么 有没有办法使用Room中现有的带
  • Dialog.setTitle 不显示标题

    我正在尝试向我的对话框添加自定义标题 但是每当我运行我的应用程序时 它都不会显示标题 我创建对话框的代码是 final Dialog passwordDialog new Dialog this passwordDialog setCont
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android Eclipse 上的 Web 服务

    我是 android eclipse java 的新手 事实上这个论坛也是如此 有人遇到过这种情况吗 从用户那里获取输入并通过使用 android eclipse 中的 Web 服务来显示适当的结果 有可用的示例吗 非常感谢 我正在发布教程
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 通过电子邮件发送文本文件附件

    我正在尝试附加一个文本文件以便通过电子邮件发送 但每当我打开电子邮件应用程序时 它都会说该文件不存在 请帮助 Intent i new Intent Intent ACTION SEND i setType text plain i put
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你

随机推荐

  • MongoDB 非正常关机/意外关机(拉电闸)后无法启动的解决方案

    一 环境 Host CentOS 7 9 Version MongoDB 5 Install 二进制 二 说明 公司某天电闸突然跳闸 导致服务器重启后 伴随的自启动服务 MongoDB 启动失败 具体报错如下所示 三 排查 1 查看启动状态
  • IDEA:Warning: No artifacts configured FIX

    问题 办法 Warning No artifacts configured 警告 未配置项目 给idea项目添加tomcat的时候出现 解决办法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 现在还不够 16 17
  • QT连接SQLserver详细教程

    Qt 连接 SQL Sever数据库 环境 一 配置 ODBC数据源 一 在SQL Sever Manger中添加 新的用户 1 打开如下自带的 MSS Management Studio 2 登录时选择 Windows 身份验证 3 去往
  • 在python中使用python-docx实现word文档自动化

    五一马上就要结束了 趁着今天休息的一天 给大家说说在python对办公文档处理 文章中说要详细的介绍python中几个对文档处理的库 今天就介绍一下word文档处理的python docx库 好了废话不多说开始吧 哈哈哈哈哈哈哈啊哈哈 py
  • 学习MongoDB 三: MongoDB无法启动的解决方法

    一简介 我们之前介绍了MongoDB入门 安装与配置 我们今天在打开MongDB时 我们先运行cmd exe进入dos命令界面 然后进入cd D mongodb bin目录下 启动服务或者mongo命令都报了错误 二 解决 1 net st
  • vue实现三级联动

    div div
  • 图片在盒子内等比展示不变形

    通过这个属性 object fit cover 使用场景如下 fatherBox 父盒子要有宽高 width 240px height 240px sonBox 子盒子 width 100 height 100 object fit cov
  • 7种Git错误以及解决方法

    使用Git的时候如果出现报错 要会解决Git错误 以下整理了七种Git错误以及解决的方法 1 当出现fatal not a git repository or any of the parent directories git时 说明不是一
  • vector find() 用法

    int main vector
  • STM32的PA0输出高电平的具体库函数代码操作

    在STM32中 可以使用库函数控制PA0输出高电平 具体的代码如下 初始化GPIOA的引脚模式 设置PA0为输出模式 GPIO InitTypeDef GPIO InitStruct HAL RCC GPIOA CLK ENABLE GPI
  • Score SDE 三种随机微分方程代码解读

    定义SDE类 定义了7个子函数 T End time of the SDE sde marginal prob Parameters to determine the marginal distribution of the SDE p t
  • 计算机二级-简单应用题

    题目要求 编写代码 以实现如下功能 键盘输入小明学习的课程名称及考分等信息 信息间采用空格分隔 每个课程一行 空行回车结束录入 示例格式如下 数学 90 语文 95 英语 86 物理 84 生物 87 屏幕输出得分最高的课程及成绩 得分最低
  • 去除指定css属性

    使得指定css样式失效 layui btn background image initial important 优先使用 layui btn background image initial important padding 0 10p
  • 像程序员一样思考_如何像程序员一样思考-解决问题的经验教训

    像程序员一样思考 by Richard Reis 理查德 里斯 Richard Reis 如何像程序员一样思考 解决问题的经验教训 How to think like a programmer lessons in problem solv
  • Vue-router2.0基础,秒会。

    如果不是模块式开发 请先引入 1 0基础 div h1 Hello App h1 p p div
  • Docker打开远程API服务

    一 开发环境 1 系统环境 2 docker版本 二 步骤 1 查看docker配置文件路径 2 编辑配置文件 3 重启docker 三 测试 1 查看docker客户端服务端版本 docker H localhost 2375 versi
  • C++ 在一个程序中调用exe

    生成exe的代码 include
  • StarRocks 运维工具 StarGo

    优质资源分享 学习路线指引 点击解锁 知识定位 人群定位 Python实战微信订餐小程序 进阶级 本课程是python flask 微信小程序的完美结合 从项目搭建到腾讯云部署上线 打造一个全栈订餐系统 Python量化交易实战 入门级 手
  • Spring Boot Admin 监控告警

    Spring Boot Admin 监控告警 要进行监控 需要两个Project 一个是Admin Server端 负责监控Spring boot的项目 另一个是Admin Client端 是被监控的Spring boot服务 当然也可以一
  • Android优化

    一 布局优化 布局优化就是删除布局中无用的控件和层级 可以用Hierarchy Viewer工具来检测 其次有选择地使用性能较低的ViewGroup include标签 include标签只支持以android layout开头的属性 比如