折腾:
【记录】研究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服务启动逻辑