美文网首页
【Android】针对在Android中引入AspectJ导致c

【Android】针对在Android中引入AspectJ导致c

作者: littlefogcat | 来源:发表于2023-02-27 17:06 被阅读0次

之前(链接)在 Android 中引入 AspectJ,rebuild 或 clean 时遇到以下问题:

error

经过很久的折腾,终于在网上找到了有效的解决方法!
链接:https://stackoverflow.com/questions/41538246/android-studio-i-keep-getting-gradle-error-the-process-cannot-access-the-file-b

简单来讲,就是将之前脚本中的 new Main().run(javaArgs, handler) 修改为 javaexec { ... };据作者说,这是把 AspectJ 编译器放到一个独立的进程中运行。

经过尝试,把执行脚本修改为如下即可(如果不知道怎么配置,可以查看文章《在 Android / kotlin 中使用 AspectJ》):

buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        google()
        mavenCentral()
    }

}

// app 和 lib 属性不同
def variants = null
if (project.android.hasProperty("applicationVariants")) {
    variants = project.android.applicationVariants
} else if (project.android.hasProperty("libraryVariants")) {
    variants = project.android.libraryVariants
}

variants.all { variant ->
    variant.outputs.all { output ->
        def fullName = ""
        output.name.tokenize('-').eachWithIndex { token, index ->
            fullName = fullName + (index == 0 ? token : token.capitalize())
        }

        JavaCompile javaCompile = variant.javaCompileProvider.get()
        javaCompile.doLast {
            String[] javaArgs = ["-showWeaveInfo",
                                 "-1.8",
                                 "-inpath", javaCompile.destinationDir.toString(),
                                 "-aspectpath", javaCompile.classpath.asPath,
                                 "-d", javaCompile.destinationDir.toString(),
                                 "-classpath", javaCompile.classpath.asPath,
                                 "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
            println "ajc javaArgs: " + Arrays.toString(javaArgs)
            String[] kotlinArgs = ["-showWeaveInfo",
                                   "-1.8",
                                   "-inpath", project.buildDir.path + "/tmp/kotlin-classes/" + fullName,
                                   "-aspectpath", javaCompile.classpath.asPath,
                                   "-d", project.buildDir.path + "/tmp/kotlin-classes/" + fullName,
                                   "-classpath", javaCompile.classpath.asPath,
                                   "-bootclasspath", project.android.bootClasspath.join(
                    File.pathSeparator)]
            println "ajc kotlinArgs: " + Arrays.toString(kotlinArgs)

            def wv = configurations.create("weaving")
            dependencies {
                weaving 'org.aspectj:aspectjtools:1.9.8'
            }
            try {
                javaexec {
                    classpath = wv
                    main = "org.aspectj.tools.ajc.Main"
                    args javaArgs
                }
            } catch (Exception e) {
            }
            try {
                javaexec {
                    classpath = wv
                    main = "org.aspectj.tools.ajc.Main"
                    args kotlinArgs
                }
            } catch (Exception e) {
            }
        }
    }
}

脚本在 gradle 版本 7.1.2,AspectJ 版本 1.9.8 下成功执行,没有报错。

相关文章

网友评论

      本文标题:【Android】针对在Android中引入AspectJ导致c

      本文链接:https://www.haomeiwen.com/subject/kxghldtx.html