星期三, 5月 17, 2017

Android: APN: OTA後立即更新APN清單

總結谷歌網路上的解法
1.去修改alps\build\tools\releasetools\ota_from_target_files
這應該只是把人家MTK的FAQ貼出來啊,問題是,你開發的平台不一定是MTK的平台
所以,不是MTK版本的android那就不用試了,而且這作法只僅限KK之前的版本。

2.實作一個BroadcastReceiver ,在開機後去檢查OTA的版本有沒有變更,若有就去做restore to default的動作。

apn list的建立是透過查找telephony.db的mcc+mnc來列出,而一開始並沒有產上,它是讀取/etc/apns-conf.xml建立的,一旦建立,之後開機就不再會去檢查/etc/apns-conf.xml。
所有的操作都是透過SQL來查詢DB。所以基本上,因為OTA不會更新到userdata,所以OTA只會更新/etc/apns-conf.xml,那麼要更新儲存在data/data/com.android.providers.telephony/databases/telephony.db,就只能刪除後才會重新建立。

所以解法2也是走這個思維,一般手動操作也是透過"Cellular networks" ->"Access Point Names" ->"reset to default".或是factory reset達到目的。

事實上,在android\packages\providers\TelephonyProvider\src\com\android\providers\telephony\TelephonyProvider.java的程式中,其實還有另外一種更新的條件。
那就是在onCreate它會去檢查build id("ro.build.id"),如果build id不一致,那就會去做更新APN DB的動作。所以,我們也可利用這段程式碼,加上新的更新條件,例如檢查APN版本(這個要另外新增和維護)


其他:
1.apn file的來源除了原本放在 "/etc/apns-conf.xml",其實程式碼也還有另外定義幾個位置
  a.OEM_APNS_PATH   "/oem/telephony/apns-conf.xml"
  b.OTA_UPDATED_APNS_PATH "/data/misc/apns-conf.xml"
  c.REGIONAL_APNS_PATH "/etc/regional-apns-conf.xml"

a,b兩項都會去檢查檔案建立的時間戳記,誰是最新的最後就是用誰
c項則是針對前面動作結束後,再對Regional去做更新

2.android\packages\apps\Settings\src\com\android\settings\ApnSettings.java
這邊有些APN查詢的操作

參考來源:
OTA升级过程中更新APN数据库
http://blog.csdn.net/lipengshiwo/article/details/52133571
http://blog.csdn.net/sergeycao/article/details/39641885
Android APN配置
http://blog.csdn.net/yangwen123/article/details/10526871
OTA Updates
https://source.android.com/devices/tech/ota/

沒有留言: