GithubHelp home page GithubHelp logo

manbanggroup / phantom Goto Github PK

View Code? Open in Web Editor NEW
1.3K 53.0 189.0 469 KB

Phantom — 唯一零 Hook 稳定占坑类 Android 热更新插件化方案

License: Apache License 2.0

Shell 0.06% Java 82.26% Groovy 17.68%
android android-library plugin-sdk plugin-architecture plugin-engine plugin plugin-system

phantom's Introduction

license Release Version Build Status

Phantom — 唯一零 Hook 稳定占坑类 Android 热更新插件化方案

Phantom 是满帮集团开源的一套稳定、灵活、兼容性好的 Android 插件化方案。

Phantom 的优势

  • 兼容性好: Hook,兼容 Android 4.0 ~ Android Q beta 4(final APIs)
  • 功能完整:插件支持独立应用的绝大部分特性
  • 稳定可靠:历经货车帮旗下多款产品 50+ 插件两年多千万级用户验证(稳定性和兼容性指标都在 4 个 9 以上)
  • 部署灵活:宿主无需升级(无需在宿主 AndroidManifest.xml 中预埋组件),即可支持插件新增组件,甚至新增插件
  • 易于集成:无论插件端还是宿主端,只需『数行』就能完成接入,改造成本低

Phantom 与主流开源插件框架的对比

特性 Atlas Small VirtualAPK RePlugin Phantom
Hook 数量 较多 较少 较少 仅一处
四大组件 全支持 只支持 Activity 全支持 全支持 ContentProvider 外,全支持
剔除公共库 支持 支持 支持 不支持 支持
兼容性适配 非常高
插件热更新 不支持 不支持 不支持 不支持 支持
插件快速部署 不支持 不支持 不支持 支持 支持
插件宿主通信 一般 一般 一般

接入指南

宿主端

添加 Gradle 配置

在宿主项目根目录下的 build.gradle 中增加宿主 gradle 依赖

buildscript {
    dependencies {
      classpath 'com.wlqq.phantom:phantom-host-gradle:3.1.2'
    }
}

在宿主工程 Application 模块的 build.gradle 中增加宿主 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.host

dependencies {
    compile 'com.wlqq.phantom:phantom-host-lib:3.1.3'
}

apply plugin: 'com.wlqq.phantom.host'

初始化 Phantom 插件框架

在宿主工程 Application 模块中的 Application#onCreate() 方法中初始化 Phantom

public class YourApplication extends Application {
    @Override
    public void onCreate() {
       super.onCreate();
       PhantomCore.getInstance().init(this, new PhantomCore.Config());
    }
}

安装内置到宿主 assets 中的插件 APK 并启动插件中的 Activity

// 安装打包到宿主 assets 中 plugins 目录下的插件
InstallResult ret = PhantomCore.getInstance().installPluginFromAssets("plugins/com.wlqq.phantom.pluign.component_1.0.0.apk");
// 插件安装成功后启动插件(执行插件的 Application#onCreate 方法)
if (ret.isSuccess() && ret.plugin.start()) {
    Intent intent = new Intent();
    // 指定插件 Activity 所在的插件包名以及 Activity 类名
    intent.setClassName("com.wlqq.phantom.pluign.component", "com.wlqq.phantom.pluign.component.MainActivity");
    PhantomCore.getInstance().startActivity(this, intent);
}

插件端

添加 Gradle 配置

在插件项目根目录下的 build.gradle 中增加插件 gradle 依赖

buildscript {
    dependencies {
      classpath 'com.wlqq.phantom:phantom-plugin-gradle:3.1.2'
    }
}

在插件项目 Application 模块的 build.gradle 中增加插件 library 依赖,并应用宿主 gradle 依赖包含的 gradle 插件 com.wlqq.phantom.plugin

android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            // Phantom 混淆配置文件
            proguardFile 'proguard-phantom.pro'
        }
    }
}

dependencies {
    provided 'com.wlqq.phantom:phantom-plugin-lib:3.1.2'
    compile 'com.android.support:support-v4:28.0.0'
}

apply plugin: 'com.wlqq.phantom.plugin'

phantomPluginConfig {
    // BEGIN 剔除公共库配置
    // 若插件中有使用 support-v4 ,则需要剔除掉(必须)
    excludeLib "com.android.support:support-v4:28.0.0"
    // END

    // BEGIN 生成插件额外的混淆配置文件,避免因剔除公共库引起的混淆问题
    libraryJarsProguardFile file('proguard-phantom.pro')
    // END

    // BEGIN 快速部署插件配置
    // 宿主包名
    hostApplicationId = "com.wlqq.phantom.sample"
    // 宿主 launcher Activity full class name
    hostAppLauncherActivity = "com.wlqq.phantom.sample.MainActivity"
    // 插件包名
    pluginApplicationId = android.defaultConfig.applicationId
    // 插件版本名
    pluginVersionName = android.defaultConfig.versionName
    // END
}

在插件 AndroidManifest.xml 中申明对宿主 Phantom 插件框架最低版本依赖

<meta-data
    android:name="phantom.service.import.PhantomVersionService"
    android:value="30000"/>

编译插件

与编译独立 APK 相同,如:

  • ./gradlew assembleDebug
  • ./gradlew assembleRelease

编译插件并将插件 APK 安装到宿主

插件端使用的 Gradle 插件会自动为项目的 variant 生成相应的插件安装 task ,格式为 phInstallPlugin${variant} ,例如:

  • ./gradlew phInstallPluginDebug
  • ./gradlew phInstallPluginRelease

进阶指南

示例应用

联系我们

如果你在使用过程中遇到问题,或者有好的建议,欢迎给我们提 issuePull Request。详细说明请移步 贡献指南

临时交流 QQ 群号:690051836

项目作者

开源协议

Apache License 2.0, part MIT. See the LICENSE file for details.

致谢

参考以及使用的开源项目

项目名称 开源协议 说明
Maven Apache License 依赖库版本比较
jsemver MIT License 依赖库版本比较
Atlas Apache License 首次加载插件提速 jar 包及 so 库
RePlugin Apache License Gradle Plugin 快速部署插件到宿主
反射工具类 ReflectUtils
VirtualApk Apache License 构建 Gradle Plugin 对 Gradle 4.x + Android Gradle Plugin 3.x 的兼容处理

phantom's People

Contributors

jianlin-shen avatar shaobin0604 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

phantom's Issues

plugin not found

gradle4.10.1 com.android.tools.build:gradle:3.3.1报错,这个麻烦解决一下,大神

Caused by: groovy.lang.MissingMethodException: No signature of method: com.android.build.gradle.internal.scope.VariantScopeImpl.getMergeAssetsTask() is applicable for argument types: () values: []
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:120)
at com.wlqq.phantom.gradle.host.PhantomHostPlugin$_apply_closure1.doCall(PhantomHostPlugin.groovy:50)

so问题

插件里面有个so和项目中的so名字一样,能不能插件使用插件的so,项目使用项目里的so 呢

plugin 包一致报错

新建了一个项目,单独一个plugin 。只要加入apply plugin: 'com.wlqq.phantom.plugin' 这行,就运行不起来。

报错如下Cannot invoke method withWriter() on null object

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWith__ExcludeClasses__ForDebug'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:60)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:97)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:87)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:626)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:581)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException: Cannot invoke method withWriter() on null object
at org.codehaus.groovy.runtime.NullObject.invokeMethod(NullObject.java:91)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:48)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.NullCallSite.call(NullCallSite.java:35)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
at com.wlqq.phantom.gradle.plugin.exclude.ExcludeClassesTransform.writeLibraryJarsToProguardFile(ExcludeClassesTransform.groovy:731)
at com.wlqq.phantom.gradle.plugin.exclude.ExcludeClassesTransform.writeLibraryJarsToProguardFile(ExcludeClassesTransform.groovy)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite$PogoCachedMethodSiteNoUnwrapNoCoerce.invoke(PogoMetaMethodSite.java:210)
at org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.callCurrent(PogoMetaMethodSite.java:59)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:174)
at com.wlqq.phantom.gradle.plugin.exclude.ExcludeClassesTransform.transform(ExcludeClassesTransform.groovy:115)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:221)
at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:217)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:212)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:46)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:121)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:110)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
... 32 more

as 3.41
gradle 4.4

SO 的支持情况

SO 的支持是一大块。virtualAPK 支持的就不是很理想。科大讯飞的语音识别就只能放在宿主里,希望能出个支持清单。拜谢!

sync 出现问题 (

Caused by: groovy.lang.MissingMethodException: No signature of method: com.android.build.gradle.internal.scope.VariantScopeImpl.getMergeAssetsTask() is applicable for argument types: () values: []
at com.wlqq.phantom.gradle.host.PhantomHostPlugin$_apply_closure1.doCall(PhantomHostPlugin.groovy:44)
at org.gradle.api.internal.ClosureBackedAction.execute(ClosureBackedAction.java:71)
at org.gradle.util.ConfigureUtil.configureTarget(ConfigureUtil.java:155)
at org.gradle.util.ConfigureUtil.configure(ConfigureUtil.java:106)
at org.gradle.util.ConfigureUtil$WrappedConfigureAction.execute(ConfigureUtil.java:167)
at org.gradle.internal.ImmutableActionSet$SingletonSet.execute(ImmutableActionSet.java:155)
at org.gradle.internal.MutableActionSet.execute(MutableActionSet.java:35)
at org.gradle.api.internal.DefaultDomainObjectCollection.doAdd(DefaultDomainObjectCollection.java:228)
at org.gradle.api.internal.DefaultDomainObjectCollection.add(DefaultDomainObjectCollection.java:222)
at com.android.build.gradle.AppExtension.addVariant(AppExtension.java:87)
at com.android.build.gradle.internal.ApiObjectFactory.create(ApiObjectFactory.java:132)
at com.android.build.gradle.BasePlugin.lambda$createAndroidTasks$6(BasePlugin.java:789)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)
at com.android.build.gradle.BasePlugin.createAndroidTasks(BasePlugin.java:775)
at com.android.build.gradle.BasePlugin.lambda$null$4(BasePlugin.java:670)
at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:81)

gradle4+编译不通过

我com.android.tools.build:gradle:4.1.0一直编译不通过,让我们项目降低gradle到3.1.4也不划算,能不能升级下gradle兼容版本

对 LifecycleActivity 支持有问题

当activity继承 LifecycleActivity 的时候 activity将无法启动
UploadDriverPermitActivity 继承了LifecycleActivity,导致 UploadDriverPermitActivity 无法启动
具体错误如下:

W/Phantom ( 6513): [ (PluginContext.java:84)# createContext -> main ] createContext error, targetClass: class com.wlqq.phantom.plugin.usercenter.verifiy.UploadDriverPermitActivity
W/Phantom ( 6513): java.lang.ClassCastException: com.wlqq.phantom.plugin.usercenter.verifiy.UploadDriverPermitActivity cannot be cast to com.wlqq.phantom.library.proxy.PluginInterceptActivity
W/Phantom ( 6513): at com.wlqq.phantom.library.proxy.PluginContext.createContext(PluginContext.java:69)
W/Phantom ( 6513): at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:115)
W/Phantom ( 6513): at android.app.Activity.performCreate(Activity.java:5990)
W/Phantom ( 6513): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
W/Phantom ( 6513): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
W/Phantom ( 6513): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
W/Phantom ( 6513): at android.app.ActivityThread.access$800(ActivityThread.java:151)
W/Phantom ( 6513): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
W/Phantom ( 6513): at android.os.Handler.dispatchMessage(Handler.java:102)
W/Phantom ( 6513): at android.os.Looper.loop(Looper.java:135)
W/Phantom ( 6513): at android.app.ActivityThread.main(ActivityThread.java:5254)
W/Phantom ( 6513): at java.lang.reflect.Method.invoke(Native Method)
W/Phantom ( 6513): at java.lang.reflect.Method.invoke(Method.java:372)
W/Phantom ( 6513): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
W/Phantom ( 6513): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
W/Phantom ( 6513): [ (ActivityHostProxy.java:160)# onCreate -> main ] ActivityHostProxy onCreate error: com.wlqq.phantom.plugin.usercenter.verifiy.UploadDriverPermitActivity
W/Phantom ( 6513): java.lang.Exception: create mClientActivity return null
W/Phantom ( 6513): at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:117)
W/Phantom ( 6513): at android.app.Activity.performCreate(Activity.java:5990)
W/Phantom ( 6513): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
W/Phantom ( 6513): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
W/Phantom ( 6513): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
W/Phantom ( 6513): at android.app.ActivityThread.access$800(ActivityThread.java:151)
W/Phantom ( 6513): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
W/Phantom ( 6513): at android.os.Handler.dispatchMessage(Handler.java:102)
W/Phantom ( 6513): at android.os.Looper.loop(Looper.java:135)
W/Phantom ( 6513): at android.app.ActivityThread.main(ActivityThread.java:5254)
W/Phantom ( 6513): at java.lang.reflect.Method.invoke(Native Method)
W/Phantom ( 6513): at java.lang.reflect.Method.invoke(Method.java:372)
W/Phantom ( 6513): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
W/Phantom ( 6513): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

请问插件是否不支持databinding?

请问插件是否不支持databinding呢?我这边运行demo 发现 插件的databinding直接爆空了,另外能否提供Phantom目前支持的技术栈清单,鉴于运行demo有时候缺少一些技术栈支持信息,期望使用者也能够少走弯路,十分期待!谢谢!

使用机型 VIVO X20A Android版本7.1.1

插件使用databinding 插件主界面 onCreate(Bundle savedInstanceState) savedInstanceState==null
96f8066870025b50f0747407c7adb5ba

下面为报错日志

2018-10-25 19:00:38.699 2324-2354/? V/pem: noteActivityV5 uid = 10465, cool = 1, Name = com.wlqq.phantom.library.proxy.ActivityHostProxy 2018-10-25 19:00:38.699 2324-2354/? V/SceneMonitor: noteActivitySwitch: the current uid: 10465 mSceneApp.uid: 10465 2018-10-25 19:00:38.699 2324-2626/? V/SceneMonitor: MSG_ACTIVITY_SWITCH the current app is :com.wlqq.phantom.sample = uid : 10465 2018-10-25 19:00:38.705 23530-23530/com.wlqq.phantom.sample V/Phantom: [ (PhantomCore.java:612)# waitForPluginManagerInitCompletion -> main ] waitForPluginManagerInitCompletion cost ms: 0 2018-10-25 19:00:38.705 23530-23530/com.wlqq.phantom.sample I/Phantom: [ (ActivityHostProxy.java:154)# onCreate -> main ] onCreate, originIntent.getComponent: ComponentInfo{com.wlqq.phantom.plugin.view/com.wlqq.phantom.plugin.view.MainActivity} 2018-10-25 19:00:38.711 23530-23530/com.wlqq.phantom.sample V/Phantom: [ (PhantomCore.java:612)# waitForPluginManagerInitCompletion -> main ] waitForPluginManagerInitCompletion cost ms: 0 2018-10-25 19:00:38.721 23530-23530/com.wlqq.phantom.sample I/DecorView: setWindowBackground mBackgroundPadding = Rect(0, 0 - 0, 0), mFramePadding = Rect(0, 0 - 0, 0), pkg = com.wlqq.phantom.sample 2018-10-25 19:00:38.722 23530-23530/com.wlqq.phantom.sample V/Phantom: [ (DefaultLogReporter.java:29)# reportLog -> main ] com.wlqq.phantom.plugin.view_1.0.0/MainActivity onCreate fail 2018-10-25 19:00:38.723 23530-23530/com.wlqq.phantom.sample W/Phantom: [ (ActivityHostProxy.java:222)# onCreate -> main ] ActivityHostProxy onCreate error: com.wlqq.phantom.plugin.view.MainActivity java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:196) at android.app.Activity.performCreate(Activity.java:6877) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2698) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2806) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:181) at android.app.ActivityThread.main(ActivityThread.java:6274) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790) Caused by: java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView com.wlqq.phantom.plugin.view.databinding.ActivityMainBinding.text' on a null object reference at com.wlqq.phantom.plugin.view.MainActivity.onCreate(MainActivity.java:48) at java.lang.reflect.Method.invoke(Native Method)  at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:196)  at android.app.Activity.performCreate(Activity.java:6877)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2698)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2806)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:181)  at android.app.ActivityThread.main(ActivityThread.java:6274)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)  2018-10-25 19:00:38.723 23530-23530/com.wlqq.phantom.sample V/Phantom: [ (DefaultLogReporter.java:24)# reportEvent -> main ] _ph_3.0.0_activity_onCreate_fail -> com.wlqq.phantom.plugin.view -> params: {SDK_INT=25, target_activity=com.wlqq.phantom.plugin.view.MainActivity, message=java.lang.reflect.InvocationTargetException, vn=1.0.0, MODEL=vivo_vivo X20A_25, package_name=com.wlqq.phantom.plugin.view} 2018-10-25 19:00:38.724 23530-23530/com.wlqq.phantom.sample W/Phantom: [ (DefaultLogReporter.java:19)# reportException -> main ] params: {SDK_INT=25, MODEL=vivo_vivo X20A_25} com.wlqq.phantom.library.proxy.ActivityOnCreateException: ActivityHostProxy onCreate error: com.wlqq.phantom.plugin.view.MainActivity at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:232) at android.app.Activity.performCreate(Activity.java:6877) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2698) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2806) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:181) at android.app.ActivityThread.main(ActivityThread.java:6274) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:196) at android.app.Activity.performCreate(Activity.java:6877)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2698)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2806)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:181)  at android.app.ActivityThread.main(ActivityThread.java:6274)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)  Caused by: java.lang.NullPointerException: Attempt to read from field 'android.widget.TextView com.wlqq.phantom.plugin.view.databinding.ActivityMainBinding.text' on a null object reference at com.wlqq.phantom.plugin.view.MainActivity.onCreate(MainActivity.java:48) at java.lang.reflect.Method.invoke(Native Method)  at com.wlqq.phantom.library.proxy.ActivityHostProxy.onCreate(ActivityHostProxy.java:196)  at android.app.Activity.performCreate(Activity.java:6877)  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1125)  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2698)  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2806)  at android.app.ActivityThread.-wrap12(ActivityThread.java)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)  at android.os.Handler.dispatchMessage(Handler.java:102)  at android.os.Looper.loop(Looper.java:181)  at android.app.ActivityThread.main(ActivityThread.java:6274)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:900)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790) 

插件项目引入V7包 会报错

[C:\Users\Administrator.gradle\caches\transforms-1\files-1.1\appcompat-v7-28.0.0.aar\a72a596dc4395165407feeb32dca0018\res\color\abc_btn_colored_text_material.xml:20], original message=, tool name=Optional.of(AAPT)}

插件里面不能用V4包的Framgnet么

cannot be cast to android.support.v4.app.Fragment 包错,我 剔除了啊 excludeLib "com.android.support:support-v4:28.0.0"
excludeLib "com.android.support:support-core-ui:28.0.0"
excludeLib "com.android.support:support-compat:28.0.0"
excludeLib "com.android.support:support-media-compat:28.0.0"
excludeLib "com.android.support:support-core-utils:28.0.0"
excludeLib "com.android.support:support-fragment:28.0.0"
excludeLib "com.android.support:support-annotations:28.0.0"
excludeLib "com.android.support:cursoradapter:28.0.0"
excludeLib "com.android.support:interpolator:28.0.0"
excludeLib "com.android.support:versionedparcelable:28.0.0"
excludeLib "com.android.support:documentfile:28.0.0"
excludeLib "com.android.support:customview:28.0.0"
excludeLib "com.android.support:slidingpanelayout:28.0.0"
excludeLib "com.android.support:swiperefreshlayout:28.0.0"
excludeLib "com.android.support:drawerlayout:28.0.0"
excludeLib "com.android.support:coordinatorlayout:28.0.0"
excludeLib "com.android.support:loader:28.0.0"
excludeLib "com.android.support:viewpager:28.0.0"
excludeLib "com.android.support:collections:28.0.0"
excludeLib "com.android.support:asynclayoutinflater:28.0.0"
excludeLib "com.android.support:print:28.0.0"
excludeLib "com.android.support:localbroadcastmanager:28.0.0"

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.