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
- PhoneApp 启动异常分析及解决办法
- (N)Telephony分析(三)之PhoneApp启动
- PhoneApp的启动流程
- Eclipse启动后报“Decoration Calculation”并异常崩溃问题分析及解决办法
- stack overflow异常分析及解决办法
- namenode异常退出分析及解决办法
- Android6.0 Telephony流程分析——PhoneApp启动主要类关系分析
- Android7.0 PhoneApp的启动
- Android7.0 PhoneApp的启动
- PhoneApp
- PhoneApp的初步独立分析
- tomcat 启动异常,解决办法
- Android N PhoneAPP 启动关系类初始化
- JAVA 异常及解决办法
- MySQL多实例部署启动异常分析及解决方法
- tomcat 启动 tomcat_dir/bin/startup.bat 一闪而过解决办法及分析
- (N)Telephony分析(四)之PhoneApp初始化分析
- 有关安装MyEclipse6.0后启动异常的原因及解决办法。
- SUMO使用:Vehicle '**' is not allowed to depart on any lane of its first edge.
- MacOS下的内网穿透映射工具(frp)
- 我的简单PHP框架——LabPHP v1.0.1
- Maven下载及配置
- Spark系列修炼---入门笔记27
- PhoneApp 启动异常分析及解决办法
- 算法-第四版-练习1.3.33解答
- 欢迎使用CSDN-markdown编辑器
- Qt 销毁机制个人理解~
- n后问题
- HDU 1698 Just a Hook(线段树区间替换)
- EXCEL篇一:快速录入数据
- Linux文件类型
- Java高并发程序设计笔记10之NIO和AIO