马上就要过年了,这几天公司的人越来越少,而我打算坚守到最后一天,虽然事情比较少,但也能稍微自己看点东西,充充电。然而,项目发布的 App 在华为渠道被拒了,原因是:在登录页的隐私协议,不能默认勾选上。然后我看到了这样的代码:
1 | <CheckBox |
登录页的 CheckBox 被禁用了,肯定也是点不了的。然后改一下,默认不选中,并添加相应的逻辑判断。
1 | <CheckBox |
一切都很顺利,直到电信一键登录。电信一键登录调起的页面是由 sdk 提供的,但是开发者可以提供布局,项目中的如下:
1 | <LinearLayout |
调用代码如下:
1 | public void openQuickLoginActivity(Context context, QuickLoginModel quickLoginModel) { |
然后我将 CheckBox 也类似的改了一下,结果崩溃了:
1 | 2020-01-21 16:49:13.087 32472-32472/? E/AndroidRuntime: FATAL EXCEPTION: main |
说找不到资源文件,很懵逼,然后去查看 demo、相关文档,也没找到详细的说明。来来回回试了很多次,浪费了很多时间,也没找到问题所在,只要一改 CheckBox,必然崩溃。然后临近下班了,同事说帮我看看。然后定位异常,看到:
1 | cn.com.chinatelecom.account.sdk.ui.a.onCreate |
于是找到相关的包,尽管混淆了,但是也能看。
1 | package cn.com.chinatelecom.account.sdk.ui; |
然后异常报的找不到资源文件,那么可以合理猜测为 setContentView 时传入的参数无效,然后看到参数为 c.k。c 是 AuthPageConfig。然后再来看到 AuthPageConfig 的 k 参数是什么:
1 | public static class Builder { |
即通过setPrivacyDialogLayoutId
方法来设置一个 Dialog 的布局。那么为什么会需要一个 Dialog 呢?而且是在改过 CheckBox 之后才会蹦。这个时候合理猜测:CheckBox 默认不勾选之后,登录需要提醒用户,sdk 内部则是使用 Dialog 来提醒用户。感觉完全说得通啊!于是再详细看 demo、文档:
1 | private AuthPageConfig getAuthPageConfig(){ |
也看到了 setPrivacyDialogLayoutId、setPrivacyDialogViewIds 方法的调用,感觉猜测很合理,于是在调用的地方也加入了相应的代码:
1 | //设置隐私协议对话框的布局文件ID |
然后果然没蹦了,当不勾选 CheckBox 的时候,会弹出 Dialog 来提醒用户。至此,问题解决。
反思
很尴尬,反过头来看问题其实很简单,但是自己却没有找出来,同事耐着性子查看混淆的代码,顺藤摸瓜找到根源,也就不到一小时时间。而我却花费大量时间在表面上,完全瞎猜,觉得没道理。在编译、打包的期间也没有做更多的思考,看到混淆的代码也没跟进去,十分肤浅!写下这边文章倒不是真的因为这个 BUG 有多么难解,而是记录下自己的“狼狈”状态,以后一定要改进,凡事多跟进,多思考,耐着性子解决问题。