|Tools| Git v.s Repo

一般跟別人合作開發都是使用 git。那 repo 是什麼?
repo 是 Google 開發出來的工具,用來管理 Android 的。

一份 Android code 是由許多 project 組成的,每個 project 就是一個 git project。
repo 這個工具,就是可以管理 branches 以及眾多的 git project!

> repo init 後,可以找到 .repo/manifest.xml 這會記錄你控制的 projects

*基本工作流程與對照:

repo git
repo init -u URL -m ooxx.xml -b remote_branch git clone URL
repo sync -c git pull URL remote_branch:local_branch
repo start branch_name –all git branch branch_name
git status git status
git add git add
git commit git commit
repo upload . git push


*git 好用指令:
 > 查詢遠端的server 位置及名字
 git remote -v
 > 新增一個遠短 server
 git remote add {given_name} URL
 > 強迫 reset
 git reset –hard {local_branch}
 > 把 commit 推到遠端 branch
 git push {given_name} {local_branch}: refs/for/{remote_branch}
 > 從遠端 branch 拉 code 下來
 git pull {given_name} {remote_branch}:{local_branch}
 > 當前一個修改已 commit,又想把這次修改跟上一個修改一起 commit
 git commit –amend
 > 想上 patch 到某個已經 push 出去的 change
 git push {given_name} {local_branch}:refs/changes/{change_id}
 > 查詢某行的歷史
 git blame -L [行數] [檔案名]
 > 檢別 branch 的 commit 到目前的 branch
 git cherry-pick [sha-1]

*好用的配置
 > git commit 的模板:
 新增一個  ~/.git-template
 然後 git config commit.template ~/.git-template

 > 設置reviewers, git push rest,就會自動帶上 reviewers
 到 .git/config 編輯
 [remote “test”]
 pushurl = ssh://account@server_address:port/project_name
 push = {local_branch}:refs/for/{remote_branch}%r=someone1@mail, r=someone2@mail

*製作 patch,打 patch
 (在 branch A)
 git log
 git format-patch -1 [sha-1]
 mv ooxx.patch ~/
 (換到 branch B)
 git am [~/ooxx.patch]


值得注意的是:
pull 的 server / review 的 server / push 的 server 可能不同,
設置 push 的 server 時,請去確認 repo upload 時,到底是推到哪?


ref. [Coding] repo & git 的使用方法

|Job| Application No Response Analysis

ANR 的發生情形,通常是時間到了還沒有回應!所以掌握這個想法,就比較好找 Code。

比較常見有三種情形:

  1. Service Timeout
  2. BroadcastQueue Timeout
  3. ContentProvider Timeout

 

Case 1. Service Timeout

 a. Service 啟動後,會發送 SERVICE_TIMEOUT_MSG 消息
 b. Service 刪除後,就會刪除 SERVICE_TIMEOUT_MSG 消息
 c. 如果 SERVICE_TIMEOUT_MSG 未删除,時間到後就會 ANR

 呼叫 ActiveServices 的 serviceTimeout 方法進行處理,
 serviceTimeout方法邏輯:

 if (anrMessage != null) {
  mAm.appNotResponding(proc, null, null, false, anrMessage);
 }

 

Case 2. BroadcastQueue Timeout

 BroadcastQueue 中的 mHandler 收到 BROADCAST_TIMEOUT_MSG 消息時會觸發

 // 正常要發送消息前
 broadcastTimeoutLocked(false);

 // 發送消息,鎖住
 case BROADCAST_TIMEOUT_MSG: {
  synchronized (mService) {
   broadcastTimeoutLocked(true);

 // ANR
 在 broadcastTimeoutLocked 方法中,首先取得 anrMessage 字串

 anrMessage = “Broadcast of ” + r.intent.toString();

 mHandler.post(new AppNotResponding(app, anrMessage));
 mService.appNotResponding(mApp, null, null, false, mAnnotation);

 

Case 3. ContentProvider Timeout

 MainHandler 的 handleMessage CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG

 private final void processContentProviderPublishTimedOutLocked(ProcessRecord app) {
cleanupAppInLaunchingProvidersLocked(app, true);
 removeProcessLocked(app, false, true, “timeout publishing content providers”);
 }

 app.kill(reason, true);

 

ref.

https://blog.csdn.net/u012439416/article/category/7261623

 

|RIL| Data Connection Flow

觀念:

  1. 啟動數據服務前,要先設定 APN。APN 在上層有一份,在 modem 也有一份
  2. 是可以只用 modem 裡的那份 APN (嵌入式平台)
  3. Android 是由上層帶 APN 給 modem 的
  4. 上層主要是看 bringUp & RIL 的 setupDataCall

 

以下只講部分關鍵點。

 

# load 上層的 db:TelephonyProvider.java

  loadApns()

# TelephonyManager:使用者點開數據上網的 Icon
  public void setDataEnabled(boolean enable) {
   setDataEnabled(getDefaultDataSubscriptionId(), enable);

# DcAsyncChannel:填入 APN, 準備往下帶
    public void bringUp(ApnContext apnContext, int profileId, int rilRadioTechnology,
                        boolean unmeteredUseOnly, Message onCompletedMsg,
                        int connectionGeneration) {
        mLastConnectionParams = new ConnectionParams(apnContext, profileId, rilRadioTechnology,
                unmeteredUseOnly, onCompletedMsg, connectionGeneration);
        sendMessage(DataConnection.EVENT_CONNECT, mLastConnectionParams);

# DataConnection:StateMachine 收到要建立連線啦!
 public boolean processMessage(Message msg) {
  …
   case EVENT_CONNECT:
    if (DBG) log(“DcInactiveState: mag.what=EVENT_CONNECT”);
     ConnectionParams cp = (ConnectionParams) msg.obj;
     if (initConnection(cp)) {
      onConnect(mConnectionParams);

# RIL:終於送到 RIL了,要往 Modem 前進啦!

 mPhone.mCi.setupDataCall(cp.mRilRat, dp, isModemRoaming, allowRoaming, msg);

 

Ref. https://blog.csdn.net/u012439416/article/details/75263645

|Jobs| Why should we do unit tests?

In my opinions, I think it is a good way to understand the job scope for a rookie of software engineer.

On the other hand, our products are consumer electronics. Unit tests will help us understand what functions are end users used and whether functions are really useful or not.

Finally, it is an important way to think about why do you develop the features.

下禮拜打算請新人幫忙測試 Unit Tests, 希望他心裡不要太多 murmur.
雖然代工廠不重視這個, 但我認為這是一個認識自己工作的方式. 而且趁機多問一些, 還能夠學到一些設計的方法與考量.

嗯 …… 老實說, 代工廠跟自己做品牌其實思維真的很不同.

 

 

|Jobs| How can operators detect tethering?

出國玩,買 SIM卡 一定要注意,這張卡是否能夠當作 WiFi hotspot 分享給別人,

有的卡是不行的哦!!

 

在某次出差 (2017),我發現,電信業者是有能力知道這張 SIM卡是否有能力 WiFi hotspot,並且禁止這張卡做分享。

我一直以為是 framework 的行為(軟體端去擋),但是我做了一些實驗,發現電信商是可以控制的。(最近的新案子也有談到類似的東西)

表示在卡號之外,你這張卡是否有分享給別人,或者,
別支手機是否透過分享上網的,這兩個一定有其中一個資訊會被電信商知道。

 

稍微上網查了一下,電信商可以偵測到以下資訊,推斷出
你是否正在分享給別人/你是否是透過不能分享的網路上網

How can phone companies detect tethering (incl. Wifi hotspot)

  1. Your phone tells your network that you are tethering
  2. Inspecting the network packets for their TTL (time to live)
  3. MAC address inspection
  4. TCP/IP Stack Fingerprinting
  5. Looking at the Destination IP/URL

 

特別是去英國,要查一下你的卡哦!

Tethering on UK Networks: Which Mobile Networks Allow You To Tether?

|Design| Make a cache in your program.

Cache 原意是指存取速度比一般隨機存取記憶體(RAM)快的 SRAM。
但在軟體中,就是指:暫存的機制。
目的是:降低存取一些值的代價。

你可以不用為了某個值,每次都要去問底層。
或者,某些 indicator 更新太頻繁,但你不希望上層跟著一直做無意義的更新,就會需要一個 Cache (很像 Temp 去接著它)。

 
比較常見的例子:
瀏覽器的 Cache 功能是可以減少你抓取資料的時間。

|Jobs| LTE 是如何拿到位置和時間的?

先介紹一個詞:System Information Block

LTE 的系統資訊,會廣播到手機端,其中,

SIB16: GPS Related Informatin,

    包含位置及世界標準時間 (Coordinated Universal Time, UTC) 資訊

 

所以手機時間的來源有:

LTE 網路、NTP Server、或是電信商可能會支援 NITZ

延伸:

NTP (Network Time Protocol) Server?

NITZ (Network Identity and Time Zone)?

|NEWS| What is Rich Communications Services (RCS) ?

有錢的通訊服務,提升之後更能從使用者身上刮錢提高使用手機服務的品質。

主要提升三項手機的基本服務:簡訊、電話簿、通話品質。

是說這年代誰還在用手機講電話?

RCS 簡訊,可以直接傳送圖片影音,甚至是完成購物的流程,這樣難道不夠噱錢嗎?

這行為是不是讓我們很熟悉?LINE!!! 最近還開通了轉帳服務呢!

也就是說,到時候可能這些 APP 會跟 RCS 正面衝突呢?

不過,RCS 最重要還是依賴電信商 (Mobile Network Operator,MNO) 支援與否 (因為需要 IMS core system),所以這一天還有一段時間。(軟體服務這邊,Android Framework 這邊看來是提供支援了,那對於手機設備應該難度就大幅降低了)

YouTube:6 0:54 / 1:15 Android Messages: The messaging app built for Android

也許可以整合:SMS (Short Message Service,簡訊服務) 及 MMS (Multimedia Messaging Service,多媒體簡訊)?

BTW. 也就是說,現在在台灣,如果看到手機上有 RCS 可以先關掉或停用 (反正台灣用不了),以免耗電。可以自己打 keywords 問辜狗我在說什麼 XD

 

ref.

GSMA:rcs-documentation

Google’s support for RCS

新一代RCS多媒體簡訊更普及了,Google公布43家支援業者清單,只發簡訊就內嵌購物按鈕!

Wiki – RCS

Google開始部署RCS,Android傳訊服務升級至多媒體 (2016)

WordPress.com.

Up ↑