最新消息:20210917 已从crifan.com换到crifan.org

【未解决】通过调试core加运行RI去研究rcsjta的服务没运行的原因

调试 crifan 323浏览 0评论
折腾:
【记录】研究rcsjta的几个apk的运行现象尝试搞懂rcs的core的service服务相关逻辑
期间,期间突然想到
或许可以去 调试core(的apk)
同时另外去运行启动 别的apk,比如RI
看看能否让相关断点运行到,便于去调试找出rcs的core的service为何没运行的原因
去调试core的apk
然后手动单独启动此处的RI:
去点击看看能否触发core的断点
立刻可以运行到,其他之前加的断点了
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
private static final Map<String, IRcsCompatibility> sServiceCompatibilityMap = new HashMap<>();
static {
    sServiceCompatibilityMap.put(CapabilityService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ContactService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ChatService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(FileTransferService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(FileUploadService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(GeolocSharingService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(HistoryService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ImageSharingService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(MultimediaSessionService.class.getSimpleName(),
            sRcsCompatibility);
    sServiceCompatibilityMap.put(VideoSharingService.class.getSimpleName(), sRcsCompatibility);
}
继续
还没去RI中点击呢,此处run就的确开始运行了:
期间有多次 get starting state之类的调用
另外由于是广播,直接返回结果了:
现在再去RI中点击获取status
不过先传递的是:
com.gsma.services.rcs.action.GET_ACTIVATION_MODE
继续又有调用了:
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
但是此处的
Core的sInstance是null
至此,后续可以继续多调试调试
至少发现了一个新的手段:
调试core
运行RI的apk
是可以让很多core中函数被调用到的
这样至少容易找到出错的地方了。
先去调试core
然后再去启动RI
然后首先运行到core的代码断点:
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
private static final Map<String, IRcsCompatibility> sServiceCompatibilityMap = new HashMap<>();
static {
    sServiceCompatibilityMap.put(CapabilityService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ContactService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ChatService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(FileTransferService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(FileUploadService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(GeolocSharingService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(HistoryService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(ImageSharingService.class.getSimpleName(), sRcsCompatibility);
    sServiceCompatibilityMap.put(MultimediaSessionService.class.getSimpleName(),
            sRcsCompatibility);
    sServiceCompatibilityMap.put(VideoSharingService.class.getSimpleName(), sRcsCompatibility);
}
然后向前找,发现没有项目代码中调用
后来懂了,是:
类的初始化
此处的:
public class RcsServiceControlReceiver extends BroadcastReceiver {
RcsServiceControlReceiver的static的变量sServiceCompatibilityMap的初始化而已
接着运行到了
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
private class IntentProcessor extends Thread {

public void run() {
第一次是:
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
然后去调试看看
然后是
src/com/gsma/rcs/core/Core.java
public static Core getInstance() {
    return sInstance;
}
此时:sInstance=null 是空的
去看了代码,其是在createCore中被初始化的
所以第一次 
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
返回的是false:
第二次又是:
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
后面还是
一共运行了10次左右
然后就没了
-》说明是:
RI启动那一刻,会去尝试获取GET_SERVICE_STARTING_STATE
对应着如果返回false,会继续retry尝试
先后一共试了10次,没获取到,所以不再获取
那问题就来了:
到底什么时候调用的
src/com/gsma/rcs/core/Core.java
的createCore去初始化的sInstance
而去搜代码,又是之前的逻辑了
继续向上找,到底哪里调用的
然后回去:
【记录】研究Android项目rcsjta中RCS的core的service启动的代码调用逻辑关系和顺序
从代码上看,上面后2个,都是属于core目录下的
或许是core的apk中的?
好像也不是。
对于:
com.gsma.rcs.provisioning
com.gsma.rcs.provisioning.htttps
好像至少第一个是属于:
provisioning的apk?
去运行试试
即:
调试debug:core
启动运行:provisioning
不过突然发现:
本身启动了core的apk后,主界面顶部的标题就是:
RCS Provisioning
好像本身按道理就应该运行了 com.gsma.rcs.provisioning 的代码才对啊
不过不管了,先去试试上面的
不过发现:
想要运行provisioning
以为是第一个
RCS Provisioning
结果发现是:本身就是core的apk = 正在调试的apk
没法实现以为的:
调试core + 运行provisioning
因为本身此处 core=provisioning 就是同一个apk
不过另外试了试:
RCS Settings
RCS Notification
都会触发去调用此处core,传入
ACTION_GET_SERVICE_STARTING_STATE
尝试获取core的service的状态
当然此处都会由于core的instance是null,而返回false
表示服务没启动。
回去继续找找代码逻辑:
【记录】研究Android项目rcsjta中RCS的core的service启动的代码调用逻辑关系和顺序
 

转载请注明:在路上 » 【未解决】通过调试core加运行RI去研究rcsjta的服务没运行的原因

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
90 queries in 0.198 seconds, using 23.34MB memory