LG G2 (LG-D802) 刷機備忘

LG G2 D802

G2 原生的 Rom 其實還不錯用,尤其是相機的功能,可以在待機時,長按音量鍵直接進入相機,然後再重按音量鍵拍鍵進行拍照的功能,真的可以單手拿出手機來拍照。還有右下角可以拉出通知列的按鈕,都是很好用的功能。

但是原生的 Rom 畢竟還是太多用不到的功能,像是 LG 內建的鍵盤或是主題更新的功能。

趁著這次手機螢幕摔破送去維修,乾脆把手機整個重新整理一次,也把刷新的過程中也遇到一些問題記錄一下。

刷機流程

  1. Root 手機:為了能夠更新 Recovery
  2. 更新 Recovery:原本 LG 提供的 Recovery 只有一個功能,就是還原原廠預設值。所以我們要一個能夠刷入其它 Rom 的 Recovery
  3. 刷 Rom:就像重灌作業系統一樣。
  4. 刷 gapps:裝 Google Play 之類的核心軟體,要裝其它APP會很麻煩。

Root 手機

這個部份算是最簡單的,只要使用 Kingroot 就可以直接在手機上 Root 手機了。

更新 Recovery

原本 LG 提供的 Recovery 只有一個功能,就是還原原廠預設值。
所以我們要一個能夠刷入其它 Rom 的 Recovery,我選擇了網路上比較多人在用的 TWRP

一開始是使用 TWRP Manager , ,因為它比較方便,可以像 Kingroot 一樣直接在手機上就可以把 Recovery 更新成 TWRP。
事實上它的確也幫我把 Recovery 更新成了 TWRP,但是因為 TWRP Manager 更新後的版本是 v2.8.6.x ,所以一開始 CM 12.0 可以正常刷入。但是要刷入 CM 12.1 或是 CM 13,就會刷失敗。
第一次刷失敗時,我就改用 CM 官方提供的 CMRecovery,順便把手機刷成 CM 13,但是就遇到一個很大的問題,gapps 會刷失敗,刷其它 Rom 也會失敗,也不能更新其它的 Recovery,而且 CMRecovery 功能又很少,等於卡在這裡,要用 CM 13 但是不能刷 gapps,但是又不能刷其它的 rom。

結論就是,CMRecovery 根本是個雷!!!!

於是本來流程應該就是以上 4 個簡單的步驟,結果就多了一個 KDZ 副本要跑⋯⋯

KDZ

在維修手機時還到奇奇怪怪的問題,重灌就對了,所以這應該就是 LG 提供給公司內部員工使用的工具。

KDZ 工具跟使用方式,基本上按照下面的網址進行,都沒有遇到什麼問題。
http://blog.roodo.com/jason1204/archives/27616298.html

反而是在下載 KDZ 檔的時候卡住,大家都提供 LG 官方的連結,但是這個連結已經失效了,所以花了一些時間在找 KDZ 檔。

最後是在這個網頁下載到了,裡面是全世界的 D802 KDZ 檔,也試了好幾個檔案才找到對的 KDZ 檔。
先找到 TAIWAN_OPEN_16G 這個區塊,然後下載裡面的編號是 842 的檔案
http://lg-phone-firmware.com/index.php?id_mod=36

刷完 KDZ 後,記得一定要再進 Recovery 做一次還原原廠預設值。不然會一直在開機過程中重開機。
(因為剛 KDZ 結束,所以 Recovery 也會被還原成 LG 提供的 Recovery)

重頭再來

所以 KDZ 後,上次的步驟都要重新再來一次,這次上網再爬文得仔細一點,看了大家在用 TWRP 刷 ROM 時,都是用比較新的版本。
先去下載新版的 TWRP Recovery Image 檔,然後再使用 TWRP Manager 更新。

所以這次在更新 Recovery 時,有幾個重點要注意了。

  1. 不要更新成 CMRecovery
  2. TWRP 要更新到 2.8.7.x 以上的版本

這樣之後要刷成 CM 12.1 或是 CM 13 或是要刷 gapps,都不會遇到奇怪的問題了!

刷 Rom x Gapps

經過前面的情況,這兩個步驟就跟喝水一樣簡單啦!哇哈哈!

Android Activity

Activity

Activity 是在開發 Android APP 時,第一個會遇到的 component,每一個頁面基本上都是一個獨立的 Activity。
在使用 Activity 時,有一個很重要的部份就是如果開啓 Activity 以及該 Activity 結束後會去哪裡?

第一個 Activity

在手機開機後,第一個 Activity 就是 Lock Screen,解鎖後就是進入 Home Screen 的 Activity。

假設我們點擊在 Home Screen 上的 Gmail 圖示,就是進入 Gmail APP 並開啓 Gmail Main Activity。並且進入到某一封信中。

這時,如果回到 Home Screen 開啓 Facebook APP時,也會進入 Facebook Main Activity。然後在 2 個 APP 中交叉使用,可以看到 Android 會各自記住每個 APP 目前是停留在哪一個 Activity,以及前一個 Activity 或是前5個 Activity 的歷程。

那 Android 是怎麼管理每個 APP 的 Activity ?

Task

Google 文件上的說明

每個 APP 在一開始啓動時,Android 就會幫該 APP 建立一個名為 Task 的 Back Stack 來記錄 Activity 的使用記錄,並且把 Main Activity 放入 Stack 中。

當使用者在 Main Activity 操作開啓 Second Activity 時,Second Activity 會被放在 Stack 中最上層的位置。

當使用者按下 Back Button 關閉 Second Activity 時,會把 Stack 中的 Second Activity 移除,而被壓在下面的 Main Activity 就會顯示在畫面上。

在 Stack 中的 Activity 不會被重新排序,只會被以後進先出的方式進行 Push 跟 Pop。

那不同的 Task 間如何互動?

當使用者按下 Home Button 回到 Home Screen 時,原本的 Task 會被完整的存在放 Background,而 Task 中的 Activity 都會進入 Stop 的狀態。

回到 Task 時,原本 Activity 的歷程都會被保留下來並顯示離開前最後的 Activity。

Intent

Activity 可以使用以下的程式開啓另一個 Activity。

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);

這看起來很單純,但是難的部份是像以下的歷程

Main > A > B > A > B > A > C

當使用者在 C 時,需要按幾次 Back Button 後才能回到 Main 呢?
在預設每次開啓 A 都是全新的 A,所以需要按 6 次才能回到 Main。

但是有時 A 與 B 是切換的關係,可能是同樣的列表但不同的顯示方式,C是列表中某筆詳細資料,這時,使用者會預期他只需要按 2 次 Back Button 就能回到 Main 了。

Activity 的一個 launcheMode 的屬性是用來規定該 Activity 啓動的方式。
設定 LaunchMode 的兩種方法

  1. 在 manifest 檔案中的 Activity Tag 來設定
  2. 在 Intent 加入 Flag 來設定

當同時設定時,會以 Intent 中的 Flag 為最後的設定。

在 manifest 檔案中設定 launchMode

<activity android:name=".activities.MainActivity"
    android:launchMode="standard" />

standard

每次開啓 Activity 都是一個全新的頁面

singleTop

如果該 Activity 目前在 Task 的最上層,則不會再建立一個新的 Activity 而會直接使用目前已建立好的 Activity 並呼叫 Activity 中的 onNewIntent 函式。
如果目前該 Activity 並沒有被開啓,就會在目前的 Task 新建一個全新的 Activity。

singleTask

Android 會新建一個全新的 Task , 然後在剛建好的 Task 中建立一個全新的 Activity。
如果該 Activity 已經被建立了,就會直接使用目前已建立好的 Activity 並呼叫 Activity 中的 onNewIntent 函式。

singleInstance

跟 singleTask 大致上一樣,不過 Android 不會把其它 Activity 加入到目前的 Task。

在 Intent 加入 Flag 設定 launchMode

Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

FLAG_ACTIVITY_NEW_TASK

跟 singleTask 一樣

FLAG_ACTIVITY_SINGLE_TOP

跟 singleTop 一樣

FLAG_ACTIVITY_CLEAR_TOP

如果該 Activity 已經被建立了,就會直接使用目前已建立好的 Activity 並呼叫 Activity 中的 onNewIntent 函式,並且把疊在該 Activity 以上的其它 Activity 都清掉。

Activity Lifecycle

最後,下面這張圖解釋了在 Activity 相互切換時,在什麼時間點哪些 Function 會被呼叫到。

Activity LifeCycle from http://i.stack.imgur.com/EVuKo.png

參考網頁
Task and Back Stack - 官方文件,必看。
Manipulating Android tasks and back stack
Managing Activity Backstack - 用圖解的方式解釋 launchMode,推薦看。

Regular Expression - 正規式搜尋

enter image description here
RegExr 是個人目前使用過最好用的線上驗證工具。

先在下方餵入 Sample 資料,然後在上方輸入 Regular Expression,就可以馬上看到符合條件的文件區塊有哪

Tmux

為什麼要用 Tmux

使用SSH/Telnet 登入到遠端的 Server 進行一些操作的時候,都會遇到幾種情況。

當某個指令需要執行一段時間時, 只能等指令執行完,才能再繼續下一個指令。
或是有些指令可能要執行幾個小時以上,但是又等得想關機去睡覺了,但是一關機,指令也被中斷了。
或是執行到一半的時候,突然斷線了,指令也不正常的結束了。

Tmux 或是 Screen 都是為了解決以上情況的程式,他能夠把你要執行的指令放到背景去執行。
讓你能夠隨時跳到另一個 Command Line Interface 或是離線之後再連線回來看指令執行完的結果。

簡單說,就是一種 「Terminal 中的 Terminal」 的概念

安裝 Tmux

現在 Linux 安裝套件都相對簡單多了,通常都只要一個指令安裝完成,不用去解決很多套件間依賴性的問題。

apt-get install tmux

使用 Tmux

要使用 Tmux 通常要 2 種情況,一種是建立新 Session,一種是回到上次指令執行到一半就離開的 Session

建立新 Session

# tmux

// 把新建的 Session 取名為 naurudao
# tmux new -s naurudao

回到上次指令執行到一半就離開的 Session

// 先把目前 session 列表出來,看要回到哪個 session
# tmux ls 
naurudao: 1 windows (created Fri Feb 26 10:59:48 2016) [156x42]

// 回到剛剛建好的 [nauduao] tmux session
# tmux attach -t naurudao

進入 Tmux 後

Tmux 是很厲害的 Terminal ,除了可以讓你把指令執行到一半就先離開的功能,
還能分割視窗,讓你可以一邊看指令目前的執行進度,一邊下其它的指令。

只是這些功能,都要透過 Tmux 專屬的快速鍵才能操作。

Tmux 快速鍵

Tmux 的快速鍵是一種 combo鍵的概念,有2個階段,

第一階段,先按下 Ctrl+b
第二階段,然後再接著按下特定功能的快速鍵

第一階段是告訴 Tmux ,我要使用快速鍵囉,第二階段才是告訴 Tmux 要做什麼事情。

功能 快速鍵
離開指令執行到一半的 Session Ctrl+b > d
陸續更新有用到的快速鍵…

Ctrl+b 不好按!

在 Tmux 之前,其實大家是習慣使用一套叫做 Screen 的套件,功能跟 Tmux 很類似,但因為 Tmux 更強大,所以大家慢慢都從 Screen 換成 Tmux
但是套件換了,快速鍵大家還是習慣 Screen 的按法。

Screen 的快速鍵也是分為 2 個階段,只是第一階段的按法是 Ctrl+a。
如果想要把 Tmux 的第一階段按法也改成 Ctrl+a的話,
只要在 ~/.tmux.conf 中加入以下三行就可以了

set -g prefix ^a  
unbind ^b  
bind a send-prefix

參考網頁
Tmux 教學 + Screen 到 Tmux 的無痛轉換
从 screen 切换到 tmux

好用的 Linux 指令小抄

JSON Format / JSON Pretty Print

把 JSON 漂亮工整地顯示出來
## 如果系統有裝 python
# echo '{"name": "Jason", "age": "33"}' | python -mjson.tool
{
    "age": "33",
    "name": "Jason"
}

## 如果系統有裝 node
# node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));" '{"name": "Jason", "age": "33"}'
{
    "name": "Jason",
    "age": "33"
}

列出有哪些 Process 在佔用 Port

sudo lsof -i | grep TCP

持續更新 :: TO BE CONTINUED

API Blueprint - 建立 API 文件的好工具

API Blueprint

一直以來都在找一套可以方便快速地建立 API 文件的工具,對於這個工具,個人覺得需要符合以下幾個要求

  • 觀閱文件的人不用安裝軟體,所以最好能夠產出 PDF 或 HTML 這類靜態文件
  • 文件內容需要乾淨清楚,不用太複雜的附加功能
  • 可以快速跳到某個 API 的內容
  • 可以直接透過打字的方式建立文件,不用滑鼠拉來拉去,最好就是 RAML 這類通用的格式
  • 對於 API 中傳遞的參數或資料結構能 Highlight 標示出來

看起來沒有很奇怪的要求,但就是找不到一個符合的工具。

今天剛好看到有個叫做 API Blueprint 的東西,就來試試看吧
API Blueprint - https://apiblueprint.org/

API Blueprint 算是一種專門用來描述 API 的檔案格式。
文件的寫法是使用 Markdown,標準的副檔名是 apib。

雖然是 Markdown 格式,但 API Blueprint 還是對不同的 tag 有自己的解釋。
所以需要有 Editor 跟 Viewer 來搭配。

Editor - API Blueprint Grammar for Atom

API Blueprint Grammar for Atom
從 API Blueprint 的網站看到 sublime text 跟 atom 都有 plug-in 可以用, 如果不想用 Plug-in 的話,也可以試試把 Code Style 調成 Markdown 也是可以。

apm install language-api-blueprint

Preview - API Blueprint Preview

API Blueprint Preview for atom
可以邊編輯 apib 時,馬上預覽文件的結果。
這個 plug-in 需要 aglio 套件,而 aglio 是用 node.js ,所以還必須先安裝 node.js

sudo npm install -g aglio

安裝 aglio 後再安裝 plug-in

apm install api-blueprint-preview

產生 API 文件

API blueprint Document
apib 文件編輯完成後,當然是產出 API 文件囉!
把 API 文件轉出成 HTML 可以讓其它需要觀閱的人不用安裝軟體就能直接開啓。

要轉成 HTML 文件,其實不用再安裝其它套件了,因為剛剛安裝好的 aglio 就可以做到了。

簡單透過下面的指令就完成了。

aglio -i service.apib -o api.html