Shadow icon indicating copy to clipboard operation
Shadow copied to clipboard

如果将一个组件module的so库和jar提取到一个新的moudle中,做成插件moudle是否可以实现呢?

Open onenoobinit opened this issue 3 years ago • 6 comments

宿主moudle如何获取到插件的so库,并且自动导包到插件jar里面的类?

onenoobinit avatar Feb 10 '22 07:02 onenoobinit

在Shadow框架下插件是依赖宿主的,所以宿主对插件的依赖都要通过控制反转设计。 可以参考sample-host-lib中类的使用。

shifujun avatar Feb 10 '22 08:02 shifujun

老师有没有具体的demo?如果反转设计,宿主依赖的library的build.gradle如何配置呢 需要把插件的如下配置都放到宿主里面吗? //注意sample-host-lib要用compileOnly编译而不打包在插件中。在packagePlugin任务中配置hostWhiteList允许插件访问宿主的类。 pluginCompileOnly project(":sample-host-lib") normalImplementation project(":sample-host-lib")

shadow { transform { // useHostContext = ['abc'] }

packagePlugin {
    pluginTypes {
        debug {
            loaderApkConfig = new Tuple2('sample-loader-debug.apk', ':sample-loader:assembleDebug')
            runtimeApkConfig = new Tuple2('sample-runtime-debug.apk', ':sample-runtime:assembleDebug')
            pluginApks {
                pluginApk1 {
                    businessName = 'sample-plugin-app'
                    partKey = 'sample-plugin-app'
                    buildTask = ':sample-app:assemblePluginDebug'
                    apkPath = 'projects/sample/source/sample-plugin/sample-app/build/outputs/apk/plugin/debug/sample-app-plugin-debug.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                    dependsOn = ['sample-base']
                }
                pluginApk2 {
                    businessName = 'sample-plugin-app2'
                    partKey = 'sample-plugin-app2'
                    buildTask = ':sample-app:assemblePluginDebug'
                    apkPath = 'projects/sample/source/sample-plugin/sample-app/build/outputs/apk/plugin/debug/sample-app-plugin-debug2.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                    dependsOn = ['sample-base']
                }
                sampleBase {
                    businessName = 'sample-plugin-app'
                    partKey = 'sample-base'
                    buildTask = ':sample-base:assemblePluginDebug'
                    apkPath = 'projects/sample/source/sample-plugin/sample-base/build/outputs/apk/plugin/debug/sample-base-plugin-debug.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                }
            }
        }

        release {
            loaderApkConfig = new Tuple2('sample-loader-release.apk', ':sample-loader:assembleRelease')
            runtimeApkConfig = new Tuple2('sample-runtime-release.apk', ':sample-runtime:assembleRelease')
            pluginApks {
                pluginApk1 {
                    businessName = 'sample-plugin-app'
                    partKey = 'sample-plugin-app'
                    buildTask = ':sample-app:assemblePluginRelease'
                    apkPath = 'projects/sample/source/sample-plugin/sample-app/build/outputs/apk/plugin/release/sample-app-plugin-release.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                    dependsOn = ['sample-base']
                }
                pluginApk2 {
                    businessName = 'sample-plugin-app2'
                    partKey = 'sample-plugin-app2'
                    buildTask = ':sample-app:assemblePluginRelease'
                    apkPath = 'projects/sample/source/sample-plugin/sample-app/build/outputs/apk/plugin/release/sample-app-plugin-release2.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                    dependsOn = ['sample-base']
                }
                sampleBase {
                    businessName = 'sample-plugin-app'
                    partKey = 'sample-base'
                    buildTask = ':sample-base:assemblePluginRelease'
                    apkPath = 'projects/sample/source/sample-plugin/sample-base/build/outputs/apk/plugin/release/sample-base-plugin-release.apk'
                    hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
                }
            }
        }
    }

    loaderApkProjectPath = 'projects/sample/source/sample-plugin/sample-loader'
    runtimeApkProjectPath = 'projects/sample/source/sample-plugin/sample-runtime'

    archiveSuffix = System.getenv("PluginSuffix") ?: ""
    archivePrefix = 'plugin'
    destinationDir = "${getRootProject().getBuildDir()}"

    version = 4
    compactVersion = [1, 2, 3]
    uuidNickName = "1.1.5"
}

}

onenoobinit avatar Feb 11 '22 03:02 onenoobinit

sample-host-lib就是具体的例子了。你可以全文搜索其中的类名包名。

shifujun avatar Feb 11 '22 03:02 shifujun

老师我看了sample-host-lib中的类,demo中是实现了插件调用宿主的类,我现在的需求是宿主调用插件中的类,我想问下你说的反转设计,我需要做哪些配置呢?

onenoobinit avatar Feb 11 '22 06:02 onenoobinit

你可以自行搜索一下“依赖注入和控制反转”,这是一种基本的设计模式。

shifujun avatar Feb 11 '22 06:02 shifujun

sample-host-lib就是具体的例子了。你可以全文搜索其中的类名包名。

老师你好,请问sample-host-lib中的这个插件是必须要配置的么 apply plugin: 'com.tencent.shadow.internal.aar-to-jar'

mm46468648 avatar Mar 24 '23 08:03 mm46468648