插件工程异常

一、背景介绍

云助手最初的引入库,是内置在系统的 /system/framework/cloud.jar,其包含了统计、云服务等方面的接口类,后来将统计、云服务单独解耦,故将云助手的引用更新为直接引用工程Cloud

二、产生问题、原因深究、解决方案

(1)
产生问题:云助手ClassNotFoundException crash

原因深究:云助手是运行在32位的环境中,Cloud工程是运行在64位的环境,当32位的云助手调用64位的Cloud的api的时候,就会出现异常ClassNotFoundException

解决方案:Cloud修改为32位、64位环境都支持的应用,在Android.mk文件中LOCAL_MULTILIB设置为both

(2)
产生问题:桌面home crash

      Build fingerprint:'i/ido/ido:7.0/NRD90M/1.1.1:user/test-keys'

      Revision:'0'

      ABI:'arm64'

      pid:6002,tid:6230,name:Thread-8 >>>com.i.home <<< signal 11(SIGSEGV),code 1(SEGV_MAPERR),fault addr 0x2

     ... ...

     backtrace:

     #00 pc 0000000000000290fc /systemlib64/libart.so(offset 0x22c000)

原因探究
1、从bugreport上面来看的话,没有java栈的调用情况,所以根本无从下手。 初步定位在statsdk中方法valueToJSon()出现npe
2、云助手的dex同时被两个进程引用着(桌面com.i.home,云助手com.i.cloudassistant),桌面和云助手工程中都引用了statsdk,但是版本不相同; 桌面进程中不但存在自己compile的statsdk版本,也存在load到桌面的云助手dex中的statsdk版本,在桌面调用统计中会产生混乱的情况,故crash

解决方案:使用在AndroidManifest.xml文件中声明<uses-library android:name="stat.jar"/>,在build文件引用方式provided ‘com.i:statssdk:alpha-SNAPSHOT’,引用系统中的统计sdk,在云助手的dex中就不会在打入statsdk的代码

三、延伸
dx编译jar包进dex文件的时候不管你是什么method最后都是一个method idx(index限制为65536) art解释执行的时候是通过找到dex文件跳转idx来进行
在两个apk,同一个jar被同时打入两个dex,idx大概率是不一样的。

使用同一个dex gradle是不能用compile的要用provide,要么art搜索dex的时候可能会因为顺序导致找错了dex文件进而加载class 跳转method都有可能会出错

前提如果 云助手不独立运行 都是通过module的方式 进入home运行的话,编译云助手的时候
provide 统计sdk
home compile统计sdk

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值