PhoneApp 启动异常分析及解决办法

来源:互联网 发布:qq在线竞猜源码 编辑:程序博客网 时间:2024/06/05 10:43

1、若是 PhoneApp(即 Telephony Framework)没有被启动具体现象表现为:
a. 开机卡注册上网络慢,搜网时间长,或者开机无法注册网络;
b. 开机显示 pin 码/SIM ME lock 界面慢、或者开机无法显示解锁界面;
c. 手机使用过程中,调用 Phone 中对象的时候,显示 Phone 进程异常停止的现象

2、原因:
在 Android 系统中一个多个 APK 可以运行在一个进程中,PhoneApp,Stk,SMSProvider,TelephonyProvider 等都是运行在 com.android.phone 进程中,但是在 AMS 中启动 Persistent属性的 APK 时,会去判断对应的进程是否已经启动若已经启动就不在去启动对应的 APK。

经常有很多启动模块(早于 PhoneApp 启动)需要读取SMSProvider,TelephonyProvider 对应的数据库,就会导致com.android.phone 被启动这样在 AMS 启动 PhoneApp 时,判断到phone 进程已经启动就不会去启动 PhoneApp 导致 Telephony Framework 都没有被 init。

3、Debug SOP
a、先判断是否 PhoneApp 是否是真的没有启动
在 main_log.boot 中搜索关键词 PhoneApp: onCreate()…,若有对应的打印说明
PhoneApp 已经被启动,反之则没有启动
b、判读说明原因导致的 PhoneApp 没有被启动
在 sys_log.boot 中搜索关键字 com.android.phone

ActivityManager: Start proc com.android.phone for added application com.android.phone

log 中若有如蓝色标注的信息,则说明 phone 进程是被 PhoneApp 启动是正常的情况

ActivityManager: Start proc com.android.phone for content providercom.android.providers.telephony/.TelephonyProviderActivityManager: Start proc com.android.phone for content providercom.android.providers.telephony/.ActivityManager: Start proc:com.android.phone for broadcastcom.android.stk/.EventReceiver

log 中若是上述的 phone 进程启动方式那一定 PhoneApp 没有被启动。

4、解决方法:
a. 找出是哪个模块调用,在模块里面 cover
若是由其他运行在 Phone 进程中的 APK,那只能是有各自模块的去分析为什么对应的 APK启动怎么早,一般是注册了一些早于 boot_complete 的系统 broadcast,或是自己定义的一些早于 boot_complete 的broadcast。
b. 若不能再模块中进行修改,那么需要添加代码来 workaround,核心思路如下:
1) 一般出现这种情况都是由于运行在 Phone 进程中的组件被过早调用引起;
2) 在 Phone Apk 中添加一个新的 Service 专门为这个 workaround 工作,建议最好是个 IntentService。生命周期短,会自己 stop 掉,且不怎么耗资源

I.在 packages\services\Telephony\AndroidManifest.xml 添加:

<service android:name=".StartPhoneAppService" >    <intent-filter>    <action    android:name=”com.mediatek.for_phoneApp_start”>    </intent-filter></service>

II.
在 packages\services\Telephony\src\com\android\phone\添加
StartPhoneAppService.java 文件,其内容如下:

import android.app.IntentService;import android.content.Intent;import android.util.Log;public class StartPhoneAppService extends IntentService {    @Override    protected void onHandleIntent(Intent arg0) {    Log.i("StartPhoneAppService success");    }}

3) 在这个组件对应的 Application(没有的话就加一个,需要在 AndroidManifest.xml
里面指定给)的 onCreate 方法中判断 Phone 进程对应的主
Application(PhoneApp)是否有启动,如果没有启动,则去主动叫起 Phone。代码如下:

//M: add global flag reference in case started phone serviceboolean startPhoneService = false;@Overridepublic boolean onCreate() {    new Thread(new Runnable(){         @Override         public void run() {         IBinder phone = ServiceManager.getService(Context.TELEPHONY_SERVICE);         while (phone == null) {               phone = ServiceManager.getService(Context.TELEPHONY_SERVICE);               if (!bstartPhoneAppService) {                   bstartPhoneAppService = true;                   Intent intent = new Intent("com.mediatek.for_phoneApp_Start");                   startService(new Intent(createExplicitFromImplicitIntent(TelephonyProviderApp.this, intent)));                   Log.i(TAG, "TelephonyProviderApp startService(com.mediatek.for_phoneApp_Start)");               }               synchronized(this) {                   try {                        if(phone==null) {                          wait(200);                         }                   } catch (InterruptedException e) {                        e.printStackTrace();                   }               }           }       }   }).start();}

4)如果没有 Application 的话,添加一个 Application,步骤如下:
第一步:创建一个类继承自 Application,如 HelloWorldApplication

public class HelloWorldApplication extends Application {    @Override    public void onCreate()    {    }}

第二步:在 AndroidManifest.xml 中指定给,注意名字与包名要用您自己的

<applicationandroid:name="com.demo.application.HelloWorldApplication"android:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" >

异常案例:拨打112出现phone报错
案例分析:

// Phone进程启动异常,有模块过早的读取SMSProvider01-01 09:00:32.350 748 962 I ActivityManager: Start proc 1418:com.android.phone/1001 for content provider com.android.providers.telephony/.SmsProvider// 发起MO,失败。PhoneAPP还没有正常初始化01-01 09:00:49.075 748 748 D Telecom : CallsManager: start outgoing call ....01-01 09:00:49.142 748 748 V Telecom : CallsManager: addCall([736809403, CONNECTING, null, tel:112, 0, childs(0), has_parent(false), [[Capabilities:]])01-01 09:00:49.408 1418 1418 E AndroidRuntime: FATAL EXCEPTION: main01-01 09:00:49.408 1418 1418 E AndroidRuntime: Process: com.android.phone, PID: 141801-01 09:00:49.408 1418 1418 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate service com.android.services.telephony.TelephonyConnectionService: java.lang.IllegalStateException: No PhoneGlobals here!01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2981)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.app.ActivityThread.access$1800(ActivityThread.java:178)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1553)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:111)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.os.Looper.loop(Looper.java:194)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5653)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)01-01 09:00:49.408 1418 1418 E AndroidRuntime: Caused by: java.lang.IllegalStateException: No PhoneGlobals here!01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at com.android.phone.PhoneGlobals.getInstance(PhoneGlobals.java:536)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at com.android.services.telephony.CdmaConferenceController.<init>(CdmaConferenceController.java:111)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at com.android.services.telephony.TelephonyConnectionService.<init>(TelephonyConnectionService.java:94)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at java.lang.reflect.Constructor.newInstance(Native Method)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at java.lang.Class.newInstance(Class.java:1606)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2978)01-01 09:00:49.408 1418 1418 E AndroidRuntime:     ... 9 more
1 0
原创粉丝点击