Android 攻城獅工作中的一些經(jīng)驗(yàn)總結(jié)-[Android_YangKe]

Android 中為什么盡可能的少用枚舉,你真的懂它嗎?

對(duì)于移動(dòng)設(shè)備來(lái)說(shuō)內(nèi)存是十分有限的資源,為了減少 GC、減少卡頓,我們應(yīng)盡量減少內(nèi)存開(kāi)銷(xiāo),其中枚舉就是可以?xún)?yōu)化的地方之一。

枚舉是一種特殊的 class。

1> 創(chuàng)建 Animal.java。touch Animal.java
2> 編譯 Animal.java。javac Animal.java
3> 查看 Animal.java 在編譯器種的真實(shí)模樣。javap Animal.class

//Animal.java
public enum Animal {
    DOG, CAT
}
yangke.png

通過(guò)觀察枚舉經(jīng)過(guò)編譯后會(huì)多出數(shù)組、 valueOf函數(shù)、靜態(tài)代碼塊等。如果我們將DOG、CAT直接用常量來(lái)表示內(nèi)存占用量可想而知。


Android 的整個(gè)編譯打包過(guò)程
  • aapt 工具對(duì) R.Java、Application Source Code、res 等文件進(jìn)行編譯。

  • Java 編譯器將 *.java 文件編譯為 *.class 文件。此文件包括本項(xiàng)目及其它 module 及 lib。

  • dex 工具將 *.class 文件合并為 *.dex 文件。

  • apkbuilder 工具對(duì) *.dex 文件、Android 資源文件進(jìn)行合并最終得出 *.apk
    文件。

  • signed 對(duì) *.apk 進(jìn)行簽名得出簽名版可安裝 *.apk。

  • zipalign 對(duì) apk 文件對(duì)齊優(yōu)化。

zipalign對(duì)齊優(yōu)化:通俗的說(shuō)就是按著有利于系統(tǒng)處理的排列方式,對(duì)我們 apk 中的資源文件進(jìn)行排列,提高資源的查找速度,從而去提高應(yīng)用的運(yùn)行效率。
zipalign 使用了4字節(jié)的邊界對(duì)齊方式來(lái)映射內(nèi)存,通過(guò)空間換時(shí)間的方式提高執(zhí)行效率。內(nèi)存分配單位是32位的,即4字節(jié)。位圖中每行象素的數(shù)據(jù)是連續(xù)的,而下一行不能和上一行共用一個(gè)內(nèi)存單元(4字節(jié)),所以每行象素的數(shù)據(jù)長(zhǎng)度必須是4字節(jié)的倍數(shù)。


Android 應(yīng)用如何定位卡頓、掉幀原因

造成應(yīng)用卡頓的情況無(wú)非兩種:

  • CPU、GPU 的性能有限,無(wú)法在規(guī)定的時(shí)間協(xié)同完成大量 UI 繪制。
  • 可用內(nèi)存過(guò)小導(dǎo)致頻繁 GC,從而導(dǎo)致繪制卡頓(代碼low)。

由于硬件問(wèn)題,我們不太好控制,這里我們主要針對(duì)軟件問(wèn)題進(jìn)行分析。
1> 手機(jī)開(kāi)發(fā)者模式中打開(kāi)調(diào)試 GPU 過(guò)度繪制,查看同一個(gè)區(qū)域 View 是否存在多次繪制。紫色代表過(guò)度繪制一次、綠色代表過(guò)度繪制兩次、淺紅色代表過(guò)度繪制三次、深紅色代表過(guò)度繪制大于等于四次。

2> 借助開(kāi)發(fā)工具打開(kāi) Android Device Monitor->Hierarchy View 查看 View 的布局是否合理。

3> TraceView 是 Android SDK 中內(nèi)置的一個(gè)工具,它可以加載 trace 文件,用圖形的形式展示代碼的執(zhí)行時(shí)間、次數(shù)及調(diào)用棧,便于我們分析。


多個(gè)設(shè)備連接 adb 時(shí),如何使用 install 命令

1> adb devices 列出當(dāng)前所有連接設(shè)備,例:emulator-5554、emulator-5553...
2> adb -s emulator-5554 install apk 路徑安裝 apk 文件到 emulator-5553 設(shè)備


Android Studio 調(diào)試出現(xiàn) waiting for debugger 的解決辦法

1> Studio 連接設(shè)備過(guò)多,關(guān)閉掉其他設(shè)備,只保留當(dāng)前正在使用的設(shè)備。
2> 終端調(diào)用adb kill-server隨后調(diào)用adb start-server。當(dāng)然前提需要在終端配置好adb環(huán)境變量。adb路徑:盤(pán)符/xxx路徑/Android/sdk/platform-tools/


View 背景溫故

color 標(biāo)準(zhǔn)表示是8位的16進(jìn)制表示的,而我之前一直用的都是6位。 顏色的十六進(jìn)制可寫(xiě)為#xxxxxxxx(8位)和#xxxxxx(六位) 六位數(shù)的就是特殊的八位數(shù)的十六進(jìn)制顏色。
劃分為#|xx|xxxxxx。 則|xx|內(nèi)的 xx 代表顏色的透明度。00 為全透明,而 ff 為完全不透明,xxxxxx相當(dāng)于#ffxxxxxx。 顏色和不透明度 (alpha) 值以十六進(jìn)制表示法表示。任何一種顏色的值范圍都是 0 到 255(00 到 ff)。對(duì)于 alpha,00 表示完全透明,ff 表示完全不透明。表達(dá)式順序是“aabbggrr”,其中“aa=alpha”(00 到 ff);“bb=blue”(00 到 ff);“gg=green”(00 到 ff);“rr=red”(00 到 ff)。

View 按下顏色一般為背景顏色透明度60%左右。


Bitmap 是什么?

Bitmap (位圖)一種以像素點(diǎn)填充的圖片格式,擁有很高的圖像色彩,常見(jiàn)形式一個(gè)像素點(diǎn)占用4字節(jié)、8字節(jié)內(nèi)存。此特點(diǎn)同時(shí)帶來(lái)一個(gè)問(wèn)題位圖內(nèi)存占用過(guò)高。

下面我們看一下 Bitmap 的內(nèi)存計(jì)算公式:圖片寬像素點(diǎn)和×圖片高像素點(diǎn)和×每個(gè)像素點(diǎn)占用的字節(jié)大小 = 圖片占用總內(nèi)存。

例:一張格式為1080×1920的圖片,如果此圖的圖片質(zhì)量為 ARGB_8888 標(biāo)識(shí)此位圖一個(gè)像素點(diǎn)占用 4 byte,那么我們看下此圖片大概占用多少內(nèi)存。
1080×1920×4÷1024 = 8100byte ≈ 8mb。
計(jì)算完 Bitmap 的內(nèi)存占用是不是頭冒冷汗?那么我們?nèi)绾蝺?yōu)化呢?主流的現(xiàn)在分為兩種:
1> 尺寸壓縮(100×100的圖片尺寸改為50×50)。
2> 圖片質(zhì)量壓縮(降低圖片的清晰度)。
3> 項(xiàng)目中優(yōu)先使用 xml 編寫(xiě)的 Shape 圖形、.9 圖片、普通圖片等。
具體如何壓縮小伙伴們自行百度嘍。


什么是 px、dp、sp、dpi、ppi

px:像素點(diǎn)。展示圖像信息的最小顯示單元。
dp:Android 中推出的一種用于適配不同密度手機(jī)的尺寸單位。其中有一個(gè)基數(shù),當(dāng)dpi=160時(shí)1dp=1px,基數(shù)越大1dp對(duì)應(yīng)的px越大。
sp:Android 中推出的一種可拉伸字號(hào)尺寸單位。sp 作為字體大小單位,會(huì)隨著 Android 系統(tǒng)的字體大小改變,而 dp 作為單位則不會(huì)。
dpi:dot per inch 的縮寫(xiě),指每英寸所包含的點(diǎn)。dpi 是一個(gè)與硬件相關(guān)的概念。例:打印機(jī),此處的點(diǎn)是指每英寸所能掃描的點(diǎn)或打印的點(diǎn)。
ppi:pixels per inch 的縮寫(xiě),指每英寸所包含的像素點(diǎn)。ppi 越大標(biāo)識(shí)每英寸屏幕所包含的像素點(diǎn)越多,圖片也就越清晰。

一個(gè)dp、px 在線(xiàn)換算網(wǎng)站:https://pixplicity.com/dp-px-converter


App 被系統(tǒng)回收所遇到的問(wèn)題

Activity 之間使用 intent 傳遞值如不進(jìn)行狀態(tài)保存,應(yīng)用異常問(wèn)題:
1> a頁(yè)面跳轉(zhuǎn)b頁(yè)面使用 intent 傳遞值:例:當(dāng)應(yīng)用停留在a頁(yè)面,由于用戶(hù)操作我們的應(yīng)用由前臺(tái)進(jìn)程轉(zhuǎn)為后臺(tái)進(jìn)程,一定時(shí)間后應(yīng)用被系統(tǒng)回收,當(dāng)用戶(hù)再次打開(kāi)我們應(yīng)用做跳轉(zhuǎn)操作。如a頁(yè)面 intent 中使用的值不進(jìn)行狀態(tài)保存,b頁(yè)面調(diào)用 getIntent().getExtras().getXXX 得到的值會(huì)是 null(造成空指針異常)


百度地圖獲取 SHA1

開(kāi)發(fā)版SHA1:
1> cd .android
2> keytool -list -v -keystore debug.keystore
3> 輸入秘鑰口令android回車(chē)

正式版SHA1:
1> keytool -list -v -keystore正式版簽名文件路徑,文件名為*.jks
2> 輸入簽名文件密碼回車(chē)密碼就是正式版apk包簽名文件,密碼同簽名文件密碼,文件為*.jks


Mac 很常用的一個(gè)命令
  • du -sh * - 列出當(dāng)前目錄下所有文件大小

Linux 文件解壓
  • tar –xvzf *.tar.gz 解壓 *.tar.gz 文件 *.tar.gz 為文件名

Linux 終端中需要掌握的一些快捷鍵
  • CTRL + U - 剪切光標(biāo)前的內(nèi)容
  • CTRL + K - 剪切光標(biāo)至行末的內(nèi)容
  • CTRL + Y - 粘貼
  • CTRL + E - 移動(dòng)光標(biāo)到行末
  • CTRL + A - 移動(dòng)光標(biāo)到行首
  • ALT + F - 跳向下一個(gè)空格
  • ALT + B - 跳回上一個(gè)空格
  • ALT + Backspace - 刪除前一個(gè)單詞
  • CTRL + W - 剪切光標(biāo)后一個(gè)單詞
  • Shift + Insert - 向終端內(nèi)粘貼文本
  • dpkg -i - xxx/xxx/xxx.deb 安裝deb軟件, 有時(shí)權(quán)限不夠dpkg前應(yīng)加sudo
  • dpkg -P - 卸載deb軟件, 權(quán)限不夠同上

Linux 制作快捷方式

1> 創(chuàng)建xxx.desktop文件
2> 按需將下面內(nèi)容拷貝到xxx.desktop文件內(nèi)保存退出

[Desktop Entry]
Name=xxx //應(yīng)用名稱(chēng)
Comment=Rayn-IDEA-IU
Exec=/home/rayn/idea/bin/idea.sh //應(yīng)用的可執(zhí)行文件,一般位于bin目錄
Icon=/home/rayn/idea/bin/idea.png//啟動(dòng)應(yīng)用的圖標(biāo)
Terminal=false//是否開(kāi)啟終端
Type=Application//標(biāo)識(shí)應(yīng)用程序

3.右鍵此文件-->屬性-->權(quán)限, 勾選允許文件為程序執(zhí)行


Ubuntu 安裝有道詞典

1> 下載適合自己操作系統(tǒng)的軟件版本(文件以deb結(jié)尾) http://cidian.youdao.com/index-linux.html
2> 安裝軟件 sudo dpkg -i xxx.deb
3> 啟動(dòng)軟件youdao-dict
如果Ubuntu是14版本可略過(guò)步驟4
4> 修復(fù)Ubuntu16無(wú)法啟動(dòng)的問(wèn)題

  • sudo apt-get -f install
  • sudo apt-get install tesseract-ocr

5> 啟動(dòng)軟件 youdao-dict


Ubuntu 如何安裝 flash 插件

1> sudo apt-get update
2> sudo apt-get install flashplugin-installer
3> 瀏覽器刷新頁(yè)面


Qt 無(wú)法輸入中文問(wèn)題

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/

當(dāng)然以上需要找到自己對(duì)應(yīng)的目錄才可以順利進(jìn)行
3> 重啟 Qt


此篇由于是工作中問(wèn)題的一些積累,所以會(huì)比較雜,高抬貴手別罵!

喜歡有幫助的話(huà): 雙擊、評(píng)論、轉(zhuǎn)發(fā),動(dòng)一動(dòng)你的小手讓更多的人知道!關(guān)注 Android_YangKe

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容