开发笔记-疑难杂症

整理之前的近期小记时,发现有一些笔记不太好归类,且可能比较偏门,统一放到这里,汇集到一定量后可以再分类存放

No.1 听云集成报错 No virtual method isVisible()

1
java.lang.NoSuchMethodError: No virtual method isVisible()Z in class Lcom/xxxx/xxxxxx/containers/xxxxxx; or its super classes (declaration of 'com.xxxxxx.xxxxxxx.containers.xxxxxx' appears in /data/app/com.myapp.app-JUxpxJQv7z6s5jkYdS3yHw==/base.apk!classes3.dex)

报错信息如上图,初步推断为听云嵌码插桩逻辑有些问题,部分类应该跳过插桩的过程,搜索相关内容寥寥无几,且不相关,听云客服疑似空号,添加失败,客服群也加不进去,最后从非常旧和凌乱的文档中看到一个不太起眼的描述:

1
2
# 等号“=”后替换为需要过滤听云嵌码的类的路径,如有多个路径,使用英文逗号隔开
noInstrumentedClasses=com/xxxxxx/xxxxxxx/containers/xxxxxxx

把报错中指出的类填入这个 noInstrumentedClasses 中,再次编译,还是不行,后来发现是他的配置内容有缓存在本地,clean project 再重新跑就可以了,记录这个不是为了下次接入再查阅,而是提醒自己需要提升信息搜集能力和文档查阅能力,同时多从报错中推断;处理类似的第三方接入问题时,更改配置要 clean project,避免部分配置缓存在本地造成误判,认为自己的写法有误;另外,接入第三方库时尽量选取维护比较积极,售后比较靠谱的

相关链接

No.2 Mac 处理 Adobe Genuine Software Integrity Service

使用”不明来路”的 ps, 某一天突然弹出个窗,必须点一下才能关掉,而且过一会又弹出来,无法彻底关闭

解决方法:

  1. 关闭所有 Adobe 软件
  2. $ sudo rm /Library/Application\ Support/Adobe/AdobeGCClient/AdobeGCClient.app/Contents/MacOS/AdobeGCClient
  3. 启动 ps,就正常了

No.3 Android SSL 验证服务器证书 Hostname 不匹配错误

有时候开发需要改动 host,然后会报 host name 不匹配的错误,

1
12-24 16:37:04.801: W/System.err(26380):   java.io.IOException: Hostname '74.208.145.100' was not verified

错误原因是验证证书时发现真正请求和服务器的证书域名不一致,这时就可以在客户端代码中增加如下代码,忽略hostname 的验证

1
2
3
4
5
HttpsURLConnection.setDefaultHostnameVerifier( new HostnameVerifier(){
public boolean verify(String string,SSLSession ssls) {
return true;
}
});

No.4 电脑可以科学上网但是模拟器不能的情况

自己胡乱鼓捣的时候,发现有这样一种情况:电脑已经开启了科学上网,模拟器可以上网,但是不能浏览外网

解决方法:

  1. 打开模拟器配置,找到 proxy 选项
  2. ip 写 127.0.0.1,端口写代理的端口(如果使用的是 Clash,打开 Clash 主界面 -> General 应该就可以看到)
  3. 保存设置,再尝试一下

No.5 AS 4.2 Gradle 面板中 Tasks 不见了

某次想要执行一些 Gradle 命令,点开 Gradle 面板时,发现其中的 Tasks 不见了

解决办法如下:

参考文章

No.6 gradle.properties 中文乱码

如果发现 gradle.properties 原本应该是中文的一些注释变成了乱码,可以留意一下 IDE 右下方的编码是什么格式,如果是 ISO-8859-1,那么就可以到设置里找到 Editor -> File Encodings 选项,把默认的 properties 格式改成 UTF-8,如下图

No.7 返回手势需要执行两次

我们平时使用返回手势时,手机边缘会出现一个返回箭头以示成功触发,松开手指就会执行返回操作,但是我开发时发现我的 App 存在一个问题,返回手势第一次触发无反应,第二次才会出现箭头,此时把手指移回边缘,也就是把返回操作取消掉,再执行,又是无反应,再触发一次才能成功。简而言之就是我每次想触发返回,都要执行两次手势

看了一下 Logcat,发现频繁打印 Android handleResized abandoned!,问问 AI,得到这样的答复:这个日志通常由 SurfaceFlinger 或 ViewRootImpl 打印,表示在处理窗口大小变化时遇到问题,导致一些窗口调整操作被中止或放弃

检查代码发现,注释掉处理全屏的代码后,这个现象就不再会发生,再继续追问,得到这样的答复:如果你观察到 Android handleResized abandoned! 频繁出现在全屏模式下,这通常与窗口大小调整、系统栏状态变化或 SurfaceView 的 Surface 变化有关

我又多尝试了一下,发现这个与全屏情况下,触碰边缘后弹出状态栏有一点像,类似于正常情况下第一次触碰手机屏幕边缘时,状态栏弹出来,然后才能响应接下来第二次的操作。之所以我不能第一时间发现,就是因为我的全屏代码似乎没有生效,导致状态栏一直显示着,但是却需要两次去触发返回

我的设置全屏代码如下,有很多已经被废弃的属性,可能是因为我提升了 Android 版本,其中有一些属性已经无效了导致出现问题。我想替换 ImmersionBar 库来做全屏,发现它的 fullScreen 方法也失效了,应该也是因为同样的原因。于是换用了 ImmersionBar 库的 hideBar 方法,隐藏状态栏和导航栏来实现全屏,暂告一段落,这里先记录一下,具体的原因后续有兴趣再研究了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 设置是否全屏
*
* @param enabled 是否全屏显示
*/
fun Activity.setFullscreen(enabled: Boolean = true) {
if (enabled) {
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
} else {
val lp: WindowManager.LayoutParams = window.attributes
// LayoutParams.FLAG_FULLSCREEN 强制屏幕状态条栏弹出
lp.flags = lp.flags and WindowManager.LayoutParams.FLAG_FULLSCREEN.inv()
window.attributes = lp
// 不允许窗口扩展到屏幕之外 clear掉了
window.clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS)
}

window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)

var systemUiVisibility = window.decorView.systemUiVisibility
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
systemUiVisibility = systemUiVisibility or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
window.decorView.systemUiVisibility = systemUiVisibility

window.statusBarColor = Color.TRANSPARENT
}

开发笔记-疑难杂症
https://enderhoshi.github.io/2024/03/05/开发笔记-疑难杂症/
作者
HoshIlIlI
发布于
2024年3月5日
许可协议