最新消息:20210917 已从crifan.com换到crifan.org

【记录】调试rcsjta的core的apk点击保存按钮触发Provisioning的onOptionsItemSelected相关代码调用逻辑

RCS crifan 380浏览 0评论
折腾:
【未解决】通过调试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相关代码调用逻辑

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
90 queries in 0.189 seconds, using 23.30MB memory