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

【记录】研究rcsjta中的RcsCoreService的代码调用逻辑和顺序

代码 crifan 354浏览 0评论
折腾:
【记录】研究Android项目rcsjta中RCS的core的service启动的代码调用逻辑关系和顺序
期间,对于rcs的core的service,其调用逻辑,研究到后来,发现主要是和:RcsCoreService有关。
但是后续调用貌似也很复杂。所以专门去研究看看。
src/com/gsma/rcs/service/RcsCoreService.java
private synchronized void startCore() {

core = Core.createCore(mCtx, this, mRcsSettings, mContentResolver,
        mLocalContentResolver, mContactManager, mMessagingLog, mHistoryLog,
        mRichCallHistory);
->
src/com/gsma/rcs/service/RcsCoreService.java
public class RcsCoreService extends Service implements CoreListener {

    public void onCreate() {

        startCore();
->
src/com/gsma/rcs/service/LauncherUtils.java
public class LauncherUtils {

    public static void launchRcsCoreService(Context context, RcsSettings rcsSettings) {

        context.startService(new Intent(context, RcsCoreService.class));
有好几处都有调用
且都是:
LauncherUtils.launchRcsCoreService(mContext, mRcsSettings);
这种直接调用
然后分别去看看
【LauncherUtils.launchRcsCoreService 调用情况】
(1)com.gsma.rcs.provisioning
src/com/gsma/rcs/provisioning/TermsAndConditionsRequest.java
public class TermsAndConditionsRequest extends Activity {

    private void acceptTermsAndConditions() {

        LauncherUtils.launchRcsCoreService(mContext, mRcsSettings);
(2)com.gsma.rcs.provisioning.htttps
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
public class HttpsProvisioningManager {

    private void processProvisioningResult(HttpsProvisioningResult result)

        LauncherUtils.launchRcsCoreService(mCtx, mRcsSettings);
(3)com.gsma.rcs.service
src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    private void connectionEvent(String action) {

        LauncherUtils.launchRcsCoreService(mCtx, mRcsSettings);
(4)
src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    private void launchRcsService(boolean boot, boolean user) throws RcsAccountException {
    
        LauncherUtils.launchRcsCoreService(mCtx, mRcsSettings);
(5)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
public class HttpsProvisioningManager {

    /* package private */void tryLaunchRcsCoreService(Context context, long timerRetry) {

        LauncherUtils.launchRcsCoreService(context, mRcsSettings);

【acceptTermsAndConditions 调用情况】
src/com/gsma/rcs/provisioning/TermsAndConditionsRequest.java
public void onCreate(Bundle savedInstance) {

                acceptTermsAndConditions();

【TermsAndConditionsRequest 调用情况】
(1)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
private void processProvisioningResult(HttpsProvisioningResult result)

    TermsAndConditionsRequest.showTermsAndConditions(mCtx);
(2)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningService.java
public int onStartCommand(final Intent intent, int flags, int startId) {

    TermsAndConditionsRequest.showTermsAndConditions(mContext);
(3)
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
public class RcsServiceControlReceiver extends BroadcastReceiver {

    private boolean setActivationMode(Context ctx, boolean active) {

        TermsAndConditionsRequest.cancelTermsAndConditionsNotification(ctx);
(4)
AndroidManifest.xml
<!-- Provisioning - Terms and conditions activity -->
<activity
    android:name="com.gsma.rcs.provisioning.TermsAndConditionsRequest"
    android:theme="@style/Theme.UserDialog"/>

【processProvisioningResult 调用情况】
(1)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void updateConfigWithOTP(String otp, String requestUri)

    processProvisioningResult(result);
(2)src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void updateConfig() throws RcsAccountException, IOException {

        processProvisioningResult(result);

【updateConfigWithOTP】
(1)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningSMS.java
public void registerSmsProvisioningReceiver(final String smsPort, final String requestUri) {

    mManager.updateConfigWithOTP(smsData, requestUri);

【updateConfig 调用情况】
(1)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
public class HttpsProvisioningManager {

    boolean connectionEvent(String action) throws RcsAccountException,

        updateConfig();
(2)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningService.java
public class HttpsProvisioningService extends Service {

private BroadcastReceiver retryReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, final Intent intent) {
        mHttpsProvisioningMng.scheduleProvisioningOperation(new Runnable() {
            public void run() {
                try {
                    mHttpsProvisioningMng.updateConfig();

【connectionEvent 调用情况】
(1)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningConnection.java
public class HttpsProvisioningConnection {

    protected void registerNetworkStateListener() {

        mProvisioningManager.connectionEvent(action);
(2)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningService.java
public class HttpsProvisioningService extends Service {

    public int onStartCommand(final Intent intent, int flags, int startId) {

        if (!mHttpsProvisioningMng
                .connectionEvent(ConnectivityManager.CONNECTIVITY_ACTION)) {

【HttpsProvisioningService 调用情况】
(1)
src/com/gsma/rcs/core/ims/network/registration/RegistrationManager.java
public class RegistrationManager extends PeriodicRefresher {

    private void handle403Forbidden() {

        HttpsProvisioningService.startHttpsProvisioningService(appContext, true, false);
(2)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
    private HttpsProvisioningResult sendFirstRequestsToRequireOTP(ContactId msisdn,
        String primaryUri, String secondaryUri) throws IOException {

        HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, OTP_TIME_OUT);
(3)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void updateConfigWithOTP(String otp, String requestUri)

    HttpsProvisioningService.cancelRetryAlarm(mCtx, mRetryIntent);
(4)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void updateConfig() throws RcsAccountException, IOException {

    HttpsProvisioningService.cancelRetryAlarm(mCtx, mRetryIntent);
(5)
src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
private void processProvisioningResult(HttpsProvisioningResult result)
        throws RcsAccountException {

    HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, validity);

    HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, validity);

    HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, result.retryAfter);
(6)src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void tryLaunchRcsCoreService(Context context, long timerRetry) {

    HttpsProvisioningService.startRetryAlarm(context, mRetryIntent, timerRetry);

    HttpsProvisioningService.startRetryAlarm(context, mRetryIntent, timerRetry);
(7)src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
private boolean retryAfter511Error() {

    HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, HttpsProvisioningUtils.RETRY_AFTER_511_ERROR_TIMEOUT);
(8)src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
/* package private */void retry() {

    HttpsProvisioningService.startRetryAlarm(mCtx, mRetryIntent, retryDelay);
(9)src/com/gsma/rcs/provisioning/https/ProvisioningPushSMSReceiver.java
public class ProvisioningPushSMSReceiver extends BroadcastReceiver {

    public void onReceive(Context ctx, Intent intent) {

        HttpsProvisioningService.reProvisioning(ctx);
(10)src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    private void launchRcsService(boolean boot, boolean user) throws RcsAccountException {
        HttpsProvisioningService.startHttpsProvisioningService(mCtx, true, user);

        HttpsProvisioningService.startHttpsProvisioningService(mCtx, true, user);

        HttpsProvisioningService.startHttpsProvisioningService(mCtx, false, user);

        HttpsProvisioningService.startHttpsProvisioningService(mCtx, false, user);
(11)src/com/gsma/rcs/provisioning/https/HttpsProvisioningService.java
public class HttpsProvisioningService extends Service {

    public static void startHttpsProvisioningService(Context ctx, boolean firstLaunch,

        Intent provisioningIntent = new Intent(ctx, HttpsProvisioningService.class);
(12)src/com/gsma/rcs/service/LauncherUtils.java
public class LauncherUtils {

    public static void stopRcsService(Context context) {

        context.stopService(new Intent(context, HttpsProvisioningService.class));
(13)RCS/rcsjta/core/AndroidManifest.xml
<!-- HTTPS provisioning service -->
<service android:name="com.gsma.rcs.provisioning.https.HttpsProvisioningService"/>

【registerNetworkStateListener 调用情况】
(1)src/com/gsma/rcs/provisioning/https/HttpsProvisioningConnection.java
public class HttpsProvisioningConnection {

    protected void registerWifiDisablingListener() {

        registerNetworkStateListener();
(2)src/com/gsma/rcs/provisioning/https/HttpsProvisioningManager.java
public class HttpsProvisioningManager {

    public void registerNetworkStateListener() {
        mNetworkCnx.registerNetworkStateListener();
    }

【registerNetworkStateListener 调用情况】
(1)src/com/gsma/rcs/provisioning/https/HttpsProvisioningService.java
public class HttpsProvisioningService extends Service {

    public int onStartCommand(final Intent intent, int flags, int startId) {

        mHttpsProvisioningMng.registerNetworkStateListener();

【launchRcsService 调用情况】
(1)src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    private void startCore(final Intent intent) {

        launchRcsService(mBoot, mUser);
(2)src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    private BroadcastReceiver getPollingTelephonyManagerReceiver() {

        launchRcsService(mBoot, mUser);
【startCore 调用情况】
(1)src/com/gsma/rcs/service/StartService.java
public class StartService extends Service {

    public int onStartCommand(final Intent intent, final int flags, final int startId) {

        startCore(intent);

也分别都去加上断点
包括给当前函数最开始加上,防止条件不满足,而没运行到,但是实际上函数运行到了,而不知道。
rcsjta rcs core service
此处先不记录上述继续的代码调用关系
先去直接找到调用者后,加断点,看看后续调试,能否运行到
结果依旧没调用到断点
继续看代码:
src/com/gsma/rcs/service/StartService.java
private boolean checkAccount() throws IOException, RcsAccountException {
等,感觉或许是:
是要现有 account账户
才能启动rcs的core的service?
而此处或许是,之前创建 新建 初始化 账户 账号 失败了?
去都加上断点,再多调试看看
另外去尝试,给RCS的core,即RCS Provisioning中填写IMS的信息:
再去保存,看看能否触发,重启rcs的service
结果点击保存按钮后,apk崩溃直接退出了。。。
Android Studio中看不到任何log

另外,发现了关于 set activation mode的方面的代码调用关系:
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
case Intents.Service.ACTION_GET_ACTIVATION_MODE_CHANGEABLE:
看到有被调用。
但是感觉是:
能触发启动服务的
ACTION_SET_ACTIVATION_MODE
好像没人调用。去看看
【ACTION_SET_ACTIVATION_MODE 调用】
(1)src/main/java/com/gsma/services/rcs/RcsServiceControl.java
private Intent generateSetActivationModeIntent(boolean active) {
    Intent intent = new Intent(Intents.Service.ACTION_SET_ACTIVATION_MODE);
    intent.putExtra(Intents.Service.EXTRA_SET_ACTIVATION_MODE, active);
    return intent;
}
(2)之前已知的
src/com/gsma/rcs/service/RcsServiceControlReceiver.java
case Intents.Service.ACTION_SET_ACTIVATION_MODE: {

【generateSetActivationModeIntent 调用】
(1)src/main/java/com/gsma/services/rcs/RcsServiceControl.java
public class RcsServiceControl {

    public void setActivationMode(boolean active) throws RcsPermissionDeniedException, RcsGenericException {
        Bundle result = queryRcsStackByIntent(generateSetActivationModeIntent(active));

【setActivationMode 调用】
(1)src/com/gsma/rcs/core/control/settings/SettingsDisplay.java
public class SettingsDisplay extends RcsPreferenceActivity implements
        Preference.OnPreferenceChangeListener {

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
。。。
                    mRcsServiceControl.setActivationMode(true);
-》好像是设置页面中,点击了选项后,才会触发去设置 激活模式
(2)src/com/gsma/rcs/core/control/settings/SettingsDisplay.java
public class SettingsDisplay extends RcsPreferenceActivity implements
        Preference.OnPreferenceChangeListener {

    protected Dialog onCreateDialog(int id) {

        mRcsServiceControl.setActivationMode(false);
对于onCreateDialog像是:当创建对话框时
对于上面的setActivationMode,去调试看看:
【无法解决】调试rcsjta的settings以触发setActivationMode设置激活模式以去找RCS服务启动逻辑

转载请注明:在路上 » 【记录】研究rcsjta中的RcsCoreService的代码调用逻辑和顺序

发表我的评论
取消评论

表情

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

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