应用研发平台EMAS中这个空指针会引起部分机型的崩溃,我需要如何处理?检查项该有的配置都有,该问题仅在OPPO 系列上出现,一直在后台打印信息。FATAL EXCEPTION: main
Process: com.turingsyn.echo, PID: 27150
java.lang.ExceptionInInitializerError
at com.taobao.sophix.a.a.a(Sophix:44)
at com.taobao.sophix.a.e.initialize(Sophix:63)
at com.turingsyn.echo.SophixStubApplication.initSophix(SophixStubApplication.java:61)
at com.turingsyn.echo.SophixStubApplication.attachBaseContext(SophixStubApplication.java:32)
at android.app.Application.attach(Application.java:216)
at android.app.Instrumentation.newApplication(Instrumentation.java:1122)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1122)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6312)
at android.app.ActivityThread.access$1300(ActivityThread.java:215)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:242)
at android.app.ActivityThread.main(ActivityThread.java:7240)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:906)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.UserManager.isUserUnlockingOrUnlocked(int)' on a null object reference
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:431)
at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:417)
at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:185)
at com.taobao.sophix.e.j.a(Sophix:18)
at com.taobao.sophix.a.a.(Sophix:54)
at com.taobao.sophix.a.a.(Sophix:18)
at com.taobao.sophix.a.a.a(Sophix:44)
at com.taobao.sophix.a.e.initialize(Sophix:63)
at com.turingsyn.echo.SophixStubApplication.initSophix(SophixStubApplication.java:61)
at com.turingsyn.echo.SophixStubApplication.attachBaseContext(SophixStubApplication.java:32)
at android.app.Application.attach(Application.java:216)
at android.app.Instrumentation.newApplication(Instrumentation.java:1122)
at android.app.LoadedApk.makeApplication(LoadedApk.java:1122)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6312)
at android.app.ActivityThread.access$1300(ActivityThread.java:215)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1809)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:242)
at android.app.ActivityThread.main(ActivityThread.java:7240)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:502)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:906)
热修复正式接入后CheckList:
检查是否混淆,若有混淆必须-printmapping mapping.txt,发布版本后妥善保存代码和mapping.txt,不能修改。
检查是否加固,加固需要保存加固前的apk,并且若是梆梆加固,需配置忽略sophix文件夹。
检查是否关闭了资源优化:即在gradle.properties中新增android.enableResourceOptimizations=false。若资源优化开启,会导致代码比对异常,导致加载补丁时某些资源找不到。
SophixStubApplication 类必须是java原生的,且不应与项目中的其他类有任何互相调用的逻辑,必须完全做到隔离。另外初始化时候不要判断进程。
queryAndLoadNewPatch()是判断&请求新补丁发的方法,该方法会读取设备信息,请在隐私判断之后调用。SDK其他代码不会涉及隐私合规问题。最新SDK版本是3.3.7。
必须采用稳健接入,具体请参考SDK稳健接入
热修复更新补丁时CheckList:
四大组件不能新增。AndroidManifest.xml,SophixStubApplication.java,build.gradle中的代码不能修改。
通知栏图标、启动图标资源以及RemoteViews等系统负责展示的资源也不能修改。
如果使用了混淆,新包-apply旧包的mapping.txt文件。确保新旧包混淆规则一致。
如果使用了加固,打包使用的新旧包必须是加固前的正常包。若是梆梆加固,需配置忽略sophix文件夹。
如果有SO库的修复,确保所需要修复的SO都是以System.loadLibrary的方式,而不是以具体路径的方式进行加载。
asset资源和so文件的修改,最好配合代码修改:比如在调用处加一句log。以使修改生效。
基础包、修复包、补丁包三个版本号必须一致。如果基础包修改了代码后在其他渠道发布,则建议升级版本号,否则它加载了基础包生成的补丁会报错。
使用和同一个打包机来生成基础包和修复包, 打包机的更换可能导致apk代码对比出错。
请参考补丁发布推荐流程操作。
running.log 是生成补丁时的代码对比log,其中的diff项目对应您的代码差异项。
发补丁前请检查此项是否符合预期,如果差异项过多或者只修改了一点代码但是补丁包很大的情况,请检查以上List。此回答整理自钉群应用研发平台EMAS开发者交流群。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。