经常收到产品的灵魂拷问:问什么微信二维码可以很快识别出来,咱们的APP就不行?
还好当时看到阿里移动开发平台mPaaS开放了扫一扫功能。
目前来说mPaaS的扫一扫是免费框架里边识别效率最快的,使用原生AAR方式可快速接入。
点击接入mPaaS扫一扫
进入链接,看文档接入就行了。这里不累赘,记录下混淆后出现闪退的情况
扫一扫混淆方式
开启混淆后,调用扫一扫会出现闪退情况。
日志提示:
1. E/LoggerFactory: [main] java.lang.ClassNotFoundException:
com.alipay.mobile.tianyanadapter.logging.LoggingReflectedEntry
2. FATAL EXCEPTION:java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.demo/com.alipay.mobile.scansdk.activity.MPaasToolsCaptureActivity}:
android.content.res.Resources$NotFoundException: Resource ID
#0xffffffff
关键看第二条提示:
android.content.res.Resources$NotFoundException: Resource ID #0xffffffff
原来是咱们混淆后把R文件给混淆了,因此还需要手动在混淆文件中添加规则保留R下面的资源
# 保留R下面的资源
-keep class **.R$* {*;}
至此,咱们项目完全解决二维码扫码难,识别低等问题了,再也没收到反馈说二维码不好扫的问题。
org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException处理
org.gradle.internal.metaobject.AbstractDynamicObject$CustomMessageMissingMethodException
> Could not find method platform() for arguments [com.mpaas.android:mpaas-baseline:10.1.68-6] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
这是由于gradle版本低引起的,升级后就解决了
根目录下 >> gradle >> wrapper >> gradle-wrapper.properties文件 >> distributionUrl属性
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
附上gradle各个版本号
开启混淆无法使用:
2020-11-24 11:17:11.000 13702-13702/? W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[])' on a null object reference
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at com.uinshine.enterprisebottlemanage.ui.business.bottlesearch.KtBottleSearchActivity.i(SourceFile:9)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at com.uinshine.enterprisebottlemanage.ui.business.bottlesearch.KtBottleSearchActivity.h(SourceFile:2)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at com.uinshine.enterprisebottlemanage.ui.business.bottlesearch.KtBottleSearchActivity.onClickScanQrCode(SourceFile:1)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at androidx.appcompat.app.AppCompatViewInflater$a.onClick(SourceFile:14)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.view.View.performClick(View.java:6608)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.view.View.performClickInternal(View.java:6585)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.view.View.access$3100(View.java:785)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.view.View$PerformClick.run(View.java:25921)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.os.Handler.handleCallback(Handler.java:873)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:99)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.os.Looper.loop(Looper.java:201)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6810)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
2020-11-24 11:17:11.001 13702-13702/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)
未加混淆可以使用,但是报错内容如下:
2020-11-24 10:50:11.256 6261-6399/com.* W/LogRSAUtil: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object byte[].clone()' on a null object reference
at java.security.spec.EncodedKeySpec.<init>(EncodedKeySpec.java:56)
at java.security.spec.X509EncodedKeySpec.<init>(X509EncodedKeySpec.java:64)
at com.alipay.mobile.common.logging.util.RSAUtil.a(RSAUtil.java:41)
at com.alipay.mobile.common.logging.util.RSAUtil.encrypt(RSAUtil.java:61)
at com.alipay.mobile.common.logging.util.HybridEncryption.encrypt(HybridEncryption.java:91)
at com.alipay.mobile.common.logging.appender.FileAppender.a(FileAppender.java:110)
at com.alipay.mobile.common.logging.appender.ExternalFileAppender.f(ExternalFileAppender.java:246)
at com.alipay.mobile.common.logging.appender.ExternalFileAppender.a(ExternalFileAppender.java:140)
at com.alipay.mobile.common.logging.appender.AppenderManager.a(AppenderManager.java:185)
at com.alipay.mobile.common.logging.LogContextImpl.syncAppendLogEvent(LogContextImpl.java:692)
at com.alipay.mobile.common.logging.LogContextImpl.b(LogContextImpl.java:217)
at com.alipay.mobile.common.logging.LogContextImpl$AppendWorker.run(LogContextImpl.java:146)
2020-11-24 10:57:12.227 6261-6261/com.* E/[Scan]CameraScanHandler: [main] cameraHandlerThread is quit
2020-11-24 10:57:12.381 6261-6399/com.* E/Appender: mPaaSPerformanceAndroid first append: [just check, not a real error] java.io.IOException: java.io.FileNotFoundException: /storage/emulated/0/Android/data/com.**/files/mdap/com.*-main_mPaaSPerformanceAndroid (No such file or directory)
检查后发现是未添加扫一扫混淆规则,因此导致开启混淆后,正式服APK无法使用扫一扫功能。
再次发出扫一扫混淆方式,请一定要添加混淆规则!
看到预计停止服务在我百年之后,心里还琢磨着不管了。
想了想还是看看吧,万一牵扯到我芝麻信用咋整。
我有用到阿里系列的就是扫一扫,但说是免费的啊。于是重新看了遍文档,发现扫一扫常见问题中最后一条写着:
解答:扫一扫组件的接入不计费,但扫一扫组件在使用过程中,会收集日志以获得扫码次数、扫码成功次数、扫码失败次数等信息以对扫码性能进行监控和分析,日志的采集过程依赖于计费的移动分析服务,因此会产生一定的费用。更多信息,请参见 移动分析服务的计费信息。
扫一扫组件的日志埋点会在初始阶段配置并默认开启日志上报,如需关闭,请参考文档 日志上报。
原来是默认开启日志上报,所有只要把日志上报关掉就行了,参考文档 日志上报:通过控制台的 移动分析 > 日志管理 > 配置上传开关 > 埋点配置 页面动态控制日志上报的时机。
页面太好找,所以贴一下步骤链接:
步骤一、登录阿里云(用的支付宝扫描登录)
步骤二、打开移动开发平台mPaaS
2.1、如果你有多个应用,请逐一点击移动分析
2.2、点击日志管理
2.3、点击配置上传开关
2.4、点击埋点配置(当时我真的没想到这是个按钮,还以为是纯文本无点击事件)
2.5、初始化业务
步骤三、关闭扫码日志上报按钮
3.1、耐心等待初始化业务完成后可以看到配置列表,切换到第三页。
3.2、关闭扫码日志按钮一共四个
步骤四、关闭分析客户端性能埋点日志
这一步很特殊,该埋点日志默认开启,且不在初始化列表中,需要新增业务关闭。
1,在日志管理页面,新增埋点“mPaaSGrossReport”(大小写不敏感,mpaasgrossreport也支持);
2,关闭“mPaaSGrossReport”埋点上报(上报按钮开关设置为“关”)
3,约 1 分钟后,全服生效。后续客户端默认日志不再上报。
产生的日志100天后,系统会自动删除。
至此因扫码日志上报而产生收费的问题已经解决。
Plugin "mpaas_boost_idea_3.0.200828" was not installed: Downloaded version is incompatible with the current IDE: Plugin 'mPaaS' (version '3.0.200828') is not compatible with the current version of the IDE, because it requires build 193.* or older but the current build is AI-203.7717.56
可以看出,我们之前使用的mPaaS为3.0.200828,适配Android studio版本193*,而我当前使用版本是203*
因此需要去插件市场更新这个mPaas插件
但是由于我插件有问题,找不到最新的mPaas插件,于是访问mPaas历史发布版本自行下载到本地,再去导入该最新插件。
这里贴一下导入本地插件的方式:
依次点击:1、File–> 2、Settings–>3、Plugins–>4、"设置"小图标–>5、Install Plugin from Disk
在弹出的选择路径页面选择下载的插件,ZIP包或JAR即可无需解压。
至此因mPaaS和Android Studio不兼容的问题已解决。