diff --git a/app/build.gradle b/app/build.gradle index 8b0d6121..3e559278 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,4 +1,5 @@ apply plugin: 'com.android.application' +apply plugin: 'com.alibaba.arouter' android { compileSdkVersion Integer.parseInt(COMPILE_SDK_VERSION) diff --git a/arouter-auto-register/build.gradle b/arouter-auto-register/build.gradle deleted file mode 100644 index a14d6b39..00000000 --- a/arouter-auto-register/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -apply plugin: 'groovy' - -dependencies { - compile gradleApi() - compile localGroovy() -} - -repositories { - mavenCentral() -} -dependencies { - compile 'com.android.tools.build:gradle:2.2.0' -} - - diff --git a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterPlugin.groovy b/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterPlugin.groovy deleted file mode 100644 index aa0c93c4..00000000 --- a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterPlugin.groovy +++ /dev/null @@ -1,34 +0,0 @@ -package com.billy.android.register - -import com.android.build.gradle.AppExtension -import com.android.build.gradle.AppPlugin -import org.gradle.api.Plugin -import org.gradle.api.Project -/** - * Simple version of AutoRegister plugin for ARouter - * @author billy.qi email: qiyilike@163.com - * @since 17/12/06 15:35 - */ -public class RouterRegisterPlugin implements Plugin { - - @Override - public void apply(Project project) { - def isApp = project.plugins.hasPlugin(AppPlugin) - //only application module needs this plugin to generate register code - if (isApp) { - println 'project(' + project.name + ') apply arouter-auto-register plugin' - def android = project.extensions.getByType(AppExtension) - def transformImpl = new RouterRegisterTransform(project) - - //init arouter-auto-register settings - ArrayList list = new ArrayList<>(3) - list.add(new RouterRegisterSetting('IRouteRoot', 'registerRouteRoot')) - list.add(new RouterRegisterSetting('IInterceptorGroup', 'registerInterceptor')) - list.add(new RouterRegisterSetting('IProviderGroup', 'registerProvider')) - RouterRegisterTransform.registerList = list - //register this plugin - android.registerTransform(transformImpl) - } - } - -} diff --git a/arouter-auto-register/src/main/resources/META-INF/gradle-plugins/arouter-auto-register.properties b/arouter-auto-register/src/main/resources/META-INF/gradle-plugins/arouter-auto-register.properties deleted file mode 100644 index 04b95043..00000000 --- a/arouter-auto-register/src/main/resources/META-INF/gradle-plugins/arouter-auto-register.properties +++ /dev/null @@ -1 +0,0 @@ -implementation-class=com.billy.android.register.RouterRegisterPlugin \ No newline at end of file diff --git a/arouter-register/build.gradle b/arouter-register/build.gradle new file mode 100644 index 00000000..34f82ae8 --- /dev/null +++ b/arouter-register/build.gradle @@ -0,0 +1,21 @@ +apply plugin: 'groovy' + +ext { + bintrayName = 'arouter-register' + artifact = bintrayName + libraryName = 'ARouter register gradle plugin' + libraryDescription = 'A gradle plugin used for arouter route map register' + libraryVersion = arouter_register_version +} + +dependencies { + compile gradleApi() + compile localGroovy() +} + +dependencies { + compile 'com.android.tools.build:gradle:2.1.3' +} + +apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/installv1.gradle' +apply from: 'https://raw.githubusercontent.com/nuuneoi/JCenter/master/bintrayv1.gradle' \ No newline at end of file diff --git a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterCodeGenerator.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterCodeGenerator.groovy similarity index 81% rename from arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterCodeGenerator.groovy rename to arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterCodeGenerator.groovy index da15da41..33f8c103 100644 --- a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterCodeGenerator.groovy +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterCodeGenerator.groovy @@ -1,5 +1,7 @@ -package com.billy.android.register +package com.alibaba.android.arouter.register.core +import com.alibaba.android.arouter.register.utils.Logger +import com.alibaba.android.arouter.register.utils.ScanSetting import org.apache.commons.io.IOUtils import org.objectweb.asm.* @@ -11,17 +13,17 @@ import java.util.zip.ZipEntry * generate register code into LogisticsCenter.class * @author billy.qi email: qiyilike@163.com */ -class RouterRegisterCodeGenerator { - RouterRegisterSetting extension +class RegisterCodeGenerator { + ScanSetting extension - private RouterRegisterCodeGenerator(RouterRegisterSetting extension) { + private RegisterCodeGenerator(ScanSetting extension) { this.extension = extension } - static void insertInitCodeTo(RouterRegisterSetting registerSetting) { + static void insertInitCodeTo(ScanSetting registerSetting) { if (registerSetting != null && !registerSetting.classList.isEmpty()) { - RouterRegisterCodeGenerator processor = new RouterRegisterCodeGenerator(registerSetting) - File file = RouterRegisterTransform.fileContainsInitClass + RegisterCodeGenerator processor = new RegisterCodeGenerator(registerSetting) + File file = RegisterTransform.fileContainsInitClass if (file.getName().endsWith('.jar')) processor.insertInitCodeIntoJarFile(file) } @@ -47,8 +49,10 @@ class RouterRegisterCodeGenerator { ZipEntry zipEntry = new ZipEntry(entryName) InputStream inputStream = file.getInputStream(jarEntry) jarOutputStream.putNextEntry(zipEntry) - if (RouterRegisterSetting.GENERATE_TO_CLASS_FILE_NAME == entryName) { - println('codeInsertToClassName:' + entryName) + if (ScanSetting.GENERATE_TO_CLASS_FILE_NAME == entryName) { + + Logger.i('Insert init code to class >> ' + entryName) + def bytes = referHackWhenInit(inputStream) jarOutputStream.write(bytes) } else { @@ -92,16 +96,16 @@ class RouterRegisterCodeGenerator { String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions) //generate code into this method - if (name == RouterRegisterSetting.GENERATE_TO_METHOD_NAME) { - mv = new MyMethodVisitor(Opcodes.ASM5, mv) + if (name == ScanSetting.GENERATE_TO_METHOD_NAME) { + mv = new RouteMethodVisitor(Opcodes.ASM5, mv) } return mv } } - class MyMethodVisitor extends MethodVisitor { + class RouteMethodVisitor extends MethodVisitor { - MyMethodVisitor(int api, MethodVisitor mv) { + RouteMethodVisitor(int api, MethodVisitor mv) { super(api, mv) } @@ -116,7 +120,7 @@ class RouterRegisterCodeGenerator { mv.visitMethodInsn(Opcodes.INVOKESPECIAL, name, "", "()V", false) // generate invoke register method into LogisticsCenter.loadRouterMap() mv.visitMethodInsn(Opcodes.INVOKESTATIC - , RouterRegisterSetting.GENERATE_TO_CLASS_NAME + , ScanSetting.GENERATE_TO_CLASS_NAME , extension.registerMethodName , "(L${extension.interfaceName};)V" , false) diff --git a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterTransform.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterTransform.groovy similarity index 66% rename from arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterTransform.groovy rename to arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterTransform.groovy index 240af065..4d2a9680 100644 --- a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterTransform.groovy +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/core/RegisterTransform.groovy @@ -1,5 +1,8 @@ -package com.billy.android.register +package com.alibaba.android.arouter.register.core +import com.alibaba.android.arouter.register.utils.Logger +import com.alibaba.android.arouter.register.utils.ScanSetting +import com.alibaba.android.arouter.register.utils.ScanUtil import com.android.build.api.transform.* import com.android.build.gradle.internal.pipeline.TransformManager import org.apache.commons.codec.digest.DigestUtils @@ -10,17 +13,17 @@ import org.gradle.api.Project * transform api *

* 1. Scan all classes to find which classes implement the specified interface - * 2. Generate register code into class file: {@link RouterRegisterSetting#GENERATE_TO_CLASS_FILE_NAME} + * 2. Generate register code into class file: {@link ScanSetting#GENERATE_TO_CLASS_FILE_NAME} * @author billy.qi email: qiyilike@163.com * @since 17/3/21 11:48 */ -class RouterRegisterTransform extends Transform { +class RegisterTransform extends Transform { Project project - static ArrayList registerList + static ArrayList registerList static File fileContainsInitClass; - RouterRegisterTransform(Project project) { + RegisterTransform(Project project) { this.project = project } @@ -30,7 +33,7 @@ class RouterRegisterTransform extends Transform { */ @Override String getName() { - return "arouter-auto-register" + return ScanSetting.PLUGIN_NAME } @Override @@ -58,8 +61,11 @@ class RouterRegisterTransform extends Transform { , Collection referencedInputs , TransformOutputProvider outputProvider , boolean isIncremental) throws IOException, TransformException, InterruptedException { - println("\n\n============================ start arouter-auto-register ============================\n") - long time = System.currentTimeMillis() + + Logger.i('Start scan register info in jar file.') + + long startTime = System.currentTimeMillis() + inputs.each { TransformInput input -> // scan all jars @@ -76,8 +82,8 @@ class RouterRegisterTransform extends Transform { File dest = outputProvider.getContentLocation(destName + "_" + hexName, jarInput.contentTypes, jarInput.scopes, Format.JAR) //scan jar file to find classes - if (RouterScanUtil.shouldProcessPreDexJar(src.absolutePath)) { - RouterScanUtil.scanJar(src, dest) + if (ScanUtil.shouldProcessPreDexJar(src.absolutePath)) { + ScanUtil.scanJar(src, dest) } FileUtils.copyFile(src, dest) @@ -90,8 +96,8 @@ class RouterRegisterTransform extends Transform { root += File.separator directoryInput.file.eachFileRecurse { File file -> def path = file.absolutePath.replace(root, '') - if(file.isFile() && RouterScanUtil.shouldProcessClass(path)){ - RouterScanUtil.scanClass(file) + if(file.isFile() && ScanUtil.shouldProcessClass(path)){ + ScanUtil.scanClass(file) } } @@ -99,26 +105,24 @@ class RouterRegisterTransform extends Transform { FileUtils.copyDirectory(directoryInput.file, dest) } } - def scanFinishTime = System.currentTimeMillis() - println(">>>>>> register scan all class cost time: " + (scanFinishTime - time) + " ms") + + Logger.i('Scan finish, current cost time ' + (System.currentTimeMillis() - startTime) + "ms") if (fileContainsInitClass) { registerList.each { ext -> - println("\ninsert register code to file:" + fileContainsInitClass.absolutePath) + Logger.i('Insert register code to file ' + fileContainsInitClass.absolutePath) + if (ext.classList.isEmpty()) { - project.logger.error("No class implements found for interface:" + ext.interfaceName) + Logger.e("No class implements found for interface:" + ext.interfaceName) } else { ext.classList.each { - println(it) + Logger.i(it) } - RouterRegisterCodeGenerator.insertInitCodeTo(ext) + RegisterCodeGenerator.insertInitCodeTo(ext) } } } - def finishTime = System.currentTimeMillis() - println("\n>>>>>> register insert code cost time: " + (finishTime - scanFinishTime) + " ms") - println(">>>>>> register cost time: " + (finishTime - time) + " ms") - println("\n============================ finish arouter-auto-register ============================\n\n") - } + Logger.i("Generate code finish, current cost time: " + (System.currentTimeMillis() - startTime) + "ms") + } } diff --git a/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/launch/PluginLaunch.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/launch/PluginLaunch.groovy new file mode 100644 index 00000000..401cccd9 --- /dev/null +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/launch/PluginLaunch.groovy @@ -0,0 +1,40 @@ +package com.alibaba.android.arouter.register.launch + +import com.alibaba.android.arouter.register.utils.Logger +import com.android.build.gradle.AppExtension +import com.android.build.gradle.AppPlugin +import com.alibaba.android.arouter.register.utils.ScanSetting +import com.alibaba.android.arouter.register.core.RegisterTransform +import org.gradle.api.Plugin +import org.gradle.api.Project +/** + * Simple version of AutoRegister plugin for ARouter + * @author billy.qi email: qiyilike@163.com + * @since 17/12/06 15:35 + */ +public class PluginLaunch implements Plugin { + + @Override + public void apply(Project project) { + def isApp = project.plugins.hasPlugin(AppPlugin) + //only application module needs this plugin to generate register code + if (isApp) { + Logger.make(project) + + Logger.i('project(' + project.name + ') apply arouter-register plugin') + + def android = project.extensions.getByType(AppExtension) + def transformImpl = new RegisterTransform(project) + + //init arouter-auto-register settings + ArrayList list = new ArrayList<>(3) + list.add(new ScanSetting('IRouteRoot', 'registerRouteRoot')) + list.add(new ScanSetting('IInterceptorGroup', 'registerInterceptor')) + list.add(new ScanSetting('IProviderGroup', 'registerProvider')) + RegisterTransform.registerList = list + //register this plugin + android.registerTransform(transformImpl) + } + } + +} diff --git a/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/Logger.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/Logger.groovy new file mode 100644 index 00000000..79aae54d --- /dev/null +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/Logger.groovy @@ -0,0 +1,36 @@ +package com.alibaba.android.arouter.register.utils + +import org.gradle.api.Project + +/** + * Format log + * + * @author zhilong Contact me. + * @version 1.0 + * @since 2017/12/18 下午2:43 + */ +class Logger { + static org.gradle.api.logging.Logger logger + + static void make(Project project) { + logger = project.getLogger() + } + + static void i(String info) { + if (null != info && null != logger) { + logger.info("ARouter::Register >>> " + info) + } + } + + static void e(String error) { + if (null != error && null != logger) { + logger.error("ARouter::Register >>> " + error) + } + } + + static void w(String warning) { + if (null != warning && null != logger) { + logger.warn("ARouter::Register >>> " + warning) + } + } +} diff --git a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterSetting.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanSetting.groovy similarity index 89% rename from arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterSetting.groovy rename to arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanSetting.groovy index 0c5a7fb5..2383e653 100644 --- a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterRegisterSetting.groovy +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanSetting.groovy @@ -1,10 +1,11 @@ -package com.billy.android.register +package com.alibaba.android.arouter.register.utils /** * register setting * @author billy.qi email: qiyilike@163.com * @since 17/3/28 11:48 */ -class RouterRegisterSetting { +class ScanSetting { + static final String PLUGIN_NAME = "com.alibaba.arouter" /** * The register code is generated into this class */ @@ -50,7 +51,7 @@ class RouterRegisterSetting { * @param interfaceName interface to scan * @param registerMethod method to generate code into */ - RouterRegisterSetting(String interfaceName, String registerMethod){ + ScanSetting(String interfaceName, String registerMethod){ this.interfaceName = INTERFACE_PACKAGE_NAME + interfaceName this.registerMethodName = registerMethod } diff --git a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterScanUtil.groovy b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanUtil.groovy similarity index 83% rename from arouter-auto-register/src/main/groovy/com/billy/android/register/RouterScanUtil.groovy rename to arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanUtil.groovy index 32ce55a5..b2beb445 100644 --- a/arouter-auto-register/src/main/groovy/com/billy/android/register/RouterScanUtil.groovy +++ b/arouter-register/src/main/groovy/com/alibaba/android/arouter/register/utils/ScanUtil.groovy @@ -1,5 +1,6 @@ -package com.billy.android.register +package com.alibaba.android.arouter.register.utils +import com.alibaba.android.arouter.register.core.RegisterTransform import org.objectweb.asm.ClassReader import org.objectweb.asm.ClassVisitor import org.objectweb.asm.ClassWriter @@ -14,7 +15,7 @@ import java.util.jar.JarFile * @author billy.qi email: qiyilike@163.com * @since 17/3/20 11:48 */ -class RouterScanUtil { +class ScanUtil { /** * scan jar file @@ -28,14 +29,14 @@ class RouterScanUtil { while (enumeration.hasMoreElements()) { JarEntry jarEntry = (JarEntry) enumeration.nextElement() String entryName = jarEntry.getName() - if (entryName.startsWith(RouterRegisterSetting.ROUTER_CLASS_PACKAGE_NAME)) { + if (entryName.startsWith(ScanSetting.ROUTER_CLASS_PACKAGE_NAME)) { InputStream inputStream = file.getInputStream(jarEntry) scanClass(inputStream) inputStream.close() - } else if (RouterRegisterSetting.GENERATE_TO_CLASS_FILE_NAME == entryName) { + } else if (ScanSetting.GENERATE_TO_CLASS_FILE_NAME == entryName) { // mark this jar file contains LogisticsCenter.class // After the scan is complete, we will generate register code into this file - RouterRegisterTransform.fileContainsInitClass = destFile + RegisterTransform.fileContainsInitClass = destFile } } file.close() @@ -47,7 +48,7 @@ class RouterScanUtil { } static boolean shouldProcessClass(String entryName) { - return entryName != null && entryName.startsWith(RouterRegisterSetting.ROUTER_CLASS_PACKAGE_NAME) + return entryName != null && entryName.startsWith(ScanSetting.ROUTER_CLASS_PACKAGE_NAME) } /** @@ -75,7 +76,7 @@ class RouterScanUtil { void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { super.visit(version, access, name, signature, superName, interfaces) - RouterRegisterTransform.registerList.each { ext -> + RegisterTransform.registerList.each { ext -> if (ext.interfaceName && interfaces != null) { interfaces.each { itName -> if (itName == ext.interfaceName) { diff --git a/arouter-register/src/main/resources/META-INF/gradle-plugins/com.alibaba.arouter.properties b/arouter-register/src/main/resources/META-INF/gradle-plugins/com.alibaba.arouter.properties new file mode 100644 index 00000000..94fa66a6 --- /dev/null +++ b/arouter-register/src/main/resources/META-INF/gradle-plugins/com.alibaba.arouter.properties @@ -0,0 +1 @@ +implementation-class=com.alibaba.android.arouter.register.launch.PluginLaunch \ No newline at end of file diff --git a/build.gradle b/build.gradle index 4a4d5675..0186c06e 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,6 @@ buildscript { ext.kotlin_version = '1.1.3-2' + repositories { jcenter() } @@ -10,6 +11,7 @@ buildscript { classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "com.alibaba:arouter-register:1.0.0" } } @@ -17,4 +19,4 @@ allprojects { repositories { jcenter() } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index c2f0526e..e54bd6cd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -27,6 +27,7 @@ TARGET_SDK_VERSION=25 arouter_compiler_version=1.1.4 arouter_api_version=1.2.4 arouter_annotation_version=1.0.4 +arouter_register_version=1.0.0 bintrayRepo=maven publishedGroupId=com.alibaba diff --git a/settings.gradle b/settings.gradle index 3121753f..5334938e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -4,4 +4,4 @@ include ':arouter-compiler' include ':arouter-annotation' include ':module-java' include ':module-kotlin' -include ':arouter-auto-register' \ No newline at end of file +include ':arouter-register' \ No newline at end of file