在这篇文章中,我们将为您详细介绍比精华更纯!美团技术官手码:32万字AndroidApp高性能实战笔记,瞬间秒榜第一!的内容。此外,我们还会涉及一些关于ElyarAnwar的Android实战笔记--
在这篇文章中,我们将为您详细介绍比精华更纯!美团技术官手码:32万字Android App高性能实战笔记,瞬间秒榜第一!的内容。此外,我们还会涉及一些关于 ElyarAnwar的Android实战笔记---计算器(二) 分享是最好的记忆、1.3 创建你的第一个 Android 项目 ——Android 第一行代码(第二版)笔记、1.3.4 分析你的第一个 Android 程序 ——Android 第一行代码(第二版)笔记、1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 比精华更纯!美团技术官手码:32万字Android App高性能实战笔记,瞬间秒榜第一!
- ElyarAnwar的Android实战笔记---计算器(二) 分享是最好的记忆
- 1.3 创建你的第一个 Android 项目 ——Android 第一行代码(第二版)笔记
- 1.3.4 分析你的第一个 Android 程序 ——Android 第一行代码(第二版)笔记
- 1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记
比精华更纯!美团技术官手码:32万字Android App高性能实战笔记,瞬间秒榜第一!
前言:
说到性能,不同的领域有不同的标准。对于移动 App 领域,性能的评判标准主要体现在App 的运行方式、工作效率以及使用的流畅性上。众所周知,Android 性能问题非常复杂,因为有成千上万种计算能力参差不齐的设备。但是大多数时候,我们只是保证了开发的 App 能够在自己的目标设备上完美运行。
对于广大的 Android 开发者来说,性能是他们最后才考虑的事情。大多数的 App 开发更强调个性化,开发者的目标是使 UI 看起来完美并且找到一个可行的商业化道路。但是,App的性能很大程度上像是家里的管道;当它正常工作时,没有人会关注或者考虑到它,然而一旦出错,人们马上就会陷入麻烦当中。
举个例子: 用户在注意到社交小工具、图像过滤器或者是支持克林贡语等其他特性之前,会先注意到 App 的性能不好。并且你猜怎么着?用户因为不满意性能而给 App 差评的比例要高于因其他问题而给 App 差评的比例。这也是我们说性能很重要的原因。开发 App 的时候,很容易就会忽略性能,但坦率地说,性能涉及你所做的一切。当性能体验不好时,用户就会开始抱怨,进而卸载你的 App,然后报复性地给你一个差评。
考虑到这些,性能听起来更像是应该关注的一个特征,而不是必须忍受的一种负担。但实话实说,提升性能是一件非常困难的事情。仅仅了解算法是不够的,你还需要了解Android 系统是如何执行它的,以及硬件又是如何响应 Android 系统的操作的。事实上,一行代码有可能会破坏整个 App 的性能,只是因为它滥用了一些硬件限制。但困难不仅仅是这些,因为有时候为了了解后台发生的事情,你甚至必须学习一整套的性能分析工具。这基本上是看待 App 开发的一种全新的方式,并不适合怯于挑战的人。
在本文中,将介绍如何从提升 App 的效率和速度的角度来探讨性能问题,可以帮助你进一步完善App,使其能够在 19 000 种不同的 Android 设备上运行并且获得极致的体验。
为了不影响阅读,只截图展示了章节部分内容,需要完整版详细PDF版或更多Android相关资料的小伙伴可以点此处直达免费领取方式。
第1章 Android的性能指标
1.1 性能对用户很重要
1.1.1 电子商务和性能
1.1.2 电子商务之外的影响
1.1.3 性能可以节省基础设备
1.2 最恶劣的性能影响因素:宕机
1.2.1 低性能就像持续的宕机
1.2.2 消费者对性能bug的态度
1.2.3 智能手机电池寿命:矿井中的金丝雀
1.3 App性能问题的检测
1.3.1 模拟测试
1.3.2 真实用户监测
1.4 总结
第2章 构建Android设备实验室
2.1 你的用户都在使用什么设备
2.2 设备特性分布
2.2.1 屏幕
2.2.2 SDK版本
2.2.3 cpu/内存和存储
2.3 用户使用的网络
2.4 你的设备不是用户的设备
2.5 测试
2.6 创建设备实验室
2.6.1 你想要花很多钱买设备吗
2.6.2 我应该购买什么样的设备
2.6.3 除了手机之外
2.6.4 Android Open Source Project设备
2.6.5 其他选择
2.6.6 其他注意事项
2.6.7 我的设备实验室
第3章 硬件性能和电池寿命
3.1 Android的硬件特点
3.2 少即是多
3.3 耗电原因
3.3.1 Android能耗统计文件
3.3.2 屏幕
3.3.3 无线设备
3.3.4 cpu
3.3.5 其他传感器
3.3.6 休眠
3.3.7 WakeLock和Alarm
3.3.8 Doze模式
3.4 基本的电量消耗分析
3.4.1 详细的App电量消耗分析
3.4.2 能耗数据和数据流量
3.4.3 App休眠
3.5 高级电池监控
3.5.1 电能统计
3.5.2 Battery historian
3.5.3 Battery historian 2.0
3.6 JobScheduler
第4章 屏幕和UI性能
4.1 UI性能基准
卡顿
4.2 Android上的UI和渲染性能改进
4.3 创建视图
Hierarchy Viewer
4.4 资源缩减
4.4.1 屏幕的过度绘制
4.4.2 检测过度绘制
4.4.3 Hierarchy Viewer中的过度绘制
4.4.4 过度绘制和KitKat(Overdraw Avoidance)
4.5 分析卡顿(测量GPU的渲染性能)
Android Marshmallow里的GPU渲染
4.6 丢帧
4.6.1 Systrace
4.6.2 Systrace Screen Painting
4.6.3 Systrace和cpu阻塞渲染
4.6.4 Systrace更新——2015年Google I/O开发者大会
4.6.5 第三方工具
4.7 感知性能
4.7.1 进度条:优缺点
4.7.2 动画掩盖加载时间
4.7.3 即时更新的善意谎言
4.7.4 提高感知性能的建议
4.8 小结
第5章 内存性能
5.1 Android内存:它是如何工作的
5.1.1 共享内存与私有内存
5.1.2 脏内存与干净内存
5.1.3 内存清理(垃圾回收)
5.1.4 确定App使用的内存大小
5.1.5 procstats
5.1.6 Android内存警告
5.2 Java中的内存管理/泄露
5.3 追踪内存泄露的工具
5.3.1 Heap Dump
5.3.2 Allocation Tracker
5.3.3 增加一处内存泄露
5.3.4 更加深层次的堆解析:MAT和LeakCanary
5.3.5 Eclipse内存分析工具——MAT
5.3.6 LeakCanary
第6章 cpu与cpu性能
6.1 检测cpu占用率
6.2 使用Systrace分析cpu
6.3 Traceview(遗留的监视器DDMS工具)
6.4 Traceview(Android Studio)
6.5 其他优化工具
第7章 网络性能
7.1 Wi-Fi与蜂窝无线电
7.1.1 Wi-Fi
7.1.2 蜂窝
7.1.3 RRC状态机
7.2 测试工具
7.2.1 Wireshark
7.2.2 fiddler
7.2.3 MITMProxy
7.2.4 AT&T ARO
7.2.5 混合型App和WebPageTest.org
7.3 Android网络优化
7.3.1 文件优化
7.3.2 精简文本文件(Souders:精简JavaScript)
7.3.3 图片
7.3.4 文件缓存
7.3.5 文件之外
7.3.6 分组连接
7.3.7 检测应用的无线电使用情况
7.3.8 适时关闭连接
7.3.9 定期执行重复的ping命令
7.3.10 网络安全技术的应用(HTTP和HTTPS)
7.4 全球移动网络覆盖范围
7.4.1 CDN服务器
7.4.2 在慢速网络中测试App
7.4.3 仿真慢速网络而不用倾家荡产
7.4.4 构建网络感知App
7.4.5 计算延迟
7.4.6 最后一英里的延迟
7.4.7 其他无线电
7.4.8 GPS
7.4.9 蓝牙
第8章 真实用户监测
8.1 启用RUM工具
8.2 RUM分析:示例程序
8.3 崩溃
8.3.1 分析Crashlytics的崩溃报告
8.3.2 使用
8.3.3 实时信息
8.4 大数据的营救
RUM SDK的性能
8.5 小结
总结:
性能优化不是更新一两个版本就可以解决的,是持续性的需求,持续集成迭代反馈。在实际的项目中,在项目刚开始的时候,由于人力和项目完成时间限制,性能优化的优先级比较低,等进入项目投入使用阶段,就需要把优先级提高,但在项目初期,在设计架构方案时,性能优化的点也需要提早考虑进去,这就体现出一个程序员的技术功底了。
什么时候开始有性能优化的需求,往往都是从发现问题开始,然后分析问题原因及背景,进而寻找最优解决方案,最终解决问题,这也是日常工作中常会用到的处理方式。
文中所叙资料和更多Android架构相关资料都是免费分享给大家的额,但为了不影响阅读,只截图展示了章节部分内容,需要完整版详细PDF版或更多Android架构相关资料的小伙伴可以点此处免费获取哦。
多多支持,即可免费获取资料——三连之后(承诺:100%免费)
快速入手通道:(点这里)下载!诚意满满!!!
觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
ElyarAnwar的Android实战笔记---计算器(二) 分享是最好的记忆
分享是最好的记忆
在上一篇中,我用到的是工厂模式,根据用户的选择去创建合适的运算类对象。虽然这样的确易于扩展功能,但是又会有新的问题出现,如果我的运算功能很多的时候呢,我既要继承运算基类实现功能,又要跑到工厂类中修改代码,重新部署工厂类所有代码岂不很遭?
于是乎,我想到了这样一个问题,我可不可以用策略模式去替换工厂模式呢?
个人理解:如果工厂模式(Factory Pattern)是在众多算法中选择一个,那么策略模式(Strategy Pattern)是替换一个合适算法,这样说可能不太好理解。
1.3 创建你的第一个 Android 项目 ——Android 第一行代码(第二版)笔记
创建 HelloWorld 项目
如果是第一次,会经过漫长的等待。
启动模拟器
可以用第三方模拟器,也可以用官方集成的
点击后出现如下界面,可创建多个模拟器,如图,我已经创建好了一个,如果你没有,就点击下边的自行创建
可以下载推荐的,也可以选择其他的版本,第一次需要下载。
点击完成,创建模拟器完成,
现在可以启动或者修改配置了
启动模拟器后,运行 HelloWorld
选择模拟器
经过漫长的等待,出现如图所示界面
恭喜你
本文由博客一文多发平台 OpenWrite 发布!
1.3.4 分析你的第一个 Android 程序 ——Android 第一行代码(第二版)笔记
https://www.cnblogs.com/cy23/archive/2020/02/19/12330593.html
切换项目结构模式
Project 模式的项目结构
我们将项目切换成 Project 模式,这就是真实的目录结构。
- .gradle 和.idea
这两个目下放置的都是 Android Studio 自动生成的一些文件,我们无须关系,也不要去手动编辑。 - app
项目中的代码、资源等内容几乎都是放置在这个目录下的。 - build
它主要包含了一些在编译时自动生成的文件,不需要过多关心。 - gradle
这个目录下包含了 gradle wrapper 的配置文件。 - .gitignore
这个文件是用来指定的目录或文件排除在版本控制之外的。 - build.gradle
这是项目全局的 gradle 构建脚本,通常不需要修改。 - gradle.properties
这个文件是全局的 gradle 配置文件,在这里配置的属性将会影响到项目中所有的 gradle 编译脚本。 - gradlew 和 gradlew.bat
这两个文件是用来在命令行界面执行 gradle 命令的,其中 gradlew 是在 Linux 或者 Mac 系统中使用的。gradlew.bathi 在 Windows 系统中使用的。 - HelloWorld.iml
iml 文件是所有 IntelliJ IDEA 项目都会自动生成的一个文件(Android Studio 是基于 IntelliJ IDEA 开发的),用于标识这是一个 IntelliJ IDEA 项目,我们不需要修改这个文件中的任何内容。 - local.properties
这个文件用于指定本机中的 Android SDK 路径的,通常内容都是自动生成的。 - settings.gradle
这个文件用于指定项目中所有引入的模块。由于 HelloWorld 项目中只有一个 app 模块,因此该文件中也就只引入了 app 这一个模块。通常情况下引入都是自动完成的。
这个项目的目录介绍完毕了,除了 app 目录之外的,大多数的文件和目录都是自动生成的,app 目录才是我们的重点。
- build
这个目录和外层的 build 目录类似,主要也是包含了一些编译时自动生成的文件,不过它里面的内容会更多更复杂,我们不需要过多关心。 - libs
如果你的项目中使用到了第三方 jar 包,就需要把这些 jar 包都放到 libs 目录下,放在这个目录下的 jar 包都会被自动添加到构建路径里去。 - androidTest
此处是用来编写 Android Test 测试用例的,可以对项目进行一些自动化测试。 - java
是放置我们所有 java 代码的地方。 - res
这个目录下内容就有点多了,简单说就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。
- 图片放在 drawable 目录下
- 布局存放到 layout 目录下
- 字符串放到 values 目录下
- AndroidMainfest.xml
这是你整个 Android 项目的配置文件,你在程序中定义的所有四大组件都要在这个文件夹里注册,另外还可以在这个文件夹中给应用程序添加权限声明。 - test
此处是用来编写 Unit Test 测试用例的,是对项目进行自动化测试的另一种方式。 - .gitignore
这个文件用于将 app 模块内的指定的目录或文件排除在版本控制器之外,作用和外层的.gitignore 文件类似。 - app.iml
IntelliJ IDEA 项目自动生成的文件,我们不需要关心或修改这个文件中的内容。 - build.gradle
这个 app 模块的 gradle 构建脚本,在这个文件中会指定很多项目构建相关的配置。 - proguard-rules.pro
这个文件用于指定项目代码的混淆规格,当代码开发完成后打包成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
这样整个项目的目录结构就介绍完了。
接下来我们一起分析一下 HelloWorld 项目究竟是怎么运行起来的吧。首先打开 AndroidManifest.xml 文件,从中可以看到如下代码。
<activity android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这段代码标示对 HelloWorldActivity 这个活动进行注册,没有在 AndroidManifest.xml 里注册的活动是不能使用的。
其中 intent-filter 里的两行代码非常重要,
<action android:name="android.intent.action.MAIN" />
和 <category android:name="android.intent.category.LAUNCHER" />
标示 HelloWorldActivity 是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。
我们来看下 HelloWorldActivity 这个活动。代码如下所示:
~~~
public class HelloWorldActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_activity);
}
}
~~~
首先我们可以看到,HelloWorldActivity 是继承自 AppCompatActivity 的,这是一种向下兼容的 Activity,可以将 Activity 在各个系统版本中增加的特性和功能最低兼容到 Android2.1 系统。Activity 是 Android 系统提供的一个活动的基类,我们项目中所有的活动都必须继承它或者他的子类才能拥有活动的特性(AppCompatActivity 是 Activity 的子类)。然后可以看到 HelloWorldActivity 中拥有一个 onCreate () 方法,这个方法是一个活动呗创建时必定要执行的方法。其中两行代码并没有 Hello World! 字样,那么程序中显示的 Hello World! 是在哪里定义的呢?
其实 Android 程序的设计讲究逻辑与视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。可以看到,在 onCreate () 方法的第二行调用了 setContentView () 方法,就是这个方法给当前的活动引入了一个 hello_world_layout 布局。
布局文件都定义在 res/layout 目录下的,打开 hello_world_layout.xml 文件并切换到 Test 视图,代码如下所示
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HelloWorldActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
你看到就可以了,后面我们会对布局进行详细讲解的。
这样我们就将 HelloWorld 项目的目录结构以及基本的执行过程都分析完了。
本文由博客一文多发平台 OpenWrite 发布!
1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记
切换项目结构模式
Project模式的项目结构
我们将项目切换成Project模式,这就是真实的目录结构。
- .gradle和.idea 这两个目下放置的都是Android Studio自动生成的一些文件,我们无须关系,也不要去手动编辑。
- app 项目中的代码、资源等内容几乎都是放置在这个目录下的。
- build 它主要包含了一些在编译时自动生成的文件,不需要过多关心。
- gradle 这个目录下包含了gradle wrapper的配置文件。
- .gitignore 这个文件是用来指定的目录或文件排除在版本控制之外的。
- build.gradle 这是项目全局的gradle构建脚本,通常不需要修改。
- gradle.properties 这个文件是全局的gradle配置文件,在这里配置的属性将会影响到项目中所有的gradle编译脚本。
- gradlew和gradlew.bat 这两个文件是用来在命令行界面执行gradle命令的,其中gradlew是在Linux或者Mac系统中使用的。gradlew.bathi在Windows系统中使用的。
- HelloWorld.iml iml文件是所有IntelliJ IDEA项目都会自动生成的一个文件(Android Studio是基于IntelliJ IDEA开发的),用于标识这是一个IntelliJ IDEA项目,我们不需要修改这个文件中的任何内容。
- local.properties 这个文件用于指定本机中的Android SDK路径的,通常内容都是自动生成的。
- settings.gradle 这个文件用于指定项目中所有引入的模块。由于HelloWorld项目中只有一个app模块,因此该文件中也就只引入了app这一个模块。通常情况下引入都是自动完成的。
这个项目的目录介绍完毕了,除了app目录之外的,大多数的文件和目录都是自动生成的,app目录才是我们的重点。
- build 这个目录和外层的build目录类似,主要也是包含了一些编译时自动生成的文件,不过它里面的内容会更多更复杂,我们不需要过多关心。
- libs 如果你的项目中使用到了第三方jar包,就需要把这些jar包都放到libs目录下,放在这个目录下的jar包都会被自动添加到构建路径里去。
- androidTest 此处是用来编写Android Test测试用例的,可以对项目进行一些自动化测试。
- java 是放置我们所有java代码的地方。
- res 这个目录下内容就有点多了,简单说就是你在项目中使用到的所有图片、布局、字符串等资源都要存放在这个目录下。
- 图片放在drawable目录下
- 布局存放到layout目录下
- 字符串放到values目录下
- AndroidMainfest.xml 这是你整个Android项目的配置文件,你在程序中定义的所有四大组件都要在这个文件夹里注册,另外还可以在这个文件夹中给应用程序添加权限声明。
- test 此处是用来编写Unit Test测试用例的,是对项目进行自动化测试的另一种方式。
- .gitignore 这个文件用于将app模块内的指定的目录或文件排除在版本控制器之外,作用和外层的.gitignore文件类似。
- app.iml IntelliJ IDEA项目自动生成的文件,我们不需要关心或修改这个文件中的内容。
- build.gradle 这个app模块的gradle构建脚本,在这个文件中会指定很多项目构建相关的配置。
- proguard-rules.pro 这个文件用于指定项目代码的混淆规格,当代码开发完成后打包成安装包文件,如果不希望代码被别人破解,通常会将代码进行混淆,从而让破解者难以阅读。
这样整个项目的目录结构就介绍完了。
接下来我们一起分析一下HelloWorld项目究竟是怎么运行起来的吧。首先打开AndroidManifest.xml文件,从中可以看到如下代码。
<activity android:name=".HelloWorldActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
这段代码标示对HelloWorldActivity这个活动进行注册,没有在AndroidManifest.xml里注册的活动是不能使用的。 其中intent-filter里的两行代码非常重要, <action android:name="android.intent.action.MAIN" />
和<category android:name="android.intent.category.LAUNCHER" />
标示HelloWorldActivity是这个项目的主活动,在手机上点击应用图标,首先启动的就是这个活动。
我们来看下HelloWorldActivity这个活动。代码如下所示:
public class HelloWorldActivity extends AppCompatActivity {
[@Override](https://my.oschina.net/u/1162528)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.hello_world_activity);
}
}
首先我们可以看到,HelloWorldActivity是继承自AppCompatActivity的,这是一种向下兼容的Activity,可以将Activity在各个系统版本中增加的特性和功能最低兼容到Android2.1系统。Activity是Android系统提供的一个活动的基类,我们项目中所有的活动都必须继承它或者他的子类才能拥有活动的特性(AppCompatActivity是Activity的子类)。然后可以看到HelloWorldActivity中拥有一个onCreate()方法,这个方法是一个活动呗创建时必定要执行的方法。其中两行代码并没有Hello World!字样,那么程序中显示的Hello World!是在哪里定义的呢? 其实Android程序的设计讲究逻辑与视图分离,因此是不推荐在活动中直接编写界面的,更加通用的一种做法是,在布局文件中编写界面,然后在活动中引入进来。可以看到,在onCreate()方法的第二行调用了setContentView()方法,就是这个方法给当前的活动引入了一个hello_world_layout布局。 布局文件都定义在res/layout目录下的,打开hello_world_layout.xml文件并切换到Test视图,代码如下所示
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".HelloWorldActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
你看到就可以了,后面我们会对布局进行详细讲解的。 这样我们就将HelloWorld项目的目录结构以及基本的执行过程都分析完了。
本文由博客一文多发平台 OpenWrite 发布!
今天关于比精华更纯!美团技术官手码:32万字Android App高性能实战笔记,瞬间秒榜第一!的介绍到此结束,谢谢您的阅读,有关 ElyarAnwar的Android实战笔记---计算器(二) 分享是最好的记忆、1.3 创建你的第一个 Android 项目 ——Android 第一行代码(第二版)笔记、1.3.4 分析你的第一个 Android 程序 ——Android 第一行代码(第二版)笔记、1.3.4分析你的第一个Android程序——Android第一行代码(第二版)笔记等更多相关知识的信息可以在本站进行查询。
本文标签: