at android.hardware.SensorManager.getSensorList()
at org.chromium.device.sensors.PlatformSensor.a(chromium-SystemWebViewGoogle.aab-stable-1:2)
at org.chromium.device.sensors.PlatformsensorProvider.createSensor(chromium-SystemWebViewGoogle.aab-stable-1:6)at android.os.MessageQueve.nativePolloncs(Native Method)
at android.os.MessageQueve.nextMessageQueue.java:325)
at android.os.Looper.loop(Looper.java:142)
at android.app.ActiyThread.main(ActivityThread.java:6554)
at java.lang.refMethod.invoke(Native Method)
at com.android internal.os.RuntimeInit$MethodAndArgscaller.run(RuntimeInit.java:558)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:810)
最近小米给我们app拒了,理由就是用户未同意隐私前获取传感器列表,我在代码全局搜索,根本就没用到 传感器类SensorManager,去申诉了,没效果,难道是见鬼了,最后只能硬着头皮去找。
对过程不感兴趣的下伙伴可以直接看最后。
仔细看上面小米发的堆栈日志,调用了Looper.loop(),然后祭起了全局大发,项目里十几处Looper.loop()全部加上日志,看看是哪个小可爱,最后运行。没有日志输出。。。。真的是大白天遇上新骑士了。 然后又仔细看日志,ActiyThread.main()引起我注意,因为我们浏览模式用的是jsbridge 的webview,问题应该在他那,最后一行代码引起了我的注意
if(Thread.currentThread() == Looper.getMainLooper().getThread())
jsbridge的 BridgeWebViewClient重写了shouldOverrideUrlLoading(),其中webView.flushMessageQueue() 会调用Looper.getMainLooper().getThread(), 稍微跟踪了一下源码 loop()执行,会调用queue.next(),会执行 nativePolloncs(),这是一个jni方法。由于我的C很烂,底层就没有深究了。
所以答案来了,如果要想小米过审,其实就要看你的代码是否调用了Looper.loop()方法,或者jsbridge里的 if(Thread.currentThread() == Looper.getMainLooper().getThread()) 要处理一下,如果是未同意隐私时不要调用他。