├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── src │ ├── huawei │ │ └── res │ │ │ ├── drawable-v24 │ │ │ └── ic_launcher_foreground.xml │ │ │ ├── drawable │ │ │ └── ic_launcher_background.xml │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ └── strings.xml │ └── main │ │ ├── AndroidManifest.xml │ │ ├── java │ │ └── com │ │ │ └── android │ │ │ └── androidplugin │ │ │ ├── ASMByte.java │ │ │ ├── MainActivity.java │ │ │ └── TestActivity.java │ │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_main.xml │ │ └── activity_test.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-night │ │ └── themes.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── themes.xml └── version.xml ├── build.gradle ├── buildSrc ├── .gitignore ├── build.gradle ├── copyTask.txt └── src │ └── main │ ├── copyTaskOk.txt │ ├── groovy │ └── com │ │ └── wj │ │ └── global │ │ ├── gradle │ │ ├── GlobalGradleProject.groovy │ │ ├── PrintKotlin.kt │ │ └── TemplateTask.java │ │ ├── log │ │ └── SystemOutPrint.java │ │ └── task │ │ └── TemplateOutTask.java │ ├── resources │ └── META-INF │ │ └── gradle-plugins │ │ └── global.gradle.properties │ └── synctest │ ├── copyTask.txt │ └── syncexist.txt ├── firstplugin ├── .gitignore ├── build.gradle └── src │ └── main │ ├── groovy │ └── com │ │ └── wj │ │ └── plugin │ │ ├── FirstPluginProject.groovy │ │ ├── SystemOutPrint.java │ │ ├── extension │ │ ├── AndroidExtension.java │ │ ├── TemplateSettingExtension.java │ │ └── TemplateSettingExtensionInProject.java │ │ ├── task │ │ ├── HandleTemplateTask.java │ │ └── HandleTemplateTaskInProject.java │ │ └── transform │ │ └── HotTransform.java │ └── resources │ └── META-INF │ └── gradle-plugins │ └── com.wj.firstplugin.properties ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── local.properties ├── manifestplugin ├── .gitignore ├── build.gradle └── src │ └── main │ ├── groovy │ └── com │ │ └── wj │ │ └── manifest │ │ ├── ManifestExtension.groovy │ │ ├── ManifestProject.groovy │ │ ├── task │ │ ├── AddExportForPackageManifestTask.groovy │ │ └── SetLatestVersionForMergedManifestTask.groovy │ │ └── utils │ │ └── SystemPrint.java │ ├── kotlin │ └── com │ │ └── wj │ │ └── manifest │ │ ├── ManifestExtensionByKotlin.kt │ │ ├── ManifestProjectByKotlin.kt │ │ └── SystemPrintByKotlin.kt │ └── resources │ └── META-INF │ └── gradle-plugins │ └── com.wj.plugin.manifest.properties ├── plugins └── com │ ├── android │ └── wj │ │ └── plugins │ │ └── DebugPlugin │ │ ├── 1.0.0 │ │ ├── DebugPlugin-1.0.0.jar │ │ ├── DebugPlugin-1.0.0.jar.md5 │ │ ├── DebugPlugin-1.0.0.jar.sha1 │ │ ├── DebugPlugin-1.0.0.pom │ │ ├── DebugPlugin-1.0.0.pom.md5 │ │ └── DebugPlugin-1.0.0.pom.sha1 │ │ ├── maven-metadata.xml │ │ ├── maven-metadata.xml.md5 │ │ └── maven-metadata.xml.sha1 │ └── wj │ └── plugin │ ├── firstplugin │ ├── 1.0.0 │ │ ├── firstplugin-1.0.0-classifiter.jar │ │ ├── firstplugin-1.0.0-classifiter.jar.md5 │ │ ├── firstplugin-1.0.0-classifiter.jar.sha1 │ │ ├── firstplugin-1.0.0.jar │ │ ├── firstplugin-1.0.0.jar.md5 │ │ ├── firstplugin-1.0.0.jar.sha1 │ │ ├── firstplugin-1.0.0.pom │ │ ├── firstplugin-1.0.0.pom.md5 │ │ └── firstplugin-1.0.0.pom.sha1 │ ├── maven-metadata.xml │ ├── maven-metadata.xml.md5 │ └── maven-metadata.xml.sha1 │ └── manifestplugin │ ├── 1.0.0 │ ├── manifestplugin-1.0.0.jar │ ├── manifestplugin-1.0.0.jar.md5 │ ├── manifestplugin-1.0.0.jar.sha1 │ ├── manifestplugin-1.0.0.pom │ ├── manifestplugin-1.0.0.pom.md5 │ └── manifestplugin-1.0.0.pom.sha1 │ ├── maven-metadata.xml │ ├── maven-metadata.xml.md5 │ └── maven-metadata.xml.sha1 ├── settings.gradle ├── testcopy.txt └── wjplugin ├── .gitignore ├── build.gradle └── src └── main ├── groovy └── com │ └── android │ └── wj │ └── debug │ ├── WjDebugPluginProject.groovy │ ├── autologvisitor │ ├── AutoLogAdviceAdapter.java │ ├── AutoLogClassVisitor.java │ └── AutoLogFieldVistor.java │ ├── autotransform │ └── AutoLogTransform.java │ └── utils │ └── SystemOutPrintln.java └── resources └── META-INF └── gradle-plugins └── com.android.wj.debug.properties /.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | /.idea/* 3 | /.gradle/* -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidPlugin 2 | 用来学习Android Gradle Plugin 3 | 4 | https://github.com/wenjing-bonnie/GradlePlugin这个工程里面相对更好些。 5 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'com.android.application' 3 | //Mobpush sdk验证 'com.wj.plugin.manifest'可以为AndroidManifest添加android:export属性 4 | //TODO id 'com.mob.sdk' 5 | //TODO 暂时隐藏学习的时候创建的第一个插件,使用wjplugin添加一个有具体功能的插件 6 | //id 'com.wj.firstplugin' 7 | //id 'global.gradle' 8 | //TODO 暂时隐藏字节码插件 id 'com.android.wj.debug' 9 | id 'com.wj.plugin.manifest' 10 | 11 | } 12 | ///**'com.wj.plugin.manifest'*/ 13 | ManifestPlugin { 14 | versionFile = file("version.xml") 15 | } 16 | 17 | android { 18 | compileSdkVersion 31 19 | buildToolsVersion "30.0.3" 20 | 21 | defaultConfig { 22 | applicationId "com.android.androidplugin" 23 | minSdkVersion 23 24 | targetSdkVersion 31 25 | versionCode 1 26 | versionName "1.0" 27 | 28 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 29 | 30 | multiDexEnabled true 31 | } 32 | 33 | buildTypes { 34 | release { 35 | minifyEnabled false 36 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 37 | } 38 | } 39 | //特色产品:同一套代码生产出不同特色的产品 40 | flavorDimensions "channel" 41 | productFlavors { 42 | 43 | huawei { 44 | manifestPlaceholders = [CHANNEL: "huawei"] 45 | dimension = "channel" 46 | buildConfigField("String", "CHANNEL", "\"huawei\"") 47 | } 48 | 49 | oppo { 50 | manifestPlaceholders = [CHANNEL: "oppo"] 51 | dimension = "channel" 52 | buildConfigField("String", "CHANNEL", "\"oppo\"") 53 | } 54 | 55 | xiaomi { 56 | manifestPlaceholders = [CHANNEL: "xiaomi"] 57 | dimension = "channel" 58 | buildConfigField("String", "CHANNEL", "\"xiaomi\"") 59 | } 60 | } 61 | } 62 | 63 | def prefix = "@@@@@@@@@@@@@@ app @@@@@@@@@@@@@ " 64 | 65 | 66 | /*this.afterEvaluate { 67 | //当前variant的类型为application类型 68 | this.android.applicationVariants.all { ApplicationVariant variant -> 69 | println(prefix + "name = " + variant.name) 70 | //得到每个variant中的task,然后进行对Task进行hook 71 | variant.getAssembleProvider().get().doFirst { 72 | println(prefix + " assemble task do first ") 73 | } 74 | //修改每个variant的输出的apk的名字 75 | variant.outputs.all { // output -> 76 | println(prefix + "name = " + outputFileName) 77 | String newApk = "app-${variant.baseName}-${variant.versionName}.apk" 78 | println(prefix + "newApkName = " + newApk) 79 | //outputFileName = newApk 80 | } 81 | 82 | } 83 | }*/ 84 | 85 | //自定义Task 86 | task firstTask { 87 | //创建一个Action,添加到Action列表的头部 88 | doFirst { 89 | println(prefix + "firstTask do first") 90 | } 91 | // println(prefix + "firstTask ") 92 | //创建一个Action,添加到Action列表到尾部 93 | // doLast { 94 | // println(prefix + "firstTask do last") 95 | // } 96 | } 97 | 98 | task("secondTask") { 99 | // println(prefix + "secondTask by (string) ") 100 | } 101 | 102 | task(thirdTask) { 103 | // println(prefix + "thirdTask by () ") 104 | } 105 | 106 | //可以设置thirdTask是否执行 107 | //thirdTask.enabled true 108 | 109 | //方法一:在该project配置完成之后,在preBuild之前添加这些自定义的Task 110 | //this.afterEvaluate { 111 | // getTasks().matching { 112 | // it.name.equals("preBuild") 113 | // }.each { 114 | // it.dependsOn(firstTask, secondTask, thirdTask) 115 | // } 116 | //} 117 | //方法二:直接从tasks的找到preBuild这个task即可 118 | tasks.preBuild.dependsOn(firstTask, secondTask, thirdTask) 119 | 120 | //TODO 暂时隐藏学习的时候创建的第一个插件,使用wjplugin添加一个有具体功能的插件 121 | //自定义firstplugin插件中的输入属性的设置 122 | /*templateSettingExtension { 123 | compileSdk = "1.0.0" 124 | interfaceSourceDir = file("src/main/java/mvp") 125 | } 126 | templateSettingExtensionInProject { 127 | compileSdk = "1.0.0" 128 | interfaceSourceDir = file("src/main/java/mvp") 129 | } 130 | 131 | //自定义firstplugin插件多层闭包的属性扩展 132 | androidExtension { 133 | compileSdkVersion = "1.0.0" 134 | buildToolsVersion = "29.0.0" 135 | 136 | defaultConfig { 137 | applicationId = "1.0.0" 138 | //minSdkVersion = "3.0.0" 139 | } 140 | 141 | buildTypes { 142 | dev { 143 | //A problem occurred evaluating project ':app'. 144 | //> No signature of method: build_dwrb2icq269nomqcc24dytwa1.androidExtension() is applicable for argument types: (build_dwrb2icq269nomqcc24dytwa1$_run_closure7) values: [build_dwrb2icq269nomqcc24dytwa1$_run_closure7@4ddf3c7] 145 | //signingConfig false 146 | signingConfig = true 147 | } 148 | 149 | } 150 | }*/ 151 | 152 | configurations { 153 | firstConfiguration { 154 | description("This is the first configuration") 155 | 156 | } 157 | } 158 | dependencies { 159 | 160 | implementation 'androidx.appcompat:appcompat:1.2.0' 161 | implementation 'com.google.android.material:material:1.2.1' 162 | implementation 'androidx.constraintlayout:constraintlayout:2.0.1' 163 | testImplementation 'junit:junit:4.+' 164 | androidTestImplementation 'androidx.test.ext:junit:1.1.2' 165 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' 166 | 167 | firstConfiguration 'androidx.appcompat:appcompat:1.2.0' 168 | } 169 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile -------------------------------------------------------------------------------- /app/src/huawei/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/huawei/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/huawei/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenjing-bonnie/AndroidPlugin/1d2216d0b6b335ff4fd5645b3d653f736d7fe402/app/src/huawei/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/huawei/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenjing-bonnie/AndroidPlugin/1d2216d0b6b335ff4fd5645b3d653f736d7fe402/app/src/huawei/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/huawei/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenjing-bonnie/AndroidPlugin/1d2216d0b6b335ff4fd5645b3d653f736d7fe402/app/src/huawei/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/huawei/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenjing-bonnie/AndroidPlugin/1d2216d0b6b335ff4fd5645b3d653f736d7fe402/app/src/huawei/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/huawei/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wenjing-bonnie/AndroidPlugin/1d2216d0b6b335ff4fd5645b3d653f736d7fe402/app/src/huawei/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /app/src/huawei/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | HuaweiPlugin 3 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/androidplugin/ASMByte.java: -------------------------------------------------------------------------------- 1 | package com.android.androidplugin; 2 | 3 | import android.util.Log; 4 | import android.view.View; 5 | 6 | /** 7 | * Created by wenjing.liu on 2021/8/6 in J1. 8 | *

9 | * 用来学习字节码的测试文件 10 | * 11 | * @author wenjing.liu 12 | */ 13 | public class ASMByte implements View.OnClickListener { 14 | private int a = 10; 15 | private static int c = 20; 16 | private String name; 17 | 18 | private int sum(int aa, int bb) { 19 | long beginTime = System.currentTimeMillis(); 20 | System.out.println("Other running code"); 21 | long callTime = System.currentTimeMillis() - beginTime; 22 | Log.d("AUTO", String.format("cost time is [%d]ms", callTime)); 23 | return aa + bb; 24 | } 25 | 26 | @Override 27 | public void onClick(View v) { 28 | 29 | // Log.d(getClass().getSimpleName(), String.format("%s cost time is [%l]ms", name, callTime)); 30 | 31 | 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/android/androidplugin/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.androidplugin; 2 | 3 | import android.app.Activity; 4 | import android.content.pm.ApplicationInfo; 5 | import android.content.pm.PackageManager; 6 | import android.graphics.Color; 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | import android.widget.TextView; 11 | 12 | import java.util.HashMap; 13 | 14 | public class MainActivity extends Activity { 15 | private TextView tvInfo; 16 | 17 | @Override 18 | protected void onCreate(Bundle savedInstanceState) { 19 | super.onCreate(savedInstanceState); 20 | setContentView(R.layout.activity_main); 21 | tvInfo = findViewById(R.id.tv_info); 22 | setInfoText("The channel is " + getChannelFromAndroidManifest() + " , " + BuildConfig.CHANNEL, null); 23 | } 24 | 25 | private void setInfoText(String info, int[] nums) { 26 | tvInfo.setText(info); 27 | } 28 | 29 | public void btnOnClick(View view) { 30 | tvInfo.setTextColor(Color.RED); 31 | } 32 | 33 | /** 34 | * 获取meta-data中的channel 35 | * 36 | * @return 37 | */ 38 | private String getChannelFromAndroidManifest() { 39 | String metaChannel = ""; 40 | try { 41 | ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA); 42 | if (info == null || info.metaData == null) { 43 | return metaChannel; 44 | } 45 | metaChannel = info.metaData.getString("channel"); 46 | } catch (PackageManager.NameNotFoundException e) { 47 | } 48 | return metaChannel; 49 | } 50 | 51 | 52 | private int sum(int a, int b) { 53 | Log.d(this.getClass().getSimpleName(),""+a); 54 | return a + b; 55 | } 56 | 57 | } -------------------------------------------------------------------------------- /app/src/main/java/com/android/androidplugin/TestActivity.java: -------------------------------------------------------------------------------- 1 | package com.android.androidplugin; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | public class TestActivity extends Activity { 7 | 8 | @Override 9 | protected void onCreate(Bundle savedInstanceState) { 10 | super.onCreate(savedInstanceState); 11 | setContentView(R.layout.activity_test); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 14 | 15 |