qihoo360 / replugin Goto Github PK
View Code? Open in Web Editor NEWRePlugin - A flexible, stable, easy-to-use Android Plug-in Framework
License: Apache License 2.0
RePlugin - A flexible, stable, easy-to-use Android Plug-in Framework
License: Apache License 2.0
插件可以复用主程序的资源吗?
支持插件间的资源和类的调用吗?e.g. 公共基础库 打成插架供其他插架调用
我把每个业务拆分出来,如果需要单独更新某个插件,怎么做
能不能建个QQ群,一旦发布了直接在群里同步一下消息就行了
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
@jiongxuan 有些第三方库需要gradle3.5,咱们replugin有支持gradle高版本的打算吗
:)
插件同步不下来
现在用不了吗?还是说要加特殊的repositories?
Error:Could not find com.qihoo.gradle:replugin-host-gradle:2.1.0.
Searched in the following locations:
file:/home/xxx/Program/AS2.3/android-studio/gradle/m2repository/com/qihoo/gradle/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.pom
file:/home/xxx/Program/AS2.3/android-studio/gradle/m2repository/com/qihoo/gradle/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.jar
https://jcenter.bintray.com/com/qihoo/gradle/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.pom
https://jcenter.bintray.com/com/qihoo/gradle/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.jar
Required by:
project :
Error:Could not find com.qihoo360.replugin:replugin-host-gradle:2.1.0.
Searched in the following locations:
file:/Applications/Android Studio 3.0 Preview.app/Contents/gradle/m2repository/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.pom
file:/Applications/Android Studio 3.0 Preview.app/Contents/gradle/m2repository/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.jar
https://dl.google.com/dl/android/maven2/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.pom
https://dl.google.com/dl/android/maven2/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.jar
https://jcenter.bintray.com/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.pom
https://jcenter.bintray.com/com/qihoo360/replugin/replugin-host-gradle/2.1.0/replugin-host-gradle-2.1.0.jar
Required by:
project :
作为一个致力于插件化和热更新工作的Developer,非常支持360的这次开源行动!
拜读源码中……
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
宿主和插件之间,插件和宿主之间,插件和插件之间,这些方面的通信有什么限制吗?(毕竟单纯的插件还是很少的,双方甚至多方之间进行通信是免不了的,由于业务需要,单纯的提取出一个插件也看似不怎么现实,现在比较关心的还是相互通信方面。)
准备赶紧接入试试。之前项目就是复用了DroidPlugin的核心技术,现在360又来了一个这么叼的。大赞。
你好,我方是做游戏SDK的,由于我方无法预知上游游戏厂商的游戏母包是否超过了65535方法数量限制而采用Multidex方案
1.replugin支持宿主使用Multidex方案
`
public class MultiDexApplication extends Application {
public MultiDexApplication() {
}
//写法有问题吗?
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
RePlugin.App.attachBaseContext(this);
MultiDex.install(this);
}
}
`
2 不支持宿主使用Multidex方案
可以告诉下吗
@jiongxuan 我在同一个工程里面试了下,会报错:
root build.gradle:
`// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
maven {
url "https://dl.bintray.com/qihoo360/replugin"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.1.0'
classpath 'com.qihoo360.replugin:replugin-plugin-gradle:2.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
mavenCentral()
maven {
url "https://dl.bintray.com/qihoo360/replugin"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
**host app build.gradle:**
apply plugin: 'com.android.application'
apply plugin: 'replugin-host-gradle'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.zhph.zhyq"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.qihoo360.replugin:replugin-host-lib:2.1.0'
}
**plugin home build.gradle:**
apply plugin: 'com.android.application'
apply plugin: 'replugin-plugin-gradle'
android {
compileSdkVersion 25
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.zhph.home"
minSdkVersion 14
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.qihoo360.replugin:replugin-plugin-lib:2.1.0'
}
**Error message:**
Error:(2, 0) Failed to apply plugin [id 'replugin-plugin-gradle']
Open File`
用android studio运行到手机,报错如下:
java.lang.ClassNotFoundException: Didn't find class "com.qihoo360.replugin.sample.host.loader.p.ProviderN1"
RePlugin version: 2.1.0
Android compile SDK version: 25
Android ROM: 红米1S
Error:(23, 0) Failed to apply plugin [id 'replugin-plugin-gradle']
Open File
NamedDomainObjectContainer<AndroidSourceSet> sourceSets = project.extensions.getByType(AppExtension).getSourceSets()
File sourceDir = sourceSets.findByName('main')['javaDirectories'][0]
NamedDomainObjectContainer<AndroidSourceSet> sourceSets = project.extensions.getByType(AppExtension).getSourceSets()
fileDir = sourceSets.findByName('main')['assetsDirectories'][0]
以上编码的存在,导致不支持productFlavors,只会处理main目录下的assets与生成main目录下的RePluginHostConfig类
建议hook mergeAssetsTask
like this
project.afterEvaluate {
project.android.applicationVariants.each { ApplicationVariantImpl variant ->
def variantData = variant.variantData
def scope = variantData.scope
def globalScope = scope.globalScope
def generatedDir = globalScope.generatedDir;
def dirName = variantData.variantConfiguration.dirName
//get task name
def mergeAssetsTaskName = scope.getMergeAssetsTask().name
//get real gradle task
def mergeAssetsTask = project.tasks.getByName(mergeAssetsTaskName)
if (mergeAssetsTask) {
def generateRePluginBuiltinJsonTaskName = scope.getTaskName("generate", "RePluginBuiltinJson")
def generateRePluginBuiltinJsonTask = project.task(generateRePluginBuiltinJsonTaskName)
generateRePluginBuiltinJsonTask.doLast {
//generate json
}
//finalizedBy
mergeAssetsTask.finalizedBy generateRePluginBuiltinJsonTask
}
}
}
RePluginHostConfig建议生成到build/generated/source目录下,类似BuildConfig,而不是src目录中。
like this
project.afterEvaluate {
project.android.applicationVariants.each { ApplicationVariantImpl variant ->
def variantData = variant.variantData
def scope = variantData.scope
def globalScope = scope.globalScope
def generatedDir = globalScope.generatedDir;
def dirName = variantData.variantConfiguration.dirName
//get dir
File generatedRePluginHostConfigSourceDir = new File(generatedDir, "source/replugin/" + dirName);
//build src dir to ImmutableList<ConfigurableFileTree>
ImmutableList.Builder<ConfigurableFileTree> sourceSets = ImmutableList.builder();
sourceSets.add(generatedRePluginHostConfigSourceDir)
List<ConfigurableFileTree> rePluginGeneratedjavaSources = sourceSets.build()
//add java file to AndroidJavaCompile Task
def compileJavaWithJavacTaskName = scope.getTaskName("compile", "JavaWithJavac")
def compileJavaWithJavacTask = project.tasks.getByName(compileJavaWithJavacTaskName)
compileJavaWithJavacTask.source(rePluginGeneratedjavaSources)
//add generate RePluginHostConfig task
def generateRePluginHostConfigTaskName = scope.getTaskName("generate", "RePluginHostConfig")
def generateSourcesTaskName = scope.getTaskName("generate", "Sources")
def generateRePluginHostConfig = project.task(generateRePluginHostConfigTaskName)
//get the file content by some function
def rePluginHostConfigTemplate = "get the file content"
generateRePluginHostConfig.doLast {
File file = new File(generatedRePluginHostConfigSourceDir, "com/qihoo360/replugin/gen/RePluginHostConfig.java")
GFileUtils.writeFile(rePluginHostConfigTemplate, file)
}
//dependsOn
def generateSourcesTask = project.tasks.getByName(generateSourcesTaskName);
if (generateSourcesTask) {
generateSourcesTask.dependsOn generateRePluginHostConfig
}
}
java.lang.NoSuchMethodError: No static method removeFinalModifier(Ljava/lang/reflect/Field;)V in class Lorg/apache/commons/lang3/reflect/FieldUtils; or its super classes (declaration of 'org.apache.commons.lang3.reflect.FieldUtils' appears in /system/framework/framework.jar:classes2.dex)
at com.qihoo360.replugin.RePluginClassLoader.copyFieldValue(RePluginClassLoader.java:128)
at com.qihoo360.replugin.RePluginClassLoader.copyFromOriginal(RePluginClassLoader.java:113)
at com.qihoo360.replugin.RePluginClassLoader.(RePluginClassLoader.java:79)
at com.qihoo360.replugin.DefaultRePluginCallbacks.createClassLoader(DefaultRePluginCallbacks.java:52)
at com.qihoo360.loader.utils.PatchClassLoaderUtils.patch(PatchClassLoaderUtils.java:81)
at com.qihoo360.loader2.PMF.init(PMF.java:79)
at com.qihoo360.replugin.RePlugin$App.attachBaseContext(RePlugin.java:845)
at com.qihoo360.replugin.RePlugin$App.attachBaseContext(RePlugin.java:789)
at com.qihoo360.replugin.sample.host.SampleApplication.attachBaseContext(SampleApplication.java:35)
at android.app.Application.attach(Application.java:191)
at android.app.Instrumentation.newApplication(Instrumentation.java:998)
at android.app.Instrumentation.newApplication(Instrumentation.java:982)
at android.app.LoadedApk.makeApplication(LoadedApk.java:575)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4716)
at android.app.ActivityThread.access$1600(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1421)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5458)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:738)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628)
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
在插件中需要用到宿主里面的 public static final 变量,以前用别人的插件化框架是把宿主打成jar 包,给插件引用,那RePlugin 是怎么处理的啊?求大大帮解答下。
啦啦啦
类似于small 的实现 通过外部配置Extension 告知 host,lib 对应的project Name,在根目录 打入rootPlugin,动态去apply plugin (host,or lib)。引入统一 又方便于其他项目引入
插件列表在哪儿可以看到?
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
看文档可以直接启动activity和service等组件,想了解一下可以直接启动插件中的fragment吗?
引用一下 @jiongxuan 的comment:
相反,RePlugin只Hook了ClassLoader,所以极为稳定,且同样支持绝大多数单品的特性。而APK只需要通过我们的Gradle编译,无需开发者修改Java Code,即可运行在主程序中。
我是否可以理解为借助gradle的transform?那么如果这时候存在多个transform且它们都会修改字节码,是否会对插件造成影响?
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
Gradle sync failed: Cause: org.gradle.api.internal.tasks.DefaultTaskInputs$TaskInputUnionFileCollection cannot be cast to org.gradle.api.internal.file.collections.DefaultConfigurableFileCollection
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
你好,请问Replugin与原先的DroidPlugin有什么区别?
rt
在#43 这个问题里,我开始也是这么做的,我看作者说不建议这么做,我就单独建了一个工程,然而还是这种错误
代码我提交到了https://github.com/ikakaxi/TestRePlugin_plugin ,请作者帮忙看一下哪里的问题,我是按照https://github.com/Qihoo360/RePlugin/wiki/插件接入指南 这里的文档做的
目前项目在使用DroidPlugin实现插件化,而且它的介绍也是你们开源的,所以想问下这两者有什么不同
大牛们先给来点RePlugin的干货文章吧,或者原理的,或者开发经历之类的,让大家解解馋,太期待啦
期待
因为用别的插件框架,使用databinding会遇到好多问题,不知道是否做了databinding的支持
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
插件问题:异常
java.lang.ClassNotFoundException: com.testreplugin.loader.p.ProviderN1
我的代码上传到了github:https://github.com/ikakaxi/testRePlugin.git
我是app->lib1->lib2
lib1和lib2有一个相同名字的color资源,然后在app里默认的activity_main里面把文字颜色设置了这个color,运行报错
详细堆栈信息:
java.lang.RuntimeException: Unable to get provider com.testreplugin.loader.p.ProviderN1: java.lang.ClassNotFoundException: Didn't find class "com.testreplugin.loader.p.ProviderN1" on path: DexPathList[[zip file "/data/app/com.testreplugin-2/base.apk", zip file "/data/app/com.testreplugin-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.testreplugin-2/lib/x86_64, /vendor/lib64, /system/lib64]] at android.app.ActivityThread.installProvider(ActivityThread.java:5156) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Caused by: java.lang.ClassNotFoundException: Didn't find class "com.testreplugin.loader.p.ProviderN1" on path: DexPathList[[zip file "/data/app/com.testreplugin-2/base.apk", zip file "/data/app/com.testreplugin-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.testreplugin-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.testreplugin-2/lib/x86_64, /vendor/lib64, /system/lib64]] at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56) at java.lang.ClassLoader.loadClass(ClassLoader.java:511) at java.lang.ClassLoader.loadClass(ClassLoader.java:469) at android.app.ActivityThread.installProvider(ActivityThread.java:5141) at android.app.ActivityThread.installContentProviders(ActivityThread.java:4748) at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4688) at android.app.ActivityThread.-wrap1(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1405) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) Suppressed: java.lang.ClassNotFoundException: com.testreplugin.loader.p.ProviderN1 at java.lang.Class.classForName(Native Method) at java.lang.BootClassLoader.findClass(ClassLoader.java:781) at java.lang.BootClassLoader.loadClass(ClassLoader.java:841) at java.lang.ClassLoader.loadClass(ClassLoader.java:504) ... 12 more Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
You may also want to read our issue guide.
RePlugin version:
Android compile SDK version:
Android ROM:
`
buildscript {
repositories {
jcenter()
maven {
url "https://dl.bintray.com/qihoo360/replugin"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
classpath 'com.qihoo360.replugin:replugin-host-gradle:2.1.0'
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://dl.bintray.com/qihoo360/replugin"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}`
错误提示:
Error:Execution failed for task ':app:processDebugResources'.
D:\xinshiyunProject\gitClone2\RePluginMainDemo\app\src\main\assets\plugins
因为用别的插件框架,使用databinding会遇到好多问题,不知道是否做了databinding的支持
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.