GithubHelp home page GithubHelp logo

qihoo360 / replugin Goto Github PK

View Code? Open in Web Editor NEW
7.2K 434.0 1.5K 23.71 MB

RePlugin - A flexible, stable, easy-to-use Android Plug-in Framework

License: Apache License 2.0

Groovy 6.25% Java 92.01% Kotlin 1.02% Shell 0.10% AIDL 0.62%

replugin's People

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  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

replugin's Issues

插件更新问题

我把每个业务拆分出来,如果需要单独更新某个插件,怎么做

能不能建个QQ群

能不能建个QQ群,一旦发布了直接在群里同步一下消息就行了

Error:Could not find com.qihoo.gradle:replugin-host-gradle:2.1.0.

插件同步不下来
现在用不了吗?还是说要加特殊的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 :

相互通信问题

宿主和插件之间,插件和宿主之间,插件和插件之间,这些方面的通信有什么限制吗?(毕竟单纯的插件还是很少的,双方甚至多方之间进行通信是免不了的,由于业务需要,单纯的提取出一个插件也看似不怎么现实,现在比较关心的还是相互通信方面。)

是否支持MultiDex方案

你好,我方是做游戏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方案
可以告诉下吗

plugin和host能在一个工程里面一起开发吗

@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`

sample 运行报错

用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

不支持productFlavors特性

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
        }
    }

MI5s Crash:NoSuchMethodError: No static method removeFinalModifier

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)

插件需要用到宿主的资源

在插件中需要用到宿主里面的 public static final 变量,以前用别人的插件化框架是把宿主打成jar 包,给插件引用,那RePlugin 是怎么处理的啊?求大大帮解答下。

对RePlugin接入过程的疑问

引用一下 @jiongxuan 的comment:

相反,RePlugin只Hook了ClassLoader,所以极为稳定,且同样支持绝大多数单品的特性。而APK只需要通过我们的Gradle编译,无需开发者修改Java Code,即可运行在主程序中。

我是否可以理解为借助gradle的transform?那么如果这时候存在多个transform且它们都会修改字节码,是否会对插件造成影响?

host工程无法编译的问题

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

是否支持databinding呢

因为用别的插件框架,使用databinding会遇到好多问题,不知道是否做了databinding的支持

异常java.lang.ClassNotFoundException: com.testreplugin.loader.p.ProviderN1

插件问题:异常
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:

`
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会遇到好多问题,不知道是否做了databinding的支持

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.