折腾:
【未解决】Android Studio去红米Note8Pro中调试rcsjta的RI的apk
期间,通过rcsjta的log日志发现,RI中会报错和rcs的api连不上的log。
感觉是和RCS服务无法启动最有关系。
所以去研究看看。
去看看日志,逻辑是:
2020-08-06 10:17:47.438 10088-10088/com.gsma.rcs.ri D/[RI][RcsServiceNotifManager]: Service started
启动服务
2020-08-06 10:17:47.465 10088-10088/com.gsma.rcs.ri D/[RI][RcsServiceNotifManager]: Try to connect to service API
然后没有连接上,而报错:
2020-08-06 10:17:47.468 10088-10088/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
去找上面的intent
libs/api/src/main/java/com/gsma/services/rcs/Intents.java
/** * Intent to get the RCS service starting state. */ public static final String ACTION_GET_SERVICE_STARTING_STATE = "com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE"; /** * Used as a boolean extra field in ACTION_GET_SERVICE_STARTING_STATE intent to convey the * response. */ public static final String EXTRA_GET_SERVICE_STARTING_STATE = "get_service_starting_state";
然后调用的地方:
libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
/**
* Returns true if the RCS stack is started.
*
* @return boolean true if the RCS stack is started.
* @throws RcsGenericException
*/
public boolean isServiceStarted() throws RcsGenericException {
if (sAccurateLog) {
Log.d(LOG_TAG, "isServiceStarted: Request()");
}
Bundle result = queryRcsStackByIntent(new Intent(
Intents.Service.ACTION_GET_SERVICE_STARTING_STATE));
boolean started = result
.getBoolean(Intents.Service.EXTRA_GET_SERVICE_STARTING_STATE, false);
if (sAccurateLog) {
Log.d(LOG_TAG,
"isServiceStarted: Response() -> " + started + " (in "
+ result.getLong(TIME_SPENT, -1) + "ms)");
}
return started;
}是判断服务是否启动的地方。
然后看了看,小米9和红米Note8Pro的 RI 都有此错误:
for_debug/XiaoMi9/rcsjta_RI_20200806.log
2020-08-06 10:31:44.472 4308-4308/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
for_debug/RedmiNote8Pro/rcsjta_RI_20200806.log
2020-08-06 10:17:47.468 10088-10088/com.gsma.rcs.ri W/[RI][RcsServiceNotifManager]: Cannot connect service API: Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE!
继续研究代码和逻辑。
搜:isServiceStarted
看到有个
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
case Intents.Service.ACTION_GET_SERVICE_STARTING_STATE:
Core core = Core.getInstance();
boolean started = core != null && core.isStarted();
mResult.putBoolean(Intents.Service.EXTRA_GET_SERVICE_STARTING_STATE,
started);
if (sAccurateLog && sLogger.isActivated()) {
sLogger.debug("isServiceStarted() -> " + started);
}
break;其中的sAccurateLog
看起来像是 是否开启更加精确的log
去找找如何开启
这样可以输出更多日志,便于找到出错原因
有2处用到这个
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
public class RcsServiceControlReceiver extends BroadcastReceiver {
private static boolean sAccurateLog = false;libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
public class RcsServiceControl {
private static final boolean sAccurateLog = false;分别都去改为true:
libs/api/src/main/java/com/gsma/services/rcs/RcsServiceControl.java
// private static final boolean sAccurateLog = false; private static final boolean sAccurateLog = true;
core/src/com/gsma/rcs/service/RcsServiceControlReceiver.java
// private static boolean sAccurateLog = false; private static boolean sAccurateLog = true;
然后重新编译和调试,看看log输出如何
应该是重新编译
不过看到有个:Apply Code Changes

和Apply Changes and Restart Activity

只是重启activity,算了,还是整个项目重新编译和调试
不过重新编译期间,决定还是先去:
【未解决】Android Studio中gradle编译rcjsta项目多个使用或覆盖了已过时的API等报错
暂时先不去解决warning警告了,因为太多了。
而且很耗时,所以暂告一段落。
先回头看看能否解决此处的
com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE
的问题。如果能解决。就不用浪费时间解决api的兼容性问题了。
继续分析代码
看起来是:
core.isStarted()
是重点
src/com/gsma/rcs/core/Core.java
/**
* Is core started
*
* @return Boolean
*/
public boolean isStarted() {
return mStarted;
}再去找,有哪些地方处理了mStarted
是这里
/**
* Start the terminal core
*/
public synchronized void startCore() {
if (mStarted) {
return;
}
mImsModule.start();
mAddressBookManager.start();
mLocaleManager.start();
mListener.onCoreLayerStarted();
mStarted = true;
if (sLogger.isActivated()) {
sLogger.info("RCS core service has been started with success");
}
}以及停止:
/**
* Stop the terminal core
*
* @throws PayloadException
* @throws NetworkException
* @throws ContactManagerException
*/
private void stopCore() throws PayloadException, NetworkException, ContactManagerException {
if (!mStarted) {
return;
}
mStopping = true;
boolean logActivated = sLogger.isActivated();
if (logActivated) {
sLogger.info("Stop the RCS core service");
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
mBackgroundHandler.getLooper().quitSafely();
} else {
mBackgroundHandler.getLooper().quit();
}
mLocaleManager.stop();
mAddressBookManager.stop();
mImsModule.stop();
mStopping = false;
mStarted = false;
if (logActivated) {
sLogger.info("RCS core service has been stopped with success");
}
sInstance = null;
mListener.onCoreLayerStopped();
}其中start部分中,成功的话,会输出
RCS core service has been started with success
去找找之前log中,是否有
RCS core service
相关的log
没有,不过代码中找到一些
包括
core/src/com/gsma/rcs/service/RcsCoreService.java
/**
* RCS core service. This service offers a flat API to any other process (activities) to access to
* RCS features. This service is started automatically at device boot.
*
* @author Jean-Marc AUFFRET
*/
public class RcsCoreService extends Service implements CoreListener {说是:设备启动时就启动了。
所以感觉应该去:
加断点去调试,不论是RI还是core,应该能运行到断点才对
去试试
再去看第一个IMS的:
src/com/gsma/rcs/core/ims/ImsModule.java
/**
* Start the IMS module
*/
public void start() {
if (sLogger.isActivated()) {
sLogger.info("Start the IMS module");
}
mCnxManager.start();
mExtensionManager.start();
mServiceDispatcher.start();
mCallManager.start();
if (sLogger.isActivated()) {
sLogger.info("IMS module is started");
}
}再去看第一个mCnxManager
src/com/gsma/rcs/core/ims/network/ImsConnectionManager.java
/**
* Starts IMS connection manager
*/
public void start() {
if (mNetworkStateListener == null) {
/* Register network state listener */
mNetworkStateListener = new NetworkStateListener();
mCtx.registerReceiver(mNetworkStateListener, new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION));
}
if (mBatteryLevelListener == null) {
/* Register changes about battery: charging state, level, etc... */
mBatteryLevelListener = new BatteryLevelListener();
mCtx.registerReceiver(mBatteryLevelListener, new IntentFilter(
Intent.ACTION_BATTERY_CHANGED));
}
}还是去加断点调试吧
以及:
src/com/gsma/rcs/core/Core.java
private Core(Context ctx, CoreListener listener, ContentResolver contentResolver,
LocalContentResolver localContentResolver, RcsSettings rcsSettings,
ContactManager contactManager, MessagingLog messagingLog, HistoryLog historyLog,
RichCallHistory richCallHistory) {
boolean logActivated = sLogger.isActivated();
。。。
public synchronized void startCore() {
if (mStarted) {
return;
}
mImsModule.start();
。。。
去调试看看
然后去看看:
【未解决】Android项目rcsjta中如何才能运行到rcs的core的service
转载请注明:在路上 » 【未解决】rcsjta的RI启动报错:Cannot connect service API Failed to get result for com.gsma.services.rcs.action.GET_SERVICE_STARTING_STATE