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