DroidPlugin
DroidPlugin copied to clipboard
DroidPlugin 占坑太多,PacageManager调用,FAILED BINDER TRANSACTION
如题,升级配置如下: gradle-wrapper.properties: distributionUrl=https://services.gradle.org/distributions/gradle-3.4.1-all.zip
build.gradle: dependencies { classpath 'com.android.tools.build:gradle:2.3.0' }
原来使用配置是wrapper 2.10 build.gradle: 2.0 ,一切正常,升级后,能安装,但是运行,StrartActiviti的时候,报错: Caused by: java.lang.RuntimeException: 没有可用的进程了
W/System.err: at com.morgoo.droidplugin.am.MyActivityManagerService.throwException(MyActivityManagerService.java:228) 03-27 19:19:05.925 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.am.MyActivityManagerService.selectStubActivityInfo(MyActivityManagerService.java:379) 03-27 19:19:05.925 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.pm.IPluginManagerImpl.selectStubActivityInfo(IPluginManagerImpl.java:1118) 03-27 19:19:05.925 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.pm.IPluginManagerImpl.selectStubActivityInfoByIntent(IPluginManagerImpl.java:1134) 03-27 19:19:05.926 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.pm.PluginManager.selectStubActivityInfo(PluginManager.java:660) 03-27 19:19:05.926 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.hook.handle.IActivityManagerHookHandle.selectProxyActivity(IActivityManagerHookHandle.java:2102) .........
03-27 19:19:05.927 15967-15967/com.microvideo.mivi W/System.err: at com.morgoo.droidplugin.am.MyActivityManagerService.throwException(MyActivityManagerService.java:229)
出现的机器与系统: Nexus 6p android 6.0 / 华为 M8 android.6.0 / 三星 Note 3 android 5.0
使用7.0 机器,貌似正常(华为p9 plus android 7.0)
我debug 到:
StaticProcessList.onCreate: PackageManager pm = mHostContext.getPackageManager(); List<ResolveInfo> activities = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA); for (ResolveInfo activity : activities) { addActivityInfo(activity.activityInfo); }
拿到的activities 为 0
StaticProcessList.onCreate: PackageManager pm = mHostContext.getPackageManager(); List activities = pm.queryIntentActivities(intent, PackageManager.GET_META_DATA); 有时候在调用 pm.queryIntentActivities的时候,报了异常: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died
经过测试分析,怀疑这个问题跟两个因素有关: 1.instant run 2.androidManifest.xml application 节点上加metadata(我们app接入了阿里百川的hotfix,需要添加metadata,刚开始,我怀疑与hotfix的hook冲突,后台我尝试将接入hotfix的代码去掉了, 依赖也去掉了,只留下metadata,结果发现还是不行,我直接注释掉metadata,一切正常) 附上hotfix接入指南:http://baichuan.taobao.com/docs/doc.htm?spm=a3c0d.7629140.0.0.QAJGSr&treeId=234&articleId=106531&docType=1
进一步分析,通过svn提交update to version 一个个关键提交测试, 发现接入了阿里的hotfix之后,开始出现这个问题,应该是metadata太长了(这里有一个metadata字段是ras key,单单字符串就1.9K个字符),导致远程packageManager 调用超过了1M,这个可能就是压死骆驼的最后一把稻草了,这个是根本的原因!因此我现在的解决方案是,将DroidPlugin的manifest 原来又9个进程的坑,我现在删掉了5个,暂时解决了该问题。
前面说到的, pm.queryIntentActivities(intent, PackageManager.GET_META_DATA); 有拿到0的情况,估计是机器的兼容性问题,我现在这样修改了之后,所有的机器都OK了。
重现方案很简单,就是在demo中作死的添加 metadata节点,value 的size大一点,加个上百个,然后这个就会出现:
IPluginManagerImpl: mActivityManagerService.onCreatejava.lang.RuntimeException: Package manager has died at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:657) at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:643) at com.morgoo.droidplugin.am.StaticProcessList.onCreate(StaticProcessList.java:108) at com.morgoo.droidplugin.am.MyActivityManagerService.onCreate(MyActivityManagerService.java:74) at com.morgoo.droidplugin.pm.IPluginManagerImpl.loadAllPlugin(IPluginManagerImpl.java:184) at com.morgoo.droidplugin.pm.IPluginManagerImpl.onCreateInner(IPluginManagerImpl.java:107) at com.morgoo.droidplugin.pm.IPluginManagerImpl.access$000(IPluginManagerImpl.java:75) at com.morgoo.droidplugin.pm.IPluginManagerImpl$1.run(IPluginManagerImpl.java:101) Caused by: android.os.DeadObjectException: Transaction failed on small parcel; remote process probably died at android.os.BinderProxy.transactNative(Native Method) at android.os.BinderProxy.transact(Binder.java:503) at android.content.pm.IPackageManager$Stub$Proxy.queryIntentActivities(IPackageManager.java:3018) at java.lang.reflect.Method.invoke(Native Method) at com.morgoo.droidplugin.hook.proxy.ProxyHook.invoke(ProxyHook.java:56) at java.lang.reflect.Proxy.invoke(Proxy.java:393) at $Proxy21.queryIntentActivities(Unknown Source) at android.app.ApplicationPackageManager.queryIntentActivitiesAsUser(ApplicationPackageManager.java:651) at android.app.ApplicationPackageManager.queryIntentActivities(ApplicationPackageManager.java:643) at com.morgoo.droidplugin.am.StaticProcessList.onCreate(StaticProcessList.java:108) at com.morgoo.droidplugin.am.MyActivityManagerService.onCreate(MyActivityManagerService.java:74) at com.morgoo.droidplugin.pm.IPluginManagerImpl.loadAllPlugin(IPluginManagerImpl.java:184) at com.morgoo.droidplugin.pm.IPluginManagerImpl.onCreateInner(IPluginManagerImpl.java:107) at com.morgoo.droidplugin.pm.IPluginManagerImpl.access$000(IPluginManagerImpl.java:75) at com.morgoo.droidplugin.pm.IPluginManagerImpl$1.run(IPluginManagerImpl.java:101)
@cmzy 这个问题点像dex 65535 一样,应用大了迟早都会遇到的,我这个方案也不是长久之计,看看有什么好的方案。
这个确实是个问题,Binder传输数据不能太大,我得想办法处理下。
我也遇到的了同样问题,也通过修改坑位数量的方式暂时解决,期待大神的完备方案