|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 ↑