折腾:
【未解决】通过调试rcsjta中core的入口Provisioning去寻找服务启动的逻辑
期间,去点击RCS的core的apk,即RCS Provisioning的右上角保存按钮,然后后续发现触发了Provisioning的onOptionsItemSelected相关代码,能运行到断点了。
然后继续后续调试,找找调用逻辑。
点击保存按钮:

可以触发断点:
src/com/gsma/rcs/provisioning/local/Provisioning.java
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
继续调试,运行到了之前保存会报错的地方:
src/com/gsma/rcs/provisioning/local/ProvisioningHelper.java
public void saveContactIdEditText(int resViewTextId, String settingsKey) {
EditText txt = (EditText) mRootView.findViewById(resViewTextId);
String text = txt.getText().toString();
ContactUtil.PhoneNumber number = ContactUtil.getValidPhoneNumberFromUri(text);
if (number == null) {
txt.setText("");
}
mRcsSettings.writeContactId(settingsKey,
"".equals(text) ? null : ContactUtil.createContactIdFromValidatedData(number));
}
此处输入的name是crifan

继续F7 单步调试,继续,直到进入:
src/com/gsma/rcs/utils/PhoneUtils.java
/**
* Extract user part phone number from a SIP-URI or Tel-URI or SIP address
*
* @param uri SIP or Tel URI
* @return Unformatted Number or null in case of error
*/
/* package private */static String extractNumberFromUriWithoutFormatting(String uri) {
if (uri == null) {
return null;
}
/* Extract URI from address */
int index0 = uri.indexOf(URI_START_DELIMITER);
if (index0 != -1) {
uri = uri.substring(index0 + URI_START_DELIMITER.length(),
uri.indexOf(URI_END_DELIMITER, index0));
}
/* Extract a Tel-URI */
int index1 = uri.indexOf(TEL_URI_HEADER);
if (index1 != -1) {
uri = uri.substring(index1 + TEL_URI_HEADER.length());
}
/* Extract a SIP-URI */
index1 = uri.indexOf(SIP_URI_HEADER);
if (index1 != -1) {
int index2 = uri.indexOf("@", index1);
uri = uri.substring(index1 + SIP_URI_HEADER.length(), index2);
}
/* Remove URI parameters */
int index2 = uri.indexOf(";");
if (index2 != -1) {
uri = uri.substring(0, index2);
}
// @formatter:off
/* Remove URI headers.
According to RFC 3261, headers are formatted as follows:
SIP-URI = "sip:" [ userinfo ] hostport uri-parameters [ headers ]
headers = "?" header *( "&" header )
header = hname "=" hvalue
hname = 1*( hnv-unreserved / unreserved / escaped )
hvalue = *( hnv-unreserved / unreserved / escaped )
hnv-unreserved = "[" / "]" / "/" / "?" / ":" / "+" / "$"
*/
// @formatter:on
index2 = uri.indexOf("?");
if (index2 != -1) {
uri = uri.substring(0, index2);
}
/* Returns the extracted number (username part of the URI) */
return uri;
}
好像是从
SIP-URI or Tel-URI or SIP address
用户名 提取 找出 可用的地址?
不是< 开头
也不是tel:开头

也不是sip: 开头
也不包含;
也不包含 特殊的 需要格式化的 ?
最后返回 crifan 本身
然后后续去验证是否是合法的手机号
src/main/java/com/gsma/services/rcs/contact/ContactUtil.java
/**
* Removes blank and minus characters from contact
*
* @param contact the phone number
* @return phone string stripped of separators.
*/
private String stripSeparators(String contact) {
contact = contact.replaceAll("[ -]", "");
Matcher matcher = PATTERN_CONTACT.matcher(contact);
if (matcher.find()) {
return matcher.group();
}
return null;
}
此处很明显不符合,所以返回 null
然后contact校验失败 返回false

当name无效,则会直接清空,设置为空字符串:

继续调试代码,运行到了loop,没法继续运行了。
以为没问题,最后还是报错 抛出异常了:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.gsma.rcs, PID: 2874 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.gsma.rcs.utils.ContactUtil$PhoneNumber.getNumber()' on a null object reference at com.gsma.rcs.utils.ContactUtil.createContactIdFromValidatedData(ContactUtil.java:128) at com.gsma.rcs.provisioning.local.ProvisioningHelper.saveContactIdEditText(ProvisioningHelper.java:90) at com.gsma.rcs.provisioning.local.ProfileProvisioning.persistRcsSettings(ProfileProvisioning.java:144) at com.gsma.rcs.provisioning.local.Provisioning.onOptionsItemSelected(Provisioning.java:168)

又遇到了之前的问题:
【未解决】rcsjta的core出错:java.lang.NullPointerException Attempt to invoke virtual method java.lang.String com.gsma.rcs.utils.ContactUtil PhoneNumber.getNumber on a null object reference
回去继续找找原因
看来需要多次重新调试找找情况
回到app,的确是,之前输入的内容,已被清空:

转载请注明:在路上 » 【记录】调试rcsjta的core的apk点击保存按钮触发Provisioning的onOptionsItemSelected相关代码调用逻辑