OTA升级过程中更新APN数据库

来源:互联网 发布:网络没sei了什么意思 编辑:程序博客网 时间:2024/05/16 12:37

L平台修改方案:

原理说明:

   由于L平台上添加了权限限制,所以上述方法无法达到更新APN列表OTA升级后开机即生效的目的。

APNSetting源码,位于packages/apps/Settings/src/com/android/settings/目录下:首先找到ApnSettings类,继承于PreferenceActivity,并实现了Preference.OnPreferenceChangeListener接口。

      当用户进入APN列表界面就会进入上述ApnSettings类,点击menu,调出Reset to default,点击之后会去擦除APN数据中的restore部分,并重新从apns-conf.xml读取生成数据库。而我们OTA升级之后的情况是,数据库telephony.db没有改变,但是apns-conf.xml配置文件有更新,需要进行恢复出厂设置或者上述Reset to default才能重新从新的apns-conf.xml生成新的数据库。

       当前手机版本经过OTA升级到新版本后,ro.build.version.incremental所获取的手机版本号为最新版本号,和之前手机版本号进行对比正好可以作为判断当前开机过程是否是进行OTA升级之后的重启。研发创建一个键值对,先将初始化值设为“0000”,当前版本进行OTA升级后,将升级后的版本号写入persist.ota.apn.version中,用于下一次升级后的版本号和手机未升级时的版本号进行比较。如果开关机不是用于OTA升级,则两个键对应的值是一样的,不会执行Reset to default流程去更新数据库。相反OTA升级则有版本号升级,会去执行更新数据库。

       由于考虑到并不是每一个版本OTA升级的时候都需要进行APN数据库的更新操作,我们加入版本控制,采用配置文件xml的控制方式,往其中写入OTA升级后的版本号,进行最后一步是否需要升级的控制。

    流程说明:

1,首次OTA更新合入此修改方案,接收到开机广播消息,判断创建的persist.ota.apn.version键值是否等于初始值,如果是,作为首次合入方案后OTA升级的判断条件,进行APN数据库重新更新。

2,合入OTA更新方案后续的OTA升级时,获取升级之后的版本号与我们存入的persist.ota.apn.version键值进行比较,如果不同且与版本号配置文件中的版本号相同,则进行APN数据库重新更新。

3,恢复出厂设置之后会自动进行删除APN数据库和创建APN数据库的操作,此时persist.ota.apn.version键值被擦除,重新回到步骤1的逻辑。

这一部分逻辑可以查看下面流程图:

 


 

 

Code:

package com.android.settings;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.SharedPreferences;import android.net.Uri;import android.content.ContentResolver;import android.os.SystemProperties;import com.mediatek.settings.sim.Log;public class ApnUpdateReceiver extends BroadcastReceiver {    private static final String TAG = "ApnUpdateReceiver";    private Context mContext;    private static boolean mRestoreDefaultApnMode;    public static final String RESTORE_CARRIERS_URI =            "content://telephony/carriers/restore";//subId    private static final Uri DEFAULTAPN_URI = Uri.parse(RESTORE_CARRIERS_URI);    private  Thread mRestoreDefaultApnThread;    /// @}    @Override    public void onReceive(Context context, Intent intent) {        mContext = context;        Log.d(TAG, "onReceive()... action: " + intent.getAction());        otaUpdateApn(mContext, intent.getAction());    }    private void otaUpdateApn(Context context,String action){        if (action.equals("android.intent.action.BOOT_COMPLETED")) {            SharedPreferences prefs = context.getSharedPreferences("apnota", Context.MODE_WORLD_READABLE);            String mOtaDefaultVersion= prefs.getString("persist.ota.apn.version", "0000");            String mOtaCurrentVersion=SystemProperties.get("ro.build.version.incremental", "0000");            boolean isOtaUpdate =false;            Log.d(TAG,"hugo1:getVersion:- mOtaDefaultVersion" + mOtaDefaultVersion + "====mOtaCurrentVersion==>" + mOtaCurrentVersion);            if (mOtaDefaultVersion.equals("0000")){                prefs.edit().putString("persist.ota.apn.version", mOtaCurrentVersion).commit();                isOtaUpdate = true;                Log.d(TAG,"hugo:comein 1 ");            }else{                if(!mOtaCurrentVersion.equals(mOtaDefaultVersion)){                    prefs.edit().putString("persist.ota.apn.version", mOtaCurrentVersion).commit();                    isOtaUpdate = true;                    Log.d(TAG,"hugo:comein 2 ");                }else{                    Log.d(TAG,"hugo:comein 3 ");                }            }            if(isOtaUpdate){                restoreDefaultApnEx(context);            }        }    }    private void restoreDefaultApnEx(Context context) {            Log.d(TAG,"hugo:comein restoreDefaultApnEx ");            //String sourceType = "";            final String where = "sourceType = \'0\'";            mRestoreDefaultApnMode = true;            mContext = context;            mRestoreDefaultApnThread = new Thread(new Runnable()            {                @Override                public void run()                {                    Log.d(TAG,"hugo:comein delete start");                    ContentResolver resolver = mContext.getContentResolver();                    resolver.delete(DEFAULTAPN_URI, where, null);                    Log.d(TAG, "hugo:comein delete end");                }            });            mRestoreDefaultApnThread.start();    }} 



KK平台之前我们通过如下方式更新APN列表OTA升级后开机

[FAQ12633]更新APN列表OTA升级后开机即生效

[DESCRIPTION]

更新APN列表OTA升级后需要恢复出厂设置APN更新才有效, 客户需要做升级后开机即生效。

[SOLUTION]

因为,OTA升级更新的是三个区域,boot , recovery, system,

APN属于DATA域,OTA升级不会涉及到, 所以,必须reset之后才会更新有效。

所以, 需要修改alps\build\tools\releasetools\ota_from_target_files这个脚本,在

script.DeleteFiles([i[1] for i in to_create])

script.MakeSymlinks(to_create)

之后添加以下命令:

  script.Mount("/data")

  script.DeleteFiles(["/data/data/com.android.providers.telephony/databases/telephony.db",

                      "/data/data/com.android.providers.telephony/shared_prefs/load-apn.xml"])

这样做的目的是在升级之后,开机再重新把apns-conf.xml里的apn信息写入db  达到更新的目的。

 

0 0