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