折腾:
【未解决】通过调试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相关代码调用逻辑