史上最全Android性能优化方案解析

2023-11-19

Android中的性能优分为以下几个方面:

布局优化

网络优化

安装包优化

内存优化

卡顿优化

启动优化

……

一.布局优化

布局优化的本质就是减少View的层级。常见的布局优化方案如下:

  • 在LinearLayout和RelativeLayout都可以完成布局的情况下优先选择LinearLayout,可以减少View的层级,但是注意相同组件可能RelativeLayout绘制时间长

  • 使用 < include > 标签将常用的布局组件共同的部分抽取出来,以便复用。

  • 通过 < ViewStub > 标签来加载不常用的布局,延迟加载(需要的时候在activity中加载出来)

  • 使用 < Merge > 标签来减少布局的嵌套层次

二.绘制优化

绘制优化是指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面:

1.onDraw中不要创建新的局部对象。

因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁gc,降低了程序的执行效率。

2.onDraw方法中不要做耗时的任务,

不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。

按照Google官方给出的性能优化典范中的标准,View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。

三.网络优化

常见的网络优化方案如下:

  • 尽量减少网络请求,能够合并的就尽量合并

  • 避免DNS解析,根据域名查询可能会耗费上百毫秒的时间,也可能存在DNS劫持的风险。可以根据业务需求采用增加动态更新IP的方式,或者在IP方式访问失败时切换到域名访问方式。

  • 大量数据的加载采用分页的方式

  • 网络数据传输采用GZIP压缩

  • 加入网络数据的缓存,避免频繁请求网络

  • 上传图片时,在必要的时候压缩图片

四.安装包优化

  • 安装包优化的核心就是减少apk的体积,常见的方案如下:

  • 减少应用中不必要的资源文件,比如图片,在不影响APP效果的情况下尽量压缩图片,有一定的效果

  • 在使用了SO库的时候优先保留v7版本的SO库,删掉其他版本的SO库。原因是在2018年,v7版本的SO库可以满足市面上绝大多数的要求,可能八九年前的手机满足不了,但我们也没必要去适配老掉牙的手机。实际开发中减少apk体积的效果是十分显著的,如果你使用了很多SO库,比方说一个版本的SO库一共10M,那么只保留v7版本,删掉armeabi和v8版本的SO库,一共可以减少20M的体积。

  • res资源优化

    (1)只使用一套图片,使用高分辨率的图片。

    (2)UI设计在ps安装TinyPNG插件,对图片进行无损压缩。

    (3)svg图片:一些图片的描述,牺牲CPU的计算能力的,节省空间。使用的原则:简单的图标。

    (4)图片使用WebP(https://developers.google.com/speed/webp/)的格式(Facebook、腾讯、淘宝在用。)缺点:加载相比于PNG要慢很多。但是配置比较高。工具:http://isparta.github.io/

    (5)使用tintcolor(android - Change drawable color programmatically)实现按钮反选效果。

  • 代码优化

    (1)实现功能模块的逻辑简化

    (2)Lint工具检查无用文件将无用的资源列在“UnusedResources: Unused resources”,删除。

    (3)移除无用的依赖库。

  • lib资源优化

    (1)动态下载的资源。

    (2)一些模块的插件化动态添加。

    (3)so文件的剪裁和压缩。

  • assets资源优化

    (1)音频文件最好使用有损压缩的格式,比如采用opus、mp3等格式,但是最好不要使用无损压缩的音乐格式

    (2)对ttf字体文件压缩,可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时,其实只需要数字字体,但是使用原有的字体库可能需要10MB大小,如果只是把你需要的字体提取出来生成的字体文件只有10KB

  • 代码混淆。

  • 使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。

  • 插件化

  • 可将功能模块放服务器,需要用时再加载。

  • 7z极限压缩

五.Android内存优化

1.Android内存管理机制

Android应用都是在Android虚拟机上运行的,内存分配和垃圾回收都是由Android虚拟机来完成的。

2.常见的内存泄漏

其实内存泄漏的本质就是较长生命周期的对象引用了较短生命周期的对象。

2.1 内存泄露

内存泄漏原因:堆上分配的对象已经不会再使用,但是GC收集器无法对其进行回收,此对象被强应用所引用 。

  • 静态变量导致的内存泄漏

    解决办法:将内部类设为静态内部类或独立出来;使用context.getApplicationContext()。

  • 单例模式导致的内存泄漏

    解决办法:传参context.getApplicationContext()。

  • 属性动画导致的内存泄漏

    解决办法:在Activity.onDestroy()中调用Animator.cancel()停止动画。

  • Handler导致的内存泄漏

    解决办法:使用静态内部类+WeakReference弱引用;当外部类结束生命周期时清空消息队列。

  • 线程导致的内存泄漏

    解决办法:将AsyncTask和Runnable设为静态内部类或独立出来;在线程内部采用弱引用保存Context引用。

  • 资源未关闭导致的内存泄漏

    解决办法:在Activity销毁的时候要及时关闭或者注销。例如:

    ① BraodcastReceiver:调用unregisterReceiver()注销;

    ②Cursor,Stream、File:调用close()关闭;

    ③Bitmap:调用recycle()释放内存(2.3版本后无需手动)。

  • Adapter导致的内存泄漏

    详情:不使用缓存而只依靠getView() 每次重新实例化Item,会给gc制造压力。

    解决办法:在构造Adapter时使用缓存的convertView。

  • WebView导致的内存泄漏。

    详情:WebView比较特殊,即使是调用了它的destroy方法,依然会导致内存泄漏。

    解决办法:其实避免WebView导致内存泄漏的最好方法就是让WebView所在的Activity处于另一个进程中,当这个Activity结束时杀死当前WebView所处的进程即可,我记得阿里钉钉的WebView就是另外开启的一个进程,应该也是采用这种方法避免内存泄漏。

  • 集合类泄漏

    详情:比如全局map等有静态应用,最后没有做删除。

    解决办法:在onDestry时回收不需要的集合。

2.2 扩大内存

大厂的SDK可能内存泄漏会少一些,但一些小厂的SDK质量也就不太靠谱一些。那应对这种我们无法改变的情况,最好的办法就是扩大内存。

扩大内存通常有两种方法:

  • 一个是在清单文件中的Application下添加largeHeap="true"这个属性,另一个就是同一个应用开启多个进程来扩大一个应用的总内存空间。

  • 第二种方法其实就很常见了,比方说我使用过个推的SDK,个推的Service其实就是处在另外一个单独的进程中。

  • Android中的内存优化总的来说就是开源和节流,开源就是扩大内存,节流就是避免内存泄漏。

2.3 检测、分析内存泄漏的工具

  • MemoryMonitor:随时间变化,内存占用的变化情况

  • MAT:输入HRPOF文件,输出分析结果

  • a. Histogram:查看不同类型对象及其大小

  • b.DominateTree:对象占用内存及其引用关系

  • c.MAT使用教程

  • LeakCanary:实时监测内存泄漏的库(LeakCanary原理)

六.卡顿优化方案

  • 不要在主线程进行网络访问/大文件的IO操作

  • 绘制UI时,尽量减少绘制UI层次;减少不必要的view嵌套,可以用Hierarchy Viewer工具来检测,后面会详细讲;

  • 当我们的布局是用的FrameLayout的时候,我们可以把它改成merge,可以避免自己的帧布局和系统的ContentFrameLayout帧布局重叠造成重复计算(measure和layout)

  • 提高显示速度,使用ViewStub:当加载的时候才会占用。不加载的时候就是隐藏的,仅仅占用位置。

  • 在view层级相同的情况下,尽量使用 LinerLayout而不是RelativeLayout;因为RelativeLayout在测量的时候会测量二次,而LinerLayout测量一次,可以看下它们的源码;

  • 删除控件中无用的属性;

  • 布局复用.比如listView 布局复用

  • 尽量避免过度绘制(overdraw),比如:背景经常容易造成过度绘制。由于我们布局设置了背景,同时用到的MaterialDesign的主题会默认给一个背景。这时应该把主题添加的背景去掉;还有移除

  • XML 中非必须的背景

  • 自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。也是避免过度绘制.

  • 启动优化,启动速度的监控,发现影响启动速度的问题所在,优化启动逻辑,提高应用的启动速度。比如闪屏页面,合理优化布局,加载逻辑优化,数据准备.

  • 合理的刷新机制,尽量减少刷新次数,尽量避免后台有高的 CPU 线程运行,缩小刷新区域。

七.耗电优化

耗电的原因其实很多,这里我就讲一下几种优化方案,优化方案的反面就是他的原因了,几种优化方案如下:

  • 合理的使用wake_lock锁,wake_lock锁主要是相对系统的休眠(这里就是为了省电,才做休)而言的,意思就是我的程序给CPU加了这个锁那系统就不会休眠了,这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些问题,比如微信等及时通讯的心跳包会在熄屏不久后停止网络访问等问题。所以微信里面是有大量使用到了wake_lock锁。

  • 使用jobScheduler2,集中处理一些网络请求,有些不用很及时的处理可以放在充电的时候处理,比如,图片的处理,APP下载更新等等;

  • 计算优化,避开浮点运算等。

  • 数据在网络上传输时,尽量压缩数据后再传输,建议用FlatBuffer序列化技术,这个比json效率高很多倍,不了解FlatBuffer,建议找资料学习一下。

针对“性能优化”这个要点,分享给大家一份《360°全方位Android性能优化解析》,这份学习手册将会带领大家一步一步深入探索Android的性能优化,让产品的性能从各个方面得到提升,希望大家喜欢。
这份资料一共有721页,4个大点,25个小章节,不仅仅有详细的底层原理的解析,还有专门的实践案例!

《360°全方位Android性能优化解析》

第一章 设计思想与代码质量优化

1.六大原则

  • 单一职责原则

  • 里氏替换原则

  • 依赖倒转原则

  • 接口隔离原则

  • ……

2.设计模式

  • 结构型模式:桥接模式、适配器模式、装饰器模式、代理模式、门面(外观)模式……

  • 创建型模式:建造者模式、单例模式、抽象工厂模式、工厂方法模式……

  • 数据结构:数组、栈、队列、链表、树……

  • 算法:排序算法、查找算法……

image.png

第二章 程序性能优化

1.启动速度与执行效率优化

  • 冷启动和热启动解析

  • APP 启动黑白屏解决办法

  • APP 卡顿问题分析及解决方案

  • 启动速度与执行效率优化之 StrictMode

  • ……

2.布局检测与优化

  • 布局层级优化

  • 过度渲染

  • ……

3.内存优化

  • 内存抖动和内存泄漏

  • 内存大户

  • Bitmap 内存优化

  • Profile 内存监测工具

  • Mat 大对象与泄漏检测

  • 耗电优化

  • 网络传输与数据存储优化网络传输与数据存储优化

  • APK 大小优化

  • 屏幕适配

  • ……

4.耗电优化

  • Doze&Standby

  • Battery Historian

  • JobScheduler

  • WorkManager

5.网络传输与数据存储优化

  • google 序列化工具 protobuf

  • 7z 极限压缩

  • ……

6.APK 大小优化

  • APK 瘦身

  • 微信资源混淆原理

  • ……

image.png

7.屏幕适配

  • 进行适配的原理

  • 屏幕分辨率限定符与 smallestWidth 限定符适配原理

  • 为什么选择 smallestWidth 限定符适配

  • 怎么适配其他 module

  • 常见问题处理

    ……

8.OOM 问题原理解析

  • adj 内存管理机制

  • JVM 内存回收机制与 GC 算法解析

  • 生命周期相关问题总结

  • Bitmap 压缩方案总结

  • ……

9.ANR 问题解析

  • AMS 系统时间调节原理

  • 程序等待原理分析

  • ANR 问题解决方案

  • ……

10.Crash 监控方案

  • Java 层监控方案

  • Nativie 层监控方案

  • ……

image.png

第三章 开发效率优化

  1. 分布式版本控制系统 Git

企业高效持续集成平台场景介绍

GIT 分布式版本控制系统

  • GIT 分支管理

  • ……

2.自动化构建系统 Gradle:

  • Gradle 与 Android 插件:gradle 与 android gradle 插件的关系、Gradle Transform API 的基本使用……

  • Gradle Transform API 的基本使用:什么是 Transform、Transform 的使用场景、Transform API 学习、输入的类型……

  • 自定义插件开发:Gradle 插件简介、开始准备、实践、自定义 Gradle 插件、buildSrc 模块方式……

  • 插件实战:多渠道打包、发版自动钉钉……

image.png

第四章 APP 性能优化实践

1.启动速度

  • 应用启动的一般流程

  • 冷启动和热启动

  • 启动速度的测量

  • 启动窗口优化

  • 线程优化

  • 系统调度优化

  • GC 优化

  • IO 优化

  • 资源重排

  • 主页布局优化

  • 类加载优化

  • 选择合适的启动框架

  • 减少 Activity 的跳转层次

  • 厂商优化

  • 后台保活

  • ……

image.png

  • 2.流畅度

  • 性能问题分析的一些工具和套路

  • 通过性能数据数据分析

  • Android 平台性能导致的性能案例

  • Android App 自身导致的性能问题

  • 低内存的数据特征和行为特征

  • 应用宝

  • 讯飞输入法无障碍服务导致的整机卡顿分析

  • 字节跳动:今日头条图文详情页秒开实践

  • ……

  • 3.抖音在 APK 包大小资源优化的实践

  • 图片压缩

  • webp 无侵入式兼容

  • 多 DPI 优化

  • 重复资源合并

  • shrinkResource 严格模式

  • 资源混淆(兼容 aab 模式)

  • ARSC 瘦身

  • ……

image.png

  • 4.优酷响应式布局技术全解析

  • 优酷APP响应式布局技术概述

  • 优酷APP响应式布局Android落地

  • 在分发场景的落地

  • 在消费场景的落地

  • 优酷APP响应式布局之测试方案

  • ……

  • 5.网络优化

  • 手机淘宝在网络的链路优化

  • 百度 APP 在网络深度优化的实践

  • ……

  • 6.手机淘宝双十一性能优化项目揭秘

  • 一秒法则的实现

  • 启动时间和页面帧率提升 20%

  • Android 手机内存节省50%

  • ……

  • 7.高德 APP 全链路源码依赖分析

  • 高德 APP 平台架构

  • 基础实现原理

  • 项目架构

  • 应用场景及实现原理

  • ……

  • 8.彻底干掉OOM的实战经验分享

  • 排查内存泄漏

  • 兜底策略

  • 内存峰值太高

  • 特大图排查优化

  • ……

  • 9.微信 Android终端内存优化实践

  • Activity 泄露检测

  • Bitmap 分配及回收追踪

  • Native 内存泄漏检测

  • 线程监控

  • 内存监控

  • ……

image.png

总结

性能优化不是更新一两个版本就可以解决的,是持续性的需求,持续集成迭代反馈。在实际的项目中,在项目刚开始的时候,由于人力和项目完成时间限制,性能优化的优先级比较低,等进入项目投入使用阶段,就需要把优先级提高,但在项目初期,在设计架构方案时,性能优化的点也需要提早考虑进去,这就体现出一个程序员的技术功底了。希望这份《360°全方位Android性能优化解析》可以给到你帮助。

文中资料可扫描下方CSDN官方认证卡片免费领取!

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

史上最全Android性能优化方案解析 的相关文章

  • 如何使用 kotlin Android 从 Url 读取 JSON?

    我正在使用 kotlin 来开发应用程序 现在我想从服务器获取 JSON 数据 在java中 我实现了Asyntask以及Rxjava来从Url读取JSON 我也在谷歌搜索 但我无法获得满足我的要求的正确详细信息 如何使用 kotlin 从
  • 使用 ActiveAndroid 库存储 HashMap

    我有一堂课 Table name Control public class Control extends Model Column private String name Column private Map
  • 在 Android 中从麦克风录制 wav 文件 - 问题

    我需要能够使用 Android 中的麦克风创建 WAV 文件 目前 我遇到了很多麻烦 到目前为止 这就是我的情况 我正在使用 micDroid 项目代码的一部分来记录 read thread int sampleRate 44100 int
  • GCM 无法唤醒设备

    我正在开发 GCM 应用程序 当设备不空闲时 即按电源按钮休眠 一切正常 但是 当我在设备空闲时发送消息时 设备不会唤醒 我做了以下事情 已验证服务器应用程序中的delay while idle未设置为true 每条消息使用不同的折叠键 多
  • Android模拟器中的互联网连接始终显示连接状态

    我尝试了多种方法来检查我的 Android 模拟器中的互联网连接 ConnectivityManager conMgr ConnectivityManager getSystemService Context CONNECTIVITY SE
  • 如何在android中获取MapView API?

    如何在android中获取MapView API thanks Android 文档中实际上是这么写的 你好 地图视图 http developer android com guide tutorials views hello mapvi
  • 如何解决:无法解析:com.mapbox.mapboxsdk:mapbox-android-sdk:9.5.0

    我在Android studio中尝试使用mapbox时遇到这个问题无法解析 com mapbox mapboxsdk mapbox android sdk 9 5 0 问题是什么 我的 build gradle 依赖项 dependenc
  • Android 从 C++ 端播放原始音频

    我需要能够在 Android 系统的 C 端以自定义文件格式传输音频 我正在致力于移植自定义媒体播放器 并且需要能够打开自定义文件并从中传输音频 这很重要 因为我认为从性能角度来看将整个播放器移植到 JAVA 是不可行的 并且通过 JNI
  • 如何在 M1 Mac 上运行的模拟器上运行旧版 Android 版本(例如 API 级别 21)?

    虽然现在有一个适用于 M1 mac 的 Android Studio 和支持arm架构的Android模拟器镜像 https stackoverflow com questions 64907154 android studio emula
  • 片段内容下方是否存在持久性 BottomSheet?

    Using a 持久底表 https material google com components bottom sheets html bottom sheets persistent bottom sheets 在一个协调器布局 htt
  • Google 地图位于活动的中间区域

    我正在使用 Android studio 2 1 2 我检查了一下 大多数问题要么使用旧版本的 Android studio 要么使用一些旧的类 这些类不适用于我的情况 从文件 gt 新项目 gt 我使用了选项Google Maps Act
  • 将 android 蓝牙客户端套接字连接到 ubuntu 服务器套接字时出现问题

    我正在编写一个 Android 应用程序 它应该通过蓝牙与服务器交换数据 服务器端位于运行 Ubuntu 的 PC 上 使用 bluez 库 用 C 或 C 编写 当我尝试连接到 PC 上的服务器套接字时 我的 Android 应用程序失败
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • 如何使用 Retrofit 解析嵌套 json....?

    我不知道该怎么办使用 Retrofit 解析 json 熟悉使用 Retrofit 解析简单的 json 但不熟悉解析嵌套Json using Retrofit 这是我的 Json 数据 current observation image
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • Android:如何创建模态进度“轮”叠加层?

    我想在我的视图上显示模式进度 轮子 叠加层 ProgressDialog 很接近 但我不想要对话框背景或边框 我尝试设置对话框窗口的背景可绘制 this progressDialog new ProgressDialog Main this
  • Android:分配内存失败

    我正在尝试创建一个具有 2047 mb 内存的模拟器 当我运行它时 我收到此错误 2011 02 22 14 24 14 Emulator 2011 02 22 14 24 14 Emulator This application has
  • android系统用户和linux root用户有什么区别

    当我将手机连接到电脑并使用adb shell与我的手机通信并输入的命令ps命令输出当前在我的手机上运行的进程信息 我发现有两个特殊用户 一个是root 另一个是system 据我所知 Android是基于linux的 所以root用户是最大
  • 如何解决 greenDAO 在执行 InsertOrReplace 时“不存在这样的表错误”?

    我正在使用 greenDAO 并且已成功生成所有必需的类和实体 并且我可以看到我的表已创建 但是在要替换的行上放置断点后 我收到一条错误消息 告诉我 不存在这样的表错误 try appTimeUsageDao insertOrReplace
  • Android Espresso 单击按钮时出现错误

    我正在尝试使用 espresso 框架为 Android 应用程序编写一些 UI 测试 现在我只是检查启动屏幕上是否存在所有元素 然后尝试单击登录按钮 单击按钮时 测试由于错误而失败 我似乎无法理解为什么会发生这种情况 我的测试代码是 Ru

随机推荐

  • c# Newtonsoft.Json 常用方法总结

    1 实体类的 Json 序列化和反序列化 我们以如下的 Person 类举例 其中包含了常用的数据类型 public class Person public int ID get set public string Name get set
  • Kubernetes之kubectl命令详解及常用示例

    文章目录 一 kubectl语法 二 子命令详解 1 command 2 type 3 flags 4 kubectl的输出格式 三 kubectl常用命令 1 查看类命令 2 操作类命令 3 其他操作 一 kubectl语法 kubect
  • 容器与云的碰撞——一次对MinIO的测试

    事先声明 本次测试过程完全处于本地或授权环境 仅供学习与参考 不存在未授权测试过程 本文提到的漏洞 MinIO未授权SSRF漏洞 CVE 2021 21287 已经修复 也请读者勿使用该漏洞进行未授权测试 否则作者不承担任何责任 随着工作和
  • OAuth2.0-授权码模式

    解决问题 OAuth2 0授权码模式主要解决了信任问题 一个第三方网站需要访问我们Github上的数据 例如用户头像 那Github为什么要信任该网站 该对网站信任到什么程度 如果彻底信任该网站 那么将Github的用户名和密码直接交给该网
  • 计算机网路基础 - 一些基本概念与网络结构

    1 基本概念 计算机网络 通信技术 计算机技术 是两项技术紧密结合的产物 通信系统的基础模型 计算机网络 是指将地理位置不同 具有独立功能的多台计算机及其外部设备 通过通信线路连接 在网络操作系统 网络管理软件及网络通信协议的管理和协调下
  • 【mysql批量插入或更新方法实现】

    自定义批量插入或更新 1 创建接口 替代baseMapper public interface RootMapper
  • CentOS搭建vsftp

    VSFTPD Very Secure FTP Daemon 是一个在 CentOS 中常用的 FTP 服务器软件 它是一个轻量级 安全且高性能的 FTP 服务器 基于 RFC 959 协议 并实现了大多数 FTP 协议的功能 VSFTPD
  • ObjectARX学习

    VS2010 VS2012 VS2013 VS2015 VS2017各版本产品激活秘钥 ObjectARX简介 ObjectARX解压包内各文件代表什么 VS ObjectARX SDK AutoCAD对应关系 1 VS2010 VS201
  • Flutter websocket 实现消息推送

    没什么可说的 直接上代码吧 Flutter 中的消息管理工具 class MessageUtils static WebSocket webSocket static num id 0 static void connect Future
  • NGINX实现TCP加密代理

    NGINX实现TCP加密代理 NGINX实现TCP代理 源码安装NGINX 修改配置文件 重启NGINX 测试 实现转发MySql Redis 矿池ssl 以及各种TCP转发 NGINX实现TCP代理 源码安装NGINX NGINX官网源码
  • 数据挖掘(全书的知识点都包括了)

    数据挖掘 第一章 1 什么是数据挖掘 数据挖掘是从数据中 发现其有用的信息 从而帮助我们做出决策 广义角度 数据挖掘是从大量的 不完全的 有噪声的 模糊的 随机的实际应用数据中 提取隐含在其中的 人们事先不知道的 但又是潜在有用的信息和知识
  • Android图片加载内存优化

    Android图片加载内存优化 利用BitmapFactory Options实现图片内存优化 通过设置options inPreferredConfig控制内存占用 通过设置采样率options inSampleSize来减少图片内存占用
  • 使用R语言构建泊松回归模型

    使用R语言构建泊松回归模型 泊松回归是一种广泛应用于计数数据分析的回归模型 它是基于泊松分布的概率模型 用于描述事件在一定时间或空间范围内发生的次数 在本文中 我们将学习如何使用R语言构建泊松回归模型 并提供相应的源代码示例 1 数据准备
  • 详细前后端分离实现facebook第三方登录的全过程(国内一般都是用Android和ios,并且资料稀少)

    实现facebook第三方登录全过程 需求 官方文档与校验工具 详细步骤 1 注册一个facebook的账号 2 登录https developers facebook com 3 点击我的应用 4 创建一个属于自己的应用 5 选择类型和详
  • 免费使用中国知网/查看外文文献—浙江图书馆

    参考https www zhihu com question 20188973 answer 296971317 目录标题 注册 知网 外文文献 注册 支付宝搜索 浙江图书馆 关注并进入浙江图书馆生活号 点击 服务大厅 点击 新用户注册 设
  • 【HBZ分享】数仓里面的概念-宽表-维度表-事实表概念讲解

    数仓概念 1 度量值 可被统计的 比如 次数 销量 营销额 订单表中的下单金额等可以统计的值叫度量值 2 维度表 1 对事实描述的信息 每一张表都对应现实世界中的一个对象或概念 比如 用户 商品 日期 地区维度 2 比如要分析商品的销售情况
  • 2023Mid Journey第一部AI中英双语图文描述关键词辞典.pdf(附下载链接)

    省时查报告 专业 及时 全面的行研报告库 省时查方案 专业 及时 全面的营销策划方案库 免费下载 2023年8月份全网热门报告合集 ChatGPT提词示例 让你的ChatGPT聪明100倍 超百页干货资料 AI应用的难点 痛点与未来 202
  • Kali Linux 通过gnome-tweaks调整原生主题的字体字号

    首先我们需要确认是否安装了 gnome tweaks 因为默认kali Linux使用的是gnome桌面程序 大部分情况下是默认就有的 你只需要确认下是否安装 使用命令行确认 whereis gnome tweaks 出现下图所示就表示有
  • Sidetree - 去中心化身份管理协议

    身份 Identity 管理是区块链应用的核心元素 在一个不可信 匿名的分布计算生态中 要实现去中心化身份管理并不是一件容易的事情 Sidetree是一个基于现有区块链平台的第二层 L2s 协议 专门用于去中心化身份管理 微软最新开源的IO
  • 史上最全Android性能优化方案解析

    Android中的性能优分为以下几个方面 布局优化 网络优化 安装包优化 内存优化 卡顿优化 启动优化 一 布局优化 布局优化的本质就是减少View的层级 常见的布局优化方案如下 在LinearLayout和RelativeLayout都可