title: Android知識 author: 書蟲 tags:
- 技術原理 categories:
- 工作 top: false date: 2021-01-13 21:01:00
https://github.com/JsonChao/Awesome-Android-Notebook
Window指得是什麼?
各廠商手機Debug時的問題
我用的是VIVO X21A,Android 8.1.0系統,遇到的奇怪問題如下:
開發者模式開啟之後,無法連線adb命令,導致無法連線Android Studio。反覆開關debug開關無效,切換debug充電,傳輸檔案等無效。最後發現重啟之後就可以了。
安裝完測試包之後,所有功能無法正常聯網,全部顯示網路錯誤。而且部分功能一旦觸發直接崩潰,就好像是安裝包不完整一樣。這在其他手機上是沒有遇到過的。我原本以為是系統時間被修改了,檢查了一下,發現使用的是網路時間。最後找出了問題原因。引用別人的文章內容如下:
Android Studio 3.0會在debug apk的manifest檔案application標籤裡自動新增 android:testOnly="true"屬性,導致IDE中run跑出的apk在大部分手機上只能用adb install -t <apk>來安裝,在oppo手機上甚至安裝不了。
解決辦法:
在gradle.properties(專案根目錄或者gradle全域性配置目錄 ~/.gradle/)檔案中新增
android.injected.testOnly=false測試有效。
值得研究的技術專題
1. Activity 啟動流程 和 AMS 那些事
2. Context 與 Android四大元件
3. Activity Manager Service 與 Window Manager Service
4. 自定義View系列(onMeasure、onLayout、onDraw)、事件傳遞
5. Android ClassLoader機制(外掛化準備)
6. Android 資源打包流程(外掛化)
7. Java反射 註解
8. Android 外掛化與熱修復技術
9. Fragment框架解析
手勢返回框架
Android中的程序和執行緒
Binder機制
Flutter上手
Android Push原理
dex 與 Android 虛擬機器
gradle task系列
OpenGL技術影片特效處理
知識點記錄
經常遇到的程式碼錯誤總結
歷史原因,專案中既有com.alibaba.fastjson.JSONObject又有org.json.JSONObject。把com.alibaba.fastjson.JSONObject強制轉換成org.json.JSONObject導致錯誤。
程式碼混淆:有多少次花大把的時間除錯bug最後發現是實體類被混淆了導致的。實體類混淆創造了在同一個地方跌倒的最大次數的記錄。
4.x系統機型上相容問題
ListView中類轉換異常,錯誤日誌。
java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to
android.widget.AbsListView$LayoutParams
at android.widget.ListView.setupChild(ListView.java:1901)導致錯誤的程式碼是按下面第一行寫法寫的,第三行寫法是正確的。
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
view.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,AbsListView.LayoutParams.MATCH_PARENT));這是因為在4.x系統上setupChild原始碼是這樣寫的
AbsListView.LayoutParams p = (AbsListView.LayoutParams) child.getLayoutParams();
if (p == null) {
p = (AbsListView.LayoutParams) generateDefaultLayoutParams();
}所以 導致類轉換異常。
ImageView
預設的scaleType是FIT_CENTER
Android檔案路徑
什麼是APP專屬檔案?
所謂專屬檔案就是它是屬於某個具體的應用的,他的檔案路徑都帶有相應的包名,當APP解除安裝時,它們會隨應用一起刪除,當我們在設定裡面手動清除某個應用資料時(不是清除快取),它們也會一起被清掉。Android使用這種專屬檔案的目的就是為了方便檔案管理,避免檔案隨意儲存,顯得很亂,另一個目的就是為了當應用被解除安裝時不會留下很多垃圾檔案。
清除資料和清除快取到底清除了什麼資料
清除快取:我們知道應用程式在執行過程中需要經過很多過程,比如讀入程式,計算,輸入輸出等等,這些過程中肯定會產生很多的資料,它們在記憶體中,以供程式執行時呼叫。所以清除快取清除的是APP執行過程中所產生的臨時資料。
清除資料:清除資料才是真正的刪除了我們儲存在檔案中的資料(永久性資料,如果不人為刪除的話會一直儲存在檔案中)例如當我們在設定裡面清除了某個應用的資料,那麼/data/user/0/packname/和/storage/emulated/0/Android/data/packname/下的檔案裡面的資料會全部刪除,包括cache,files,lib,shared_prefs等等。
內部儲存,外部儲存,機身儲存
機身儲存;機身儲存是指手機自身攜帶的儲存空間,出廠時就已經有了,4.4以前機身儲存就是內部儲存,4.4及以後機身儲存包含了內部儲存和外部儲存
Android手機路徑
在Google Pixel 3A, Android Q手機上測試結果如下:
Context().getExternalCacheDir()
Context().getExternalCacheDirs()對應的路徑是/storage/emulated/0/Android/data/com.xxx.xxx/cache
Context().getFilesDir()對應的路徑是/data/user/0/com.xxx.xxx/files
Context().getCacheDir()對應的路徑是 /data/user/0/com.xxx.xxx/cache
Environment.getExternalStorageDirectory()
Environment.getExternalStorageDirectory()對應的路徑是 /storage/emulated/0
小結:
- 安卓4.x的系統getFilesDir()返回的路徑是/data/data/packname/files
- 安卓6.x+系統getFilesDir()返回的路徑是/data/user/0/packname/files
- 其他API也有類似變化 關於安卓系統路徑的更多討論,參考徹底搞懂Android檔案儲存---內部儲存,外部儲存以及各種儲存路徑解惑
Android中.9圖片的含義
繪製之前先來說一下.9圖片的四條黑邊的意義,每條黑邊的意義都不一樣。
- 頂部:在水平拉伸的時候,保持其他位置不動,只在這個點的區域做無限的延伸(複製)
- 左邊:在豎直拉伸的時候,保持其他位置不動,只在這個點的區域做無限的延伸(複製)
- 底部:在水平拉伸的時候,指定圖片裡的內容顯示的區域
- 右邊:在豎直拉伸的時候,指定圖片裡的內容顯示的區域
