Tencent / Shadow

零反射全动态Android插件框架
BSD 3-Clause "New" or "Revised" License
7.41k stars 1.3k forks source link

加载插件报:请注意每个插件apk构建时都需要apply plugin: 'com.tencent.shadow.plugin' #1161

Closed senda58 closed 4 months ago

senda58 commented 1 year ago

java.lang.RuntimeException: java.lang.IllegalStateException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.Error: 请注意每个插件apk构建时都需要apply plugin: 'com.tencent.shadow.plugin' at com.cop.ronghw.host.manager.SamplePluginManager$1.run(SamplePluginManager.java:153) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:919) Caused by: java.lang.IllegalStateException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.util.concurrent.ExecutionException: java.lang.Error: 请注意每个插件apk构建时都需要apply plugin: 'com.tencent.shadow.plugin' at android.os.Parcel.createException(Parcel.java:2079) at android.os.Parcel.readException(Parcel.java:2039) at android.os.Parcel.readException(Parcel.java:1987) at com.tencent.shadow.dynamic.manager.BinderPluginLoader.loadPlugin(BinderPluginLoader.java:50) at com.cop.ronghw.host.manager.FastPluginManager.loadPlugin(FastPluginManager.java:141) at com.cop.ronghw.host.manager.SamplePluginManager$1.run(SamplePluginManager.java:138) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)  at java.lang.Thread.run(Thread.java:919) 

我的插件的 AGP版本7.2.0,gradle版本7.3.3 ,我是用的是源码集成的方式

请问大佬们如何解决

senda58 commented 1 year ago

插件 app/build.gradle 文件如下:

buildscript {
    repositories {
        if (!System.getenv().containsKey("DISABLE_TENCENT_MAVEN_MIRROR")) {
            maven { url 'https://mirrors.tencent.com/nexus/repository/maven-public/' }
        } else {
            google()
            mavenCentral()
            jcenter()

        }
    }

//编译时使用(可以理解为在shdow构建(脚本)项目过程中需要的依赖包)
dependencies {
    classpath 'com.tencent.shadow.core:runtime'
    classpath 'com.tencent.shadow.core:activity-container'
    classpath 'com.tencent.shadow.core:gradle-plugin'
    classpath "org.javassist:javassist:$javassist_version"
    }
}

plugins {
    id 'com.android.application'
    id 'com.tencent.shadow.plugin' //引用腾讯shadow插件
}

android {
    compileSdk project.COMPILE_SDK_VERSION

defaultConfig {
    applicationId "com.cop.ronghw.plugin1"
    minSdk 21
    targetSdk 32
    versionCode 1
    versionName "1.0"

    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
    debug {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }

}
compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

//    flavorDimensions (*flavorDimensionList, 'DimensionA')
    // 将插件applicationId设置为和宿主相同
    productFlavors {
        plugin {
            applicationId project.SAMPLE_HOST_APP_APPLICATION_ID
        }
    }

lintOptions {
    abortOnError false
}

// 将插件的资源ID分区改为和宿主0x7F不同的值
aaptOptions {
    additionalParameters "--package-id", "0x7E", "--allow-reserved-package-id"
      }
  }

    dependencies {

        //注意sample-host-lib要用compileOnly编译而不打包在插件中。在packagePlugin任务中配置hostWhiteList允许插件访问宿主的类。
    //    pluginCompileOnly project(":sample-host-lib")
    //    normalImplementation project(":sample-host-lib")
    //
    //    pluginCompileOnly project(":sample-base-lib")
    //    normalImplementation project(":sample-base-lib")

        //Shadow Transform后业务代码会有一部分实际引用runtime中的类
        //如果不以compileOnly方式依赖,会导致其他Transform或者Proguard找不到这些类
        pluginCompileOnly 'com.tencent.shadow.core:runtime'

        implementation 'androidx.appcompat:appcompat:1.3.0'
        implementation 'com.google.android.material:material:1.4.0'
        testImplementation 'junit:junit:4.13.2'
        androidTestImplementation 'androidx.test.ext:junit:1.1.3'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    }

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

        packagePlugin {
            pluginTypes {
                debug {
                    loaderApkConfig = new Tuple2('plugin-loader-debug.apk', ':plugin-loader:assembleDebug')
                    runtimeApkConfig = new Tuple2('plugin-runtime-debug.apk', ':plugin-runtime:assembleDebug')

                    // 打包的apk
                    pluginApks {
                        pluginApk1 {
                            businessName = 'app-plugin'
                            partKey = 'app-plugin'
                            buildTask = ':app:assemblePluginDebug'
                            apkPath = 'app/build/outputs/apk/plugin/debug/app-plugin-debug.apk'
    //                        hostWhiteList = ["com.tencent.shadow.sample.host.lib"]
    //                        dependsOn = ['sample-base']
                        }
                    }
                }

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

            loaderApkProjectPath = 'plugin-loader'
            runtimeApkProjectPath = 'plugin-runtime'

            archiveSuffix = System.getenv("PluginSuffix") ?: ""
            archivePrefix = 'plugin'
            destinationDir = "${getRootProject().getBuildDir()}"
            version = 4
            compactVersion = [1, 2, 3]
            uuidNickName = "1.1.5"
        }
    }
senda58 commented 1 year ago

补充:按照之前类似的issue 没有解决问题,麻烦给指导一下。搞了一天多了 也没搞出来 打包插件后会生成plugin-debug.zip 但是 反编译的class.dex 文件中没有com.tecent.shadow包 如下图:

image
senda58 commented 1 year ago

已解决:gradle版本的问题,shadow sdk 中gradle版本和AGP版本太高导致的。 分别将这俩版本降低到了 7.0.2 和7.0.3。 对于高版本的, 希望研发人员再支持一下。

senda58 commented 1 year ago

@shifujun 这个问题,我试了好几个插件,都会出现这种情况,确实不支持高版本的gradle 和AGP 。测试时,我插件的gradle 版本是7.3.3 AGP是7.20 。大佬这个怎么改