swap设置大小建议
1 | - 安装系统时,选择swap分区;swap不是越大越好,越大的时候说明内存不够用,应该增加内存。 |
新建或修改swap分区
1 | 方案一:修改原有文件大小方式 |
设置linux物理内存使用多少开始使用swap的阈值
1 | 1.查询默认的值 |
swap设置大小建议
1 | - 安装系统时,选择swap分区;swap不是越大越好,越大的时候说明内存不够用,应该增加内存。 |
新建或修改swap分区
1 | 方案一:修改原有文件大小方式 |
设置linux物理内存使用多少开始使用swap的阈值
1 | 1.查询默认的值 |
系统应用编译有2种方式:
1 | 1.源码编译(Aidegen):适用于需要与framework代码统一版本或修改较少的情况, |
下载指定版本的源码:
1 | 官网地址:https://android.googlesource.com/platform/packages/apps/ |
问题:Failed to find Platform SDK with path: platforms;android-S
1 | 原因:gradle.properties中的COMPILE_SDK=android-S找不到,缺少sdk; |
问题: Failed to connect to android.googlesource.com port 443 after 21168 ms: Timed out
1 | 原因:使用了vpn,浏览器可以正常访问aomedia.googlesource.com,但是使用git就报错,需要设置git也是用vpn |
整体目录介绍:
Android源码根目录 | 描述 |
---|---|
art | Android Runtime,一种App运行模式,区别于传统的Dalvik虚拟机,旨在提高Android系统的流畅性 |
abi | abi 相关代码,abi:application binary interface,应用程序二进制接口 |
bionic | bionic C 库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及 generic 等基础开发配置包 |
compatibility | 兼容性的一些资源 |
cts | Android 兼容性测试套件标准 |
dalvik | dalvik Java 虚拟机 |
developers | Android开发者参考文档 |
development | 应用程序开发相关 |
device | 设备相关代码 |
disregard | 清空 Android.mk 内容,以阻止 Android 构建系统更深入地扫描 Android.mk 的子目录。 |
docs | 介绍开源的相关代码 |
external | Android 使用的一些开源的模组 |
frameworks | 核心框架 - Java 及 C++语言,是 Android 应用程序的框架 |
gdk | 即时通信模块 |
hardware | 主要是硬件适配层 HAL 代码 |
kernel | Linux 的内核文件 |
libcore | 核心库相关 |
libnativehelper | 是 Support functions for Android‘s class libraries 的缩写,表示动态库,是实现 JNI 库的基础 |
ndk | ndk 相关代码。Android NDK(Android Native Development Kit)是一系列的开发工具,允许程序开发人员在 Android 应用程序中嵌入 C/C++ 语言编写的非托管代码。 |
out | 编译完成后的代码输出在此目录 |
packages | 应用程序包 |
pdk | Plug Development Kit 的缩写,是本地开发套件 |
platform_testing | Android平台测试程序 |
prebuilts | x86 和 ARM 架构下预编译的一些资源 |
sdk | SDK 及模拟器 |
shortcut-fe | 根据手机平台芯片改变,这里是高通xx加速 |
system | 文件系统和应用及组件,是用 C 语言实现的 |
test | Android Vendor测试框架 |
toolchain | Android工具链 |
tools | 工具文件夹 |
vendor | 厂商定制代码 |
Makefile | 全局的 Makefile |
详细目录介绍:
art 目录
1 | |- benchmark // 程序测试基准。 |
bionic 目录
1 | |- libc (C库) |
bootable目录
1 | |- recovery(系统恢复相关) |
build目录
1 | |- core (核心编译规则) |
dalvik目录
1 | |- dexdump (dex反汇编) |
developers
1 | |- build //gradle编译系统。 |
development目录
1 | |- apps(一些核心应用程序) |
device 目录
1 | |- asus//华硕 |
external目录
1 | |- aac // Advanced Audio Coding,高级音频编码。 |
frameworks
1 | |- base (基本内容) |
hardware
1 | |- libhardware (硬件库) |
libcore
1 | |- crypto |
libnativehelper
1 | |- include // 头文件 |
ndk
1 | |- build |
packages
1 | |- apps (应用程序库) |
pdk
1 | |- apps // 平台测试应用 |
platform_testing
1 | |- build // 平台测试 |
prebuilts
1 | |- abi-dumps // applicationbinary interface,应用程序二进制接口的内存镜像调试工具 |
sdk
1 | |- annotations // 注释源码 |
system
1 | |- bt // 蓝牙相关 |
test 目录
1 | |- vts // Vendor Test Suite。 |
tools 目录
1 | |- apksig // APK签名,包括一个Java库和一个Java命令行工具。 |
vendor
1 | |- aosp (android open source project) |
cts 目录
1 | |- apps // cts测试所使用的apk源码 |
out // 编译产生的目录
1 | |- host // 在主机PC host上使用的工具,包括二进制程序以及JAVA的程序) |
常用CMake 语法
一. cmake 版本号声明
1 | # 声明一个我们使用的最小版本 |
二. 设置项目名称
1 | # 这个项目名称一般和生成的库名称相同 |
三. 添加头文件搜索目录
1 | include_directories(../../../include) |
四. 添加源文件
1 | # 使用变量添加 |
五. 生成一个库
1 | 动态库和静态库的区别: |
六. 搜索一个库(预构建库)
1 | find_library( # Sets the name of the path variable. |
七. 设置一个变量
1 | # 设置LIBDIR为 ${CMAKE_CURRENT_SOURCE_DIR}/../../../libs/${ANDROID_ABI} |
八. 导入预构建库
1 | # 导入静态库 |
九. 链接库
1 | target_link_libraries( # Specifies the target library. |
十. 设置库的输出目录
1 | set_target_properties(test PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY_${ARCH}}) |
NDK概念及疑问
1 | 1.ndk是什么 |
常用CMake 语法
1 |
|
NDK中打印日志
1 | #include <android/log.h> |
NDK开发实际集成源码的场景
1.使用Android Studio 源码直接集成
1 |
|
2.使用命令编译出符合平台相关的预编译库
配置ndk环境
1 | 1.下载并安装 NDK |
2.1.test.cpp 测试的c++文件
1 | #include <iostream> |
2.2.test.h 测试的c++头文件
1 | #ifndef TEMPLATE_TEST_H |
2.3.CMakeLists.txt cmake编译文件
1 |
|
2.4.build.sh
1 | //遇到的问题: |
1 | #!/bin/bash |
1 | ./build.sh //执行编译 |
3.使用Android Studio 直接集成预编译库
1 | //1.导入资源 |
Retrofit简介
1 | Retrofit 是一个Square开发的安卓客户端请求库。其中内部封装了okhttp库。 |
与其它网络库的对比
1 | AndroidAsynHttp |
Retrofit优点
1 | API设计简洁易用、注解化配置高度解耦、支持多种解析器、支持Rxjava |
Retrofit使用
1.Retrofit开源库、OkHttp网络库、数据解析器集成注册网络权限
1 | //依赖包导入 |
2.创建接口设置请求类型与参数
1 | 新建UserInfoModel类和UserMgrService接口 |
请求示例
//假设BASE_URL = “http://192.168.0.1/“
@Url
1 | //整个地址都要变化,甚至是baseUrl |
@Path
1 | //用于替换Url路径中的变量字符。 |
2.1Get请求
@Query
1 | //主要用于Get请求数据,用于拼接在拼接在Url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开。 |
@QueryMap
1 | //主要的效果等同于多个@Query参数拼接,主要也用于Get请求网络数据。 |
2.2Post请求
@Filed
1 | //@Field的用法类似于@Query,于拼接在拼接在Url路径后面的查询参数。 |
@FieldMap
1 | //用法类似于@QueryMap,主要用于Map拼接多个参数 |
@Body
1 | //例1 |
2.3Put请求
1 | @PUT("comment/{comment_id}") |
1 | @PUT("comment/{comment_id}") |
1 | //加body参数:{"content":"我是评论","type":"1"} |
2.4Delete
1 | @DELETE("comment/{comment_id}") |
综上所述,可以归纳出上面几个注解的用法:
1 | @Path : 请求的参数值直接跟在URL后面时,用@Path配置 |
注意:Filed和FieldMap需要FormUrlEncoded结合使用,否则会抛异常!
3.创建Retrofit对象、设置数据解析器
1 | Retrofit retrofit = new Retrofit.Builder().baseUrl("http://149.0.171.247:8088/") |
baseUrl:
1 | 这里的baseUrl是自己访问的Url的基类地址,加上刚才@GET(“login”)中的login才是我们真正要访问的地址, |
4.生成接口对象
1 | RequestInterface service= retrofit.create(RequestInterface.class); |
5.调用接口方法返回Call对象
1 | Call<LoginBean> call=service.login("zhangsan""123456") |
6.发送请求(同步、异步)
1 | 同步:调用Call对象的execute(),返回结果的响应体 |
问题:
1 | 使用时别忘了申请网络权限哦,使用时可能会遇到以下问题: |
一、Retrofit工具类的封装(核心类)
1 | /** |
代码很简单,创建后台请求接口,调用create即可。
二、Converter.Factory的封装
1 | /** |
三、Retrofit网络请求基类的封装
1 | /** |
四、具体网络请求业务类
1 | /** |
五、测试和使用
1 | /** |
六、补充,对于Observer
1 | 1.如调用登录要显示Dialog |
一、列表页卡顿优化
常规方案
1 | 1.convertView复用、使用ViewHolder |
布局相关
1 | 1.减少布局层级、避免过度绘制 |
图片相关
1 | 1.避免过大尺寸:GC频繁、内存抖动 |
线程相关
1 | 1.使用线程池收敛线程,降低线程优先级 |
TextView优化
1 | 1.原因:面对复杂文本性能不佳 |
其它
1 | SysTrace跟踪 |
二、存储优化
常规方案
1 | 1.确保IO操作发生在非主线程 |
SharePreferences相关
1 | 加载慢:初始化加载整个文件 |
SharePreferences替代者MMKV
1 | mmap和文件锁保证数据完整 |
日志存储优化
1 | 大量服务需要日志库支持 |
常规实现
1 | 每产生一个日志,写一遍到磁盘中:不丢失、性能损耗 |
mmap
1 | 内存映射文件 |
业界实现:Xlog、Logan
其它
1 | 常用数据的缓存,避免多次读取 |
三、WebView异常监控
简介
1 | 1.重要控件 |
问题
1 | WebView版本及对接业务方众多 |
思路
1 | 1.监控屏幕是否白屏,白屏则WebView有问题 |
1 | package com.optimize.performance.webview; |
1 | //使用 |
1 | //稳定性优化 |
一、如何提升App的稳定性
正确认识
1 | 1.稳定性是大问题,Crash是PO优先级 |
稳定性纬度
1 | 1.Crash纬度 |
稳定性优化概述
1 | 1.重在预防、监控必不可少 |
二、高Crash率的破解之道
Crash相关指标
1 | 1.UV、PV Crash率(uv主要针对用户使用量,用户使用崩溃率,pv是用户使用的频率,用户使用崩溃的频率) |
Crash关键问题
1 | 尽可能还原Crash现场 |
整体结构
1 | 1.采集层:错误堆栈、设备信息、行为日志、其它信息 |
单个Crash处理方案
1 | 1.根据堆栈及现场信息找答案 |
Crash率治理方案
1 | 1.解决线上常规Crash |
三、移动端业务高可用方案建设
业务高可用重要性
1 | 1.高可用:性能+业务 |
业务高可用方案建设
1 | 数据采集 |
四、移动端容灾方案
移动端容灾必要性
1 | 灾:性能、业务异常 |
容灾方案建设
1 | 功能开关 |
容灾方案集合
1 | 功能开关->统跳中心->动态修复->安全模式 |
五、稳定性长效治理
全流程Crash长效治理
1 | 开发阶段 |
六、问题
你们做了哪些稳定性方面的优化
1 | 1.Crash专项优化 |
性能稳定性是怎么做的?
1 | 1.线下发现问题、优化为主 |
业务稳定性如何保障 ?
1 | 1.数据采集+报警 |
如果发生了异常情况,怎么快速止损?
1 | 1.能力:功能开关、统跳中心 |
1 | //瘦身优化 |
一、瘦身优化及Apk分析方案介绍
瘦身优势
1 | 1.最主要是转换率:下载转换率 |
Apk组成
1 | 1.代码相关:classes.dex |
Apk分析
1 | ApkTool,反编译工具 |
二、代码瘦身实战
代码混淆
1 | 花指令,功能等价但改变形式 |
三方库处理
1 | 1.基础库统一 |
移除无用代码
1 | 1.业务代码只加不减 |
三、资源瘦身实战
元余资源
1 | studio中文件目录-右键-Refactor-Remove Unused Resource |
图片压缩
1 | 1.快速发展期的App没有相关规范 |
资源混淆
1 | https://github.com/shwenzhang/AndResGuard |
其它
1 | 1.图片只保留一份 |
四、so文件瘦身实战
So移除
1 | 1.So是Android上的动态链接库 |
更优方案
1 | 1.完美支持所有类型设备代价太大 |
其它方案
1 | 1.So动态下载 |
五、问题
怎么降低Apk包大小
1 | 代码:Proguard、统一三方库、无用代码删除 |
Apk瘦身问题长效治理
1 | 发版之前与上个版本包体积对比,超过闯值则必须优化 |