Android 中为什么尽可能的少用枚举,你真的懂它吗?
对于移动设备来说内存是十分有限的资源,为了减少 GC、减少卡顿,我们应尽量减少内存开销,其中枚举就是可以优化的地方之一。
枚举是一种特殊的 class。
1> 创建 Animal.java。touch Animal.java
2> 编译 Animal.java。javac Animal.java
3> 查看 Animal.java 在编译器种的真实模样。javap Animal.class
//Animal.java
public enum Animal {
DOG, CAT
}
通过观察枚举经过编译后会多出数组、 valueOf函数、静态代码块等。如果我们将DOG、CAT直接用常量来表示内存占用量可想而知。
Android 的整个编译打包过程
aapt 工具对 R.Java、Application Source Code、res 等文件进行编译。
Java 编译器将 *.java 文件编译为 *.class 文件。此文件包括本项目及其它 module 及 lib。
dex 工具将 *.class 文件合并为 *.dex 文件。
apkbuilder 工具对 *.dex 文件、Android 资源文件进行合并最终得出 *.apk
文件。signed 对 *.apk 进行签名得出签名版可安装 *.apk。
zipalign 对 apk 文件对齐优化。
zipalign对齐优化:通俗的说就是按着有利于系统处理的排列方式,对我们 apk 中的资源文件进行排列,提高资源的查找速度,从而去提高应用的运行效率。
zipalign 使用了4字节的边界对齐方式来映射内存,通过空间换时间的方式提高执行效率。内存分配单位是32位的,即4字节。位图中每行象素的数据是连续的,而下一行不能和上一行共用一个内存单元(4字节),所以每行象素的数据长度必须是4字节的倍数。
Android 应用如何定位卡顿、掉帧原因
造成应用卡顿的情况无非两种:
- CPU、GPU 的性能有限,无法在规定的时间协同完成大量 UI 绘制。
- 可用内存过小导致频繁 GC,从而导致绘制卡顿(代码low)。
由于硬件问题,我们不太好控制,这里我们主要针对软件问题进行分析。
1> 手机开发者模式中打开调试 GPU 过度绘制,查看同一个区域 View 是否存在多次绘制。紫色代表过度绘制一次、绿色代表过度绘制两次、浅红色代表过度绘制三次、深红色代表过度绘制大于等于四次。
2> 借助开发工具打开 Android Device Monitor->Hierarchy View 查看 View 的布局是否合理。
3> TraceView 是 Android SDK 中内置的一个工具,它可以加载 trace 文件,用图形的形式展示代码的执行时间、次数及调用栈,便于我们分析。
多个设备连接 adb 时,如何使用 install 命令
1> adb devices 列出当前所有连接设备,例:emulator-5554、emulator-5553...
2> adb -s emulator-5554 install apk 路径安装 apk 文件到 emulator-5553 设备
Android Studio 调试出现 waiting for debugger 的解决办法
1> Studio 连接设备过多,关闭掉其他设备,只保留当前正在使用的设备。
2> 终端调用adb kill-server
随后调用adb start-server。
当然前提需要在终端配置好adb环境变量。adb路径:盘符/xxx路径/Android/sdk/platform-tools/
View 背景温故
color 标准表示是8位的16进制表示的,而我之前一直用的都是6位。 颜色的十六进制可写为#xxxxxxxx(8位)和#xxxxxx(六位) 六位数的就是特殊的八位数的十六进制颜色。
划分为#|xx|xxxxxx。 则|xx|内的 xx 代表颜色的透明度。00 为全透明,而 ff 为完全不透明,xxxxxx相当于#ffxxxxxx。 颜色和不透明度 (alpha) 值以十六进制表示法表示。任何一种颜色的值范围都是 0 到 255(00 到 ff)。对于 alpha,00 表示完全透明,ff 表示完全不透明。表达式顺序是“aabbggrr”,其中“aa=alpha”(00 到 ff);“bb=blue”(00 到 ff);“gg=green”(00 到 ff);“rr=red”(00 到 ff)。
View 按下颜色一般为背景颜色透明度60%左右。
Bitmap 是什么?
Bitmap (位图)一种以像素点填充的图片格式,拥有很高的图像色彩,常见形式一个像素点占用4字节、8字节内存。此特点同时带来一个问题位图内存占用过高。
下面我们看一下 Bitmap 的内存计算公式:图片宽像素点和×图片高像素点和×每个像素点占用的字节大小 = 图片占用总内存。
例:一张格式为1080×1920的图片,如果此图的图片质量为 ARGB_8888 标识此位图一个像素点占用 4 byte,那么我们看下此图片大概占用多少内存。
1080×1920×4÷1024 = 8100byte ≈ 8mb。
计算完 Bitmap 的内存占用是不是头冒冷汗?那么我们如何优化呢?主流的现在分为两种:
1> 尺寸压缩(100×100的图片尺寸改为50×50)。
2> 图片质量压缩(降低图片的清晰度)。
3> 项目中优先使用 xml 编写的 Shape 图形、.9 图片、普通图片等。
具体如何压缩小伙伴们自行百度喽。
什么是 px、dp、sp、dpi、ppi
px:像素点。展示图像信息的最小显示单元。
dp:Android 中推出的一种用于适配不同密度手机的尺寸单位。其中有一个基数,当dpi=160时1dp=1px,基数越大1dp对应的px越大。
sp:Android 中推出的一种可拉伸字号尺寸单位。sp 作为字体大小单位,会随着 Android 系统的字体大小改变,而 dp 作为单位则不会。
dpi:dot per inch 的缩写,指每英寸所包含的点。dpi 是一个与硬件相关的概念。例:打印机,此处的点是指每英寸所能扫描的点或打印的点。
ppi:pixels per inch 的缩写,指每英寸所包含的像素点。ppi 越大标识每英寸屏幕所包含的像素点越多,图片也就越清晰。
一个dp、px 在线换算网站:https://pixplicity.com/dp-px-converter
App 被系统回收所遇到的问题
Activity 之间使用 intent 传递值如不进行状态保存,应用异常问题:
1> a页面跳转b页面使用 intent 传递值:例:当应用停留在a页面,由于用户操作我们的应用由前台进程转为后台进程,一定时间后应用被系统回收,当用户再次打开我们应用做跳转操作。如a页面 intent 中使用的值不进行状态保存,b页面调用 getIntent().getExtras().getXXX 得到的值会是 null(造成空指针异常)
百度地图获取 SHA1
开发版SHA1:
1> cd .android
2> keytool -list -v -keystore debug.keystore
3> 输入秘钥口令android
回车
正式版SHA1:
1> keytool -list -v -keystore正式版签名文件路径,文件名为*.jks
2> 输入签名文件密码回车密码就是正式版apk包签名文件,密码同签名文件密码,文件为*.jks
Mac 很常用的一个命令
- du -sh * - 列出当前目录下所有文件大小
Linux 文件解压
- tar –xvzf *.tar.gz 解压 *.tar.gz 文件
*.tar.gz 为文件名
Linux 终端中需要掌握的一些快捷键
- CTRL + U - 剪切光标前的内容
- CTRL + K - 剪切光标至行末的内容
- CTRL + Y - 粘贴
- CTRL + E - 移动光标到行末
- CTRL + A - 移动光标到行首
- ALT + F - 跳向下一个空格
- ALT + B - 跳回上一个空格
- ALT + Backspace - 删除前一个单词
- CTRL + W - 剪切光标后一个单词
- Shift + Insert - 向终端内粘贴文本
- dpkg -i - xxx/xxx/xxx.deb 安装deb软件, 有时权限不够dpkg前应加sudo
- dpkg -P - 卸载deb软件, 权限不够同上
Linux 制作快捷方式
1> 创建xxx.desktop文件
2> 按需将下面内容拷贝到xxx.desktop文件内保存退出
[Desktop Entry]
Name=xxx //应用名称
Comment=Rayn-IDEA-IU
Exec=/home/rayn/idea/bin/idea.sh //应用的可执行文件,一般位于bin目录
Icon=/home/rayn/idea/bin/idea.png//启动应用的图标
Terminal=false//是否开启终端
Type=Application//标识应用程序
3.右键此文件-->属性-->权限, 勾选允许文件为程序执行
Ubuntu 安装有道词典
1> 下载适合自己操作系统的软件版本(文件以deb结尾) http://cidian.youdao.com/index-linux.html
2> 安装软件 sudo dpkg -i xxx.deb
3> 启动软件youdao-dict
如果Ubuntu是14版本可略过步骤4
4> 修复Ubuntu16无法启动的问题
- sudo apt-get -f install
- sudo apt-get install tesseract-ocr
5> 启动软件 youdao-dict
Ubuntu 如何安装 flash 插件
1> sudo apt-get update
2> sudo apt-get install flashplugin-installer
3> 浏览器刷新页面
Qt 无法输入中文问题
1> sudo apt install fcitx-frontend-qt5
2> sudo cp /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitxplatforminputcontextplugin.so /opt/Qt5.7.0/Tools/QtCreator/lib/Qt/plugins/platforminputcontexts/
当然以上需要找到自己对应的目录才可以顺利进行
3> 重启 Qt
此篇由于是工作中问题的一些积累,所以会比较杂,高抬贵手别骂!
喜欢有帮助的话: 双击、评论、转发,动一动你的小手让更多的人知道!关注 Android_YangKe