From 55c3fc2eb9344eb3278b2690b32488d8a200adaa Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Fri, 8 Mar 2019 17:46:44 +0800 Subject: [PATCH 001/173] see 03/08 log --- CHANGELOG.md | 1 + config.gradle | 17 ++++++------- gradle.properties | 4 ++- .../com/blankj/launcher/pkg/MainActivity.kt | 2 +- .../pkg/src/main/res/layout/activity_main.xml | 18 ++++++------- lib/base/build.gradle | 6 ++--- .../java/com/blankj/lib/base/BaseActivity.kt | 2 +- .../com/blankj/lib/base/BaseApplication.kt | 2 +- .../com/blankj/lib/base/BaseDrawerActivity.kt | 6 ++--- .../java/com/blankj/lib/base/BaseFragment.kt | 6 ++--- .../blankj/lib/base/rv/BaseViewHolder.java | 4 +-- .../lib/base/rv/RecycleViewDivider.java | 10 ++++---- .../lib/base/rv/adapter/BaseAdapter.java | 6 ++--- .../lib/base/rv/adapter/SingleAdapter.java | 2 +- .../src/main/res/layout/activity_back.xml | 14 +++++------ .../src/main/res/layout/activity_drawer.xml | 6 ++--- subutil/lib/build.gradle | 6 ++--- .../blankj/subutil/util/LocationUtils.java | 2 +- .../com/blankj/subutil/util/PinyinUtils.java | 2 +- .../java/com/blankj/subutil/util/Utils.java | 4 +-- .../blankj/subutil/pkg/helper/DialogHelper.kt | 2 +- utilcode/lib/build.gradle | 8 +++--- utilcode/lib/project.properties | 2 +- .../utilcode/constant/MemoryConstants.java | 2 +- .../constant/PermissionConstants.java | 2 +- .../utilcode/constant/TimeConstants.java | 2 +- .../blankj/utilcode/util/ActivityUtils.java | 9 ++++--- .../blankj/utilcode/util/AntiShakeUtils.java | 5 ++-- .../com/blankj/utilcode/util/AppUtils.java | 5 ++-- .../com/blankj/utilcode/util/BarUtils.java | 11 ++++---- .../blankj/utilcode/util/BrightnessUtils.java | 5 ++-- .../utilcode/util/CacheDiskStaticUtils.java | 3 ++- .../blankj/utilcode/util/CacheDiskUtils.java | 3 ++- .../utilcode/util/CacheDoubleStaticUtils.java | 3 ++- .../utilcode/util/CacheDoubleUtils.java | 2 +- .../utilcode/util/CacheMemoryStaticUtils.java | 2 +- .../utilcode/util/CacheMemoryUtils.java | 4 +-- .../com/blankj/utilcode/util/ColorUtils.java | 12 ++++----- .../com/blankj/utilcode/util/CrashUtils.java | 4 +-- .../com/blankj/utilcode/util/DeviceUtils.java | 4 +-- .../blankj/utilcode/util/FragmentUtils.java | 21 ++++++++-------- .../com/blankj/utilcode/util/ImageUtils.java | 14 +++++------ .../com/blankj/utilcode/util/IntentUtils.java | 4 +-- .../com/blankj/utilcode/util/LogUtils.java | 8 +++--- .../blankj/utilcode/util/MetaDataUtils.java | 2 +- .../blankj/utilcode/util/NetworkUtils.java | 2 +- .../utilcode/util/NotificationUtils.java | 6 ++--- .../com/blankj/utilcode/util/ObjectUtils.java | 6 ++--- .../blankj/utilcode/util/PermissionUtils.java | 8 +++--- .../com/blankj/utilcode/util/PhoneUtils.java | 2 +- .../blankj/utilcode/util/ProcessUtils.java | 4 +-- .../com/blankj/utilcode/util/RegexUtils.java | 2 +- .../blankj/utilcode/util/ResourceUtils.java | 2 +- .../blankj/utilcode/util/SPStaticUtils.java | 2 +- .../com/blankj/utilcode/util/SPUtils.java | 2 +- .../com/blankj/utilcode/util/ScreenUtils.java | 5 ++-- .../blankj/utilcode/util/SnackbarUtils.java | 14 +++++------ .../com/blankj/utilcode/util/SpanUtils.java | 16 ++++++------ .../com/blankj/utilcode/util/StringUtils.java | 4 +-- .../com/blankj/utilcode/util/ThreadUtils.java | 7 +++--- .../com/blankj/utilcode/util/TimeUtils.java | 2 +- .../com/blankj/utilcode/util/ToastUtils.java | 10 ++++---- .../com/blankj/utilcode/util/UriUtils.java | 25 +++++++++++++------ .../java/com/blankj/utilcode/util/Utils.java | 2 +- .../blankj/utilcode/util/VibrateUtils.java | 2 +- .../blankj/utilcode/util/ObjectUtilsTest.java | 5 ++-- .../pkg/feature/activity/ActivityActivity.kt | 2 +- .../feature/activity/SubActivityActivity.kt | 2 +- .../feature/bar/BarStatusFragmentActivity.kt | 16 ++++++------ .../pkg/feature/fragment/ContainerFragment.kt | 6 ++--- .../pkg/feature/fragment/FragmentActivity.kt | 6 ++--- .../pkg/feature/image/ImageActivity.kt | 8 +++--- .../pkg/feature/snackbar/SnackbarActivity.kt | 2 +- .../utilcode/pkg/feature/span/SpanActivity.kt | 2 +- .../utilcode/pkg/feature/toast/CustomToast.kt | 2 +- .../pkg/feature/toast/ToastActivity.kt | 2 +- .../utilcode/pkg/helper/DialogHelper.kt | 2 +- .../main/res/layout/activity_adaptscreen.xml | 4 +-- .../res/layout/activity_adaptscreen_close.xml | 4 +-- .../layout/activity_adaptscreen_height.xml | 4 +-- .../res/layout/activity_adaptscreen_width.xml | 4 +-- .../layout/activity_bar_status_fragment.xml | 4 +-- .../src/main/res/layout/activity_fragment.xml | 2 +- .../src/main/res/layout/activity_image.xml | 2 +- 84 files changed, 241 insertions(+), 220 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8271c33548..a1706be701 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/03/09` [fix] UriUtils#uri2File. * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7. * `19/03/02` [fix] LogUtils#file. * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6. diff --git a/config.gradle b/config.gradle index 57c3d35e99..106f066059 100644 --- a/config.gradle +++ b/config.gradle @@ -2,7 +2,7 @@ ext { applicationId = 'com.blankj.androidutilcode' appName = 'Util' - compileSdkVersion = 27 + compileSdkVersion = 28 minSdkVersion = 14 targetSdkVersion = 27 versionCode = 1_023_007 @@ -16,8 +16,8 @@ ext { // lib version kotlin_version = '1.3.0' - support_version = '27.1.1' leakcanary_version = '1.6.3' + androidx_version = '1.0.0' dep = [ plugin : [ @@ -30,19 +30,18 @@ ext { ], // lib - support : [ - appcompat_v7: "com.android.support:appcompat-v7:$support_version", - design : "com.android.support:design:$support_version", - multidex : "com.android.support:multidex:1.0.2", - ], - constraint : "com.android.support.constraint:constraint-layout:1.1.3", + appcompat : "androidx.appcompat:appcompat:$androidx_version", + design : "com.google.android.material:material:$androidx_version", + multidex : "androidx.multidex:multidex:2.0.1", + constraint : "androidx.constraintlayout:constraintlayout:1.1.3", + kotlin : "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version", leakcanary : [ android : "com.squareup.leakcanary:leakcanary-android:$leakcanary_version", android_no_op : "com.squareup.leakcanary:leakcanary-android-no-op:$leakcanary_version", support_fragment: "com.squareup.leakcanary:leakcanary-support-fragment:$leakcanary_version" ], - free_proguard: "com.blankj:free-proguard:0.0.7", + free_proguard: "com.blankj:free-proguard:0.0.12", adapt_screen : "com.blankj:adapt-screen:0.0.3", gson : "com.google.code.gson:gson:2.8.2", diff --git a/gradle.properties b/gradle.properties index e98b0a89fc..ad5471a961 100644 --- a/gradle.properties +++ b/gradle.properties @@ -17,4 +17,6 @@ # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true -#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 \ No newline at end of file +#org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005 +android.enableJetifier=true +android.useAndroidX=true \ No newline at end of file diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt index 27d29a032a..e6dc516ed6 100644 --- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt +++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt @@ -2,7 +2,7 @@ package com.blankj.launcher.pkg import android.graphics.Color import android.os.Bundle -import android.support.v7.app.ActionBarDrawerToggle +import androidx.appcompat.app.ActionBarDrawerToggle import android.view.View import android.widget.ImageView import com.blankj.lib.base.BaseDrawerActivity diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml index 3b31dafe32..ee8b62a6fa 100644 --- a/launcher/pkg/src/main/res/layout/activity_main.xml +++ b/launcher/pkg/src/main/res/layout/activity_main.xml @@ -1,17 +1,17 @@ - - - - - - + + - @@ -69,5 +69,5 @@ android:text="@string/sub_util" /> - - + + diff --git a/lib/base/build.gradle b/lib/base/build.gradle index bd369d23ee..8c6cb29835 100644 --- a/lib/base/build.gradle +++ b/lib/base/build.gradle @@ -7,9 +7,9 @@ dependencies { api project(':utilcode-lib') api project(':subutil-lib') - api dep.support.appcompat_v7 - api dep.support.design - api dep.support.multidex + api dep.appcompat + api dep.design + api dep.multidex api dep.constraint api dep.kotlin api dep.free_proguard diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt index deb05718a9..b1b3086f14 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Activity import android.os.Bundle -import android.support.v7.app.AppCompatActivity +import androidx.appcompat.app.AppCompatActivity import android.view.LayoutInflater import android.view.View import com.blankj.utilcode.util.AntiShakeUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt index f3eb078f79..873c71fa49 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.kt @@ -2,7 +2,7 @@ package com.blankj.lib.base import android.app.Application import android.content.Context -import android.support.multidex.MultiDex +import androidx.multidex.MultiDex import com.blankj.utilcode.util.AppUtils import com.blankj.utilcode.util.CrashUtils import com.blankj.utilcode.util.LogUtils diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt index a29cc60cc8..3514d2fdd3 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.kt @@ -2,8 +2,8 @@ package com.blankj.lib.base import android.content.Intent import android.net.Uri -import android.support.annotation.StringRes -import android.support.v4.widget.DrawerLayout +import androidx.annotation.StringRes +import androidx.drawerlayout.widget.DrawerLayout import android.view.LayoutInflater import android.widget.FrameLayout import com.blankj.utilcode.util.ActivityUtils @@ -20,7 +20,7 @@ import kotlinx.android.synthetic.main.activity_drawer.* */ abstract class BaseDrawerActivity : BaseActivity() { - protected lateinit var mBaseDrawerRootLayout: DrawerLayout + protected lateinit var mBaseDrawerRootLayout: androidx.drawerlayout.widget.DrawerLayout protected lateinit var mBaseDrawerContainerView: FrameLayout override fun isSwipeBack(): Boolean { diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt index 42e7073529..3db893bea2 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt +++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.kt @@ -3,8 +3,8 @@ package com.blankj.lib.base import android.app.Activity import android.content.Context import android.os.Bundle -import android.support.annotation.IdRes -import android.support.v4.app.Fragment +import androidx.annotation.IdRes +import androidx.fragment.app.Fragment import android.util.Log import android.view.LayoutInflater import android.view.View @@ -19,7 +19,7 @@ import com.blankj.utilcode.util.AntiShakeUtils * desc : base about v4-fragment * ``` */ -abstract class BaseFragment : Fragment(), IBaseView { +abstract class BaseFragment : androidx.fragment.app.Fragment(), IBaseView { companion object { private const val TAG = "BaseFragment" diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java index ee47e751f5..6441f8c1fd 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java @@ -1,7 +1,7 @@ package com.blankj.lib.base.rv; -import android.support.annotation.IdRes; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.IdRes; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java index 3d2b90f302..dd20894e10 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java @@ -5,11 +5,11 @@ import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; -import android.support.annotation.DrawableRes; -import android.support.annotation.NonNull; -import android.support.v4.content.ContextCompat; -import android.support.v4.view.ViewCompat; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.DrawableRes; +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.RecyclerView; import android.view.View; import android.widget.LinearLayout; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java index f5acee0bb3..b8cf5ae12d 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/BaseAdapter.java @@ -1,9 +1,9 @@ package com.blankj.lib.base.rv.adapter; import android.content.Context; -import android.support.annotation.LayoutRes; -import android.support.annotation.NonNull; -import android.support.v7.widget.RecyclerView; +import androidx.annotation.LayoutRes; +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java index 619c8fc688..b7e81b892b 100644 --- a/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java +++ b/lib/base/src/main/java/com/blankj/lib/base/rv/adapter/SingleAdapter.java @@ -1,6 +1,6 @@ package com.blankj.lib.base.rv.adapter; -import android.support.annotation.LayoutRes; +import androidx.annotation.LayoutRes; import java.util.List; diff --git a/lib/base/src/main/res/layout/activity_back.xml b/lib/base/src/main/res/layout/activity_back.xml index 5747922950..848cc885fe 100644 --- a/lib/base/src/main/res/layout/activity_back.xml +++ b/lib/base/src/main/res/layout/activity_back.xml @@ -1,26 +1,26 @@ - - - - + - - - + + diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml index 1fec3fc953..697e83f643 100644 --- a/lib/base/src/main/res/layout/activity_drawer.xml +++ b/lib/base/src/main/res/layout/activity_drawer.xml @@ -1,5 +1,5 @@ - - - + diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle index a8b9264e6c..8f8aa8198f 100644 --- a/subutil/lib/build.gradle +++ b/subutil/lib/build.gradle @@ -1,7 +1,7 @@ apply { from "${rootDir.path}/config_lib.gradle" - plugin "tech.harmonysoft.oss.traute" +// plugin "tech.harmonysoft.oss.traute" plugin "com.github.dcendents.android-maven" plugin "com.jfrog.bintray" plugin "readme-sub" @@ -13,8 +13,8 @@ readme { } dependencies { - compileOnly dep.support.appcompat_v7 - compileOnly dep.support.design + compileOnly dep.appcompat + compileOnly dep.design api(dep.glide) { exclude group: "com.android.support" } diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java index 7ee8747902..0c177b534c 100755 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java @@ -11,7 +11,7 @@ import android.location.LocationProvider; import android.os.Bundle; import android.provider.Settings; -import android.support.annotation.RequiresPermission; +import androidx.annotation.RequiresPermission; import android.util.Log; import java.io.IOException; diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java index 22486b3a91..934408c65e 100644 --- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java +++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java @@ -1,6 +1,6 @@ package com.blankj.subutil.util; -import android.support.v4.util.SimpleArrayMap; +import androidx.collection.SimpleArrayMap; /** *
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.subutil.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import com.blankj.subutil.pkg.R
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index 3570124816..41b0dacaa4 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -1,7 +1,7 @@
 apply {
     from "${rootDir.path}/config_lib.gradle"
 
-    plugin "tech.harmonysoft.oss.traute"
+//    plugin "tech.harmonysoft.oss.traute"
     plugin "com.github.dcendents.android-maven"
     plugin "com.jfrog.bintray"
     plugin "readme-core"
@@ -17,10 +17,10 @@ apply from: "${rootDir.path}/gradle/bintrayUploadAndroid.gradle"
 dependencies {
     compile dep.gson
 
-    compileOnly dep.support.appcompat_v7
-    compileOnly dep.support.design
+    compileOnly dep.appcompat
+    compileOnly dep.design
 
     testImplementation dep.junit
     testImplementation dep.robolectric
-    testImplementation dep.support.appcompat_v7
+    testImplementation dep.appcompat
 }
\ No newline at end of file
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d0f2a3f7e0 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,7 +1,7 @@
 #project
 project.name=UtilCode
 project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index 4b8a9a07b5..9dd16d6e48 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,15 +10,16 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
 import android.util.Log;
 import android.view.View;
 
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.View;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index 136f27b5ed..357c423fc6 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.File;
@@ -27,6 +25,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
@@ -27,6 +22,12 @@
 
 import java.lang.reflect.Method;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import static android.Manifest.permission.EXPAND_STATUS_BAR;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.Window;
 import android.view.WindowManager;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 99aef6b078..2e6637febf 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,7 +8,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
 import com.blankj.utilcode.constant.CacheConstants;
@@ -37,6 +36,8 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
 import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 9ef930c467..a096321cf4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index c1c2c3c76e..d0c1788a02 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -8,8 +8,8 @@
 import android.os.Build;
 import android.os.PowerManager;
 import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
 import android.text.TextUtils;
 
 import java.io.File;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.View;
 
@@ -20,6 +10,17 @@
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
 import android.renderscript.Element;
 import android.renderscript.RenderScript;
 import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.view.View;
 
 import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index e1e2e78600..f5d814207d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -12,10 +12,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
 import android.util.Log;
 
 import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index f281d777c2..3171837f46 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,7 +7,7 @@
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.format.Formatter;
 import android.util.Log;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
 package com.blankj.utilcode.util;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index 235a0f3f94..1cb3df0156 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -10,10 +10,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index 7db75522d9..00c2bf6f73 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 import com.blankj.utilcode.constant.RegexConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 92424163bb..ee41e95958 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
 
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index c3e089a90f..f55e4a21db 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -7,12 +7,11 @@
 import android.content.res.Configuration;
 import android.content.res.Resources;
 import android.graphics.Bitmap;
-import android.graphics.Canvas;
 import android.graphics.Point;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.DisplayMetrics;
 import android.view.Surface;
 import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index 641204fd63..d79cf9262b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
 package com.blankj.utilcode.util;
 
 import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index ba7122e366..819af790e8 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,9 +2,6 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.util.Log;
 import android.util.SparseArray;
 
@@ -21,6 +18,10 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.TimeConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index b4fe658945..b25360e52c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -14,11 +14,11 @@
 import android.os.Handler;
 import android.os.Looper;
 import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 98f3ef66a8..8e4fd9d09c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
 import android.os.Environment;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.io.File;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
@@ -70,12 +72,19 @@ public static File uri2File(@NonNull final Uri uri) {
                 Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
                 return null;
             } else if ("com.android.providers.downloads.documents".equals(authority)) {
-                final String id = DocumentsContract.getDocumentId(uri);
-                final Uri contentUri = ContentUris.withAppendedId(
-                        Uri.parse("content://downloads/public_downloads"),
-                        Long.valueOf(id)
-                );
-                return getFileFromUri(contentUri, 2);
+                String id = DocumentsContract.getDocumentId(uri);
+                if (!TextUtils.isEmpty(id)) {
+                    if (id.startsWith("raw:")) {
+                        return new File(id.substring(4));
+                    }
+                    final Uri contentUri = ContentUris.withAppendedId(
+                            Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+                            Long.valueOf(id)
+                    );
+                    return getFileFromUri(contentUri, 2);
+                }
+                Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+                return null;
             } else if ("com.android.providers.media.documents".equals(authority)) {
                 final String docId = DocumentsContract.getDocumentId(uri);
                 final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index 52b82376e1..d858e4ad22 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -7,7 +7,7 @@
 import android.app.Application.ActivityLifecycleCallbacks;
 import android.content.Context;
 import android.os.Bundle;
-import android.support.v4.content.FileProvider;
+import androidx.core.content.FileProvider;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 
 import static android.Manifest.permission.VIBRATE;
 
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index 5ace21f5b1..f3d3600a27 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 4815032936..864f1c12b4 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
 
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index b2633ddf5c..0dac18c72c 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             R.id.barStatusFragmentNavigationCustom
     )
 
-    private val mFragmentList = ArrayList()
+    private val mFragmentList = ArrayList()
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
         when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
         mFragmentList.add(BarStatusCustomFragment.newInstance())
 
         barStatusFragmentVp.offscreenPageLimit = 3
-        barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
-            override fun getItem(position: Int): Fragment {
+        barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                 return mFragmentList[position]
             }
 
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             }
         }
 
-        barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+        barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
 
             override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ca0289a158..117c7d121e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
 
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
 import android.transition.*
 import android.view.View
 import com.blankj.lib.base.BaseLazyFragment
@@ -129,7 +129,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
         }
     }
 
-    private fun addSharedElement(fragment: Fragment): Fragment {
+    private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             fragment.sharedElementEnterTransition = DetailTransition()
             fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index b768f563e5..6e3137b9c6 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -30,7 +30,7 @@ class FragmentActivity : BaseActivity() {
         }
     }
 
-    private val mFragments = arrayListOf()
+    private val mFragments = arrayListOf()
     private var curIndex: Int = 0
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 496c5a4032..636d92c030 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,9 +6,9 @@ import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.LayoutRes
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
+import androidx.annotation.LayoutRes
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
 import android.view.View
 import android.widget.ImageView
 import android.widget.TextView
@@ -92,7 +92,7 @@ class ImageActivity : BaseActivity() {
         }
 
         imageRv.adapter = ImageAdapter(mList, R.layout.item_image)
-        imageRv.layoutManager = LinearLayoutManager(this)
+        imageRv.layoutManager = androidx.recyclerview.widget.LinearLayoutManager(this)
     }
 
     override fun doBusiness() {}
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index 4bd07d274e..34d3914fe1 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.View
 import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index f3a1a3ee02..7c5fd45308 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
 
 import android.os.Handler
 import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.widget.TextView
 import android.widget.Toast
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index ea6c10c24d..40055d14b9 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
 import android.view.Gravity
 import android.view.View
 import com.blankj.lib.base.BaseTitleBarActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 7e6094414a..c3247b1312 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import android.text.method.ScrollingMovementMethod
 import android.view.LayoutInflater
 import android.view.View
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 003c6f5840..e33848b84d 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index c3f88ecba3..e43cbb2bb5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.CloseAdaptActivity">
 
-    
 
@@ -42,6 +42,6 @@
             android:textSize="30pt"
             app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 0b207d97f5..07c76be55b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.HeightActivity">
 
-    
 
@@ -94,6 +94,6 @@
         
 
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 46e0f2f1a2..5a791d924f 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
     android:background="@color/white"
     tools:context=".feature.adaptScreen.WidthActivity">
 
-    
 
@@ -147,6 +147,6 @@
 
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index c5f975b58f..1a36770b58 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -7,7 +7,7 @@
     android:background="@color/white"
     android:orientation="vertical">
 
-    
 
-    
 
-    
 
-    

From 70b6089109b6e58734d0a500820f54cb41858eba Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 8 Mar 2019 18:07:14 +0800
Subject: [PATCH 002/173] see 03/08 log

---
 utilcode/README-CN.md | 3 +++
 utilcode/README.md    | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index f3756be966..7fc06ebf99 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 
diff --git a/utilcode/README.md b/utilcode/README.md
index 75d8757892..094cc44c08 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -3,6 +3,9 @@
 Gradle:
 ```groovy
 implementation 'com.blankj:utilcode:1.23.7'
+
+// if u use AndroidX, use the following
+implementation 'com.blankj:utilcodex:1.23.7'
 ```
 
 

From 2fa66306221456a5be12d9d201c7495958596fb4 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Mon, 11 Mar 2019 20:45:31 +0800
Subject: [PATCH 003/173] see 03/11 log

---
 utilcode/lib/project.properties | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index d0f2a3f7e0..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
 #project
-project.name=UtilCode
+project.name=UtilCodeX
 project.groupId=com.blankj
 project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
 #javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file

From 6b0ff9575675cf0ae15c9c9a85eb249b5591c3a8 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Mon, 3 Jun 2019 20:49:21 +0800
Subject: [PATCH 004/173] see 06/03 log

---
 .gitignore                                    |  2 +-
 CHANGELOG.md                                  |  1 +
 gradle.properties                             |  8 +++++-
 gradle/config/config.gradle                   | 10 ++++----
 gradle/config/configApp.gradle                |  5 +++-
 launcher/app/build.gradle                     |  6 ++---
 launcher/pkg/build.gradle                     |  2 +-
 .../com/blankj/launcher/pkg/MainActivity.kt   |  2 +-
 .../pkg/src/main/res/layout/activity_main.xml | 18 ++++++-------
 lib/base/build.gradle                         |  2 +-
 .../com/blankj/lib/base/BaseActivity.java     |  5 ++--
 .../com/blankj/lib/base/BaseApplication.java  |  3 ++-
 .../blankj/lib/base/BaseDrawerActivity.java   | 11 ++++----
 .../com/blankj/lib/base/BaseFragment.java     | 13 +++++-----
 .../blankj/lib/base/BaseTitleActivity.java    |  9 ++++---
 .../java/com/blankj/lib/base/IBaseView.java   |  5 ++--
 .../com/blankj/lib/base/rv/BaseAdapter.java   |  5 ++--
 .../java/com/blankj/lib/base/rv/BaseCell.java |  3 ++-
 .../blankj/lib/base/rv/BaseViewHolder.java    |  4 +--
 .../lib/base/rv/RecycleViewDivider.java       | 10 ++++----
 .../main/res/layout/activity_base_title.xml   | 11 ++++----
 .../activity_base_title_stub_scroll.xml       |  4 +--
 .../src/main/res/layout/activity_drawer.xml   |  6 ++---
 subutil/app/build.gradle                      |  2 +-
 subutil/lib/build.gradle                      |  2 +-
 .../blankj/subutil/util/LocationUtils.java    |  2 +-
 .../com/blankj/subutil/util/PinyinUtils.java  |  2 +-
 .../java/com/blankj/subutil/util/Utils.java   |  4 +--
 .../subutil/util/http/ExecutorFactory.java    |  3 ++-
 .../blankj/subutil/util/http/HttpUtils.java   |  3 ++-
 .../com/blankj/subutil/util/http/Request.java |  3 ++-
 .../blankj/subutil/util/http/SSLConfig.java   |  3 ++-
 subutil/pkg/build.gradle                      |  2 +-
 .../blankj/subutil/pkg/helper/DialogHelper.kt |  2 +-
 utilcode/README-CN.md                         |  2 +-
 utilcode/README.md                            |  2 +-
 utilcode/app/build.gradle                     |  2 +-
 utilcode/lib/build.gradle                     |  2 +-
 utilcode/lib/project.properties               |  6 ++---
 .../utilcode/constant/MemoryConstants.java    |  2 +-
 .../constant/PermissionConstants.java         |  2 +-
 .../utilcode/constant/TimeConstants.java      |  2 +-
 .../blankj/utilcode/util/ActivityUtils.java   | 11 ++++----
 .../blankj/utilcode/util/AntiShakeUtils.java  |  5 ++--
 .../com/blankj/utilcode/util/AppUtils.java    |  5 ++--
 .../com/blankj/utilcode/util/BarUtils.java    | 11 ++++----
 .../blankj/utilcode/util/BrightnessUtils.java |  5 ++--
 .../com/blankj/utilcode/util/BusUtils.java    |  5 ++--
 .../utilcode/util/CacheDiskStaticUtils.java   |  3 ++-
 .../blankj/utilcode/util/CacheDiskUtils.java  |  3 ++-
 .../utilcode/util/CacheDoubleStaticUtils.java |  3 ++-
 .../utilcode/util/CacheDoubleUtils.java       |  2 +-
 .../utilcode/util/CacheMemoryStaticUtils.java |  2 +-
 .../utilcode/util/CacheMemoryUtils.java       |  4 +--
 .../com/blankj/utilcode/util/ColorUtils.java  | 12 ++++-----
 .../com/blankj/utilcode/util/CrashUtils.java  |  4 +--
 .../com/blankj/utilcode/util/DeviceUtils.java |  5 ++--
 .../blankj/utilcode/util/FragmentUtils.java   | 21 ++++++++--------
 .../com/blankj/utilcode/util/ImageUtils.java  | 14 +++++------
 .../com/blankj/utilcode/util/IntentUtils.java |  4 +--
 .../blankj/utilcode/util/KeyboardUtils.java   |  3 ++-
 .../com/blankj/utilcode/util/LogUtils.java    |  8 +++---
 .../blankj/utilcode/util/MetaDataUtils.java   |  2 +-
 .../blankj/utilcode/util/NetworkUtils.java    |  5 ++--
 .../utilcode/util/NotificationUtils.java      |  6 ++---
 .../com/blankj/utilcode/util/ObjectUtils.java |  6 ++---
 .../blankj/utilcode/util/PermissionUtils.java |  8 +++---
 .../com/blankj/utilcode/util/PhoneUtils.java  |  2 +-
 .../blankj/utilcode/util/ProcessUtils.java    |  4 +--
 .../com/blankj/utilcode/util/RegexUtils.java  |  2 +-
 .../blankj/utilcode/util/ResourceUtils.java   |  2 +-
 .../blankj/utilcode/util/SPStaticUtils.java   |  2 +-
 .../com/blankj/utilcode/util/SPUtils.java     |  2 +-
 .../com/blankj/utilcode/util/ScreenUtils.java |  4 +--
 .../com/blankj/utilcode/util/ShellUtils.java  |  2 +-
 .../blankj/utilcode/util/SnackbarUtils.java   | 14 +++++------
 .../com/blankj/utilcode/util/SpanUtils.java   | 16 ++++++------
 .../com/blankj/utilcode/util/StringUtils.java |  4 +--
 .../com/blankj/utilcode/util/ThreadUtils.java |  5 ++--
 .../com/blankj/utilcode/util/TimeUtils.java   |  2 +-
 .../com/blankj/utilcode/util/ToastUtils.java  | 10 ++++----
 .../com/blankj/utilcode/util/UriUtils.java    | 25 +++++++++++++------
 .../java/com/blankj/utilcode/util/Utils.java  |  3 ++-
 .../blankj/utilcode/util/VibrateUtils.java    |  2 +-
 .../com/blankj/utilcode/util/BaseTest.java    | 11 +++-----
 .../blankj/utilcode/util/ObjectUtilsTest.java |  5 ++--
 utilcode/pkg/build.gradle                     |  2 +-
 .../pkg/feature/activity/ActivityActivity.kt  |  2 +-
 .../feature/activity/SubActivityActivity.kt   |  2 +-
 .../feature/bar/BarStatusFragmentActivity.kt  | 16 ++++++------
 .../pkg/feature/fragment/ContainerFragment.kt |  6 ++---
 .../pkg/feature/fragment/FragmentActivity.kt  |  6 ++---
 .../pkg/feature/image/ImageActivity.kt        |  4 +--
 .../pkg/feature/snackbar/SnackbarActivity.kt  |  2 +-
 .../utilcode/pkg/feature/span/SpanActivity.kt |  2 +-
 .../utilcode/pkg/feature/toast/CustomToast.kt |  2 +-
 .../pkg/feature/toast/ToastActivity.kt        |  2 +-
 .../utilcode/pkg/helper/DialogHelper.kt       |  5 ++--
 .../main/res/layout/activity_adaptscreen.xml  |  4 +--
 .../res/layout/activity_adaptscreen_close.xml |  4 +--
 .../layout/activity_adaptscreen_height.xml    |  7 +++---
 .../res/layout/activity_adaptscreen_width.xml |  4 +--
 .../layout/activity_bar_status_fragment.xml   |  4 +--
 .../src/main/res/layout/activity_fragment.xml |  2 +-
 .../src/main/res/layout/activity_image.xml    |  3 +--
 105 files changed, 293 insertions(+), 253 deletions(-)

diff --git a/.gitignore b/.gitignore
index 201b88771a..193619553c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,4 @@
 .externalNativeBuild
 /apk
 *.phrof
-/maven
+/busMaven
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 95dfb60cc3..9c48786e89 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
 * `19/04/24` [upd] The swipe panel.
 * `19/03/17` [fix] The ugly UI.
 * `19/03/14` [fix] AdaptScreenUtils didn't work on some HaWei tablet.
+* `19/03/09` [fix] UriUtils#uri2File.
 * `19/03/08` [add] LogUtils support multi process. Publish v1.23.7.
 * `19/03/02` [fix] LogUtils#file.
 * `19/02/28` [fix] ImageUtils#calculateInSampleSize. Publish v1.23.6.
diff --git a/gradle.properties b/gradle.properties
index 110f0cb7ef..c209c08b84 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -19,4 +19,10 @@
 
 #org.gradle.jvmargs=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
 
-org.gradle.jvmargs=-XX:MaxHeapSize=1024m -Xmx1024m
\ No newline at end of file
+org.gradle.jvmargs=-Xmx8192m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
+org.gradle.daemon=true
+org.gradle.configureondemand=true
+org.gradle.parallel=true
+
+android.enableJetifier=true
+android.useAndroidX=true
\ No newline at end of file
diff --git a/gradle/config/config.gradle b/gradle/config/config.gradle
index e455c4dba6..e8c793b6b3 100644
--- a/gradle/config/config.gradle
+++ b/gradle/config/config.gradle
@@ -5,7 +5,7 @@ gradle.ext {
     applicationId = 'com.blankj.androidutilcode'
     appName = 'Util'
 
-    compileSdkVersion = 27
+    compileSdkVersion = 28
     minSdkVersion = 14
     targetSdkVersion = 27
     versionCode = 1_024_000
@@ -13,8 +13,8 @@ gradle.ext {
 
     // lib version
     kotlin_version = '1.3.10'
-    support_version = '27.1.1'
     leakcanary_version = '1.6.3'
+    androidx_version = '1.0.0'
 
     dep = [:]
 
@@ -36,11 +36,11 @@ gradle.ext {
             subutil_lib                : new DepConfig(":subutil:lib"),
             subutil_pkg                : new DepConfig(":subutil:pkg"),
             utilcode_app               : new DepConfig(":utilcode:app"),
-            utilcode_lib               : new DepConfig(false, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
+            utilcode_lib               : new DepConfig(true, ":utilcode:lib", "com.blankj:utilcode:$versionName"),
             utilcode_pkg               : new DepConfig(":utilcode:pkg"),
 
-            support_appcompat_v7       : new DepConfig("com.android.support:appcompat-v7:$support_version"),
-            support_design             : new DepConfig("com.android.support:design:$support_version"),
+            support_appcompat_v7       : new DepConfig("androidx.appcompat:appcompat:$androidx_version"),
+            support_material           : new DepConfig("com.google.android.material:material:$androidx_version"),
             support_multidex           : new DepConfig("com.android.support:multidex:1.0.2"),
 
             constraint                 : new DepConfig("com.android.support.constraint:constraint-layout:1.1.3"),
diff --git a/gradle/config/configApp.gradle b/gradle/config/configApp.gradle
index cb8d5a290a..809cb07cd4 100644
--- a/gradle/config/configApp.gradle
+++ b/gradle/config/configApp.gradle
@@ -42,8 +42,11 @@ android {
     }
 
     dexOptions {
+        preDexLibraries true
         javaMaxHeapSize "8g"
         maxProcessCount 8
+        incremental true
+        dexInProcess = true
     }
 }
 
@@ -57,7 +60,7 @@ dependencies {
 
 private String getSuffix() {
     if (project.path == ":launcher:app") return ""
-    return project.path.replace(":" , "_").substring(0, project.path.length() - 4)
+    return project.path.replace(":", "_").substring(0, project.path.length() - 4)
 }
 
 def configSigning(Project pro) {
diff --git a/launcher/app/build.gradle b/launcher/app/build.gradle
index eb9f8d906f..bf68fb45ff 100644
--- a/launcher/app/build.gradle
+++ b/launcher/app/build.gradle
@@ -4,7 +4,7 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':launcher:pkg')
-    implementation project(':subutil:pkg')
-    implementation project(':utilcode:pkg')
+    implementation gradle.ext.dep.launcher_pkg
+    implementation gradle.ext.dep.subutil_pkg
+    implementation gradle.ext.dep.utilcode_pkg
 }
\ No newline at end of file
diff --git a/launcher/pkg/build.gradle b/launcher/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/launcher/pkg/build.gradle
+++ b/launcher/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
index 02491cd88d..0e9f0a8477 100644
--- a/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
+++ b/launcher/pkg/src/main/java/com/blankj/launcher/pkg/MainActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.launcher.pkg
 
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v7.app.ActionBarDrawerToggle
+import androidx.appcompat.app.ActionBarDrawerToggle
 import android.view.View
 import android.widget.ImageView
 import com.blankj.lib.base.BaseDrawerActivity
diff --git a/launcher/pkg/src/main/res/layout/activity_main.xml b/launcher/pkg/src/main/res/layout/activity_main.xml
index 3b31dafe32..ee8b62a6fa 100644
--- a/launcher/pkg/src/main/res/layout/activity_main.xml
+++ b/launcher/pkg/src/main/res/layout/activity_main.xml
@@ -1,17 +1,17 @@
 
-
 
-    
 
-        
 
-            
 
-        
-    
+        
+    
 
     
 
-    
@@ -69,5 +69,5 @@
                 android:text="@string/sub_util" />
 
         
-    
-
+    
+
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 370036c062..67f9762d82 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -8,7 +8,7 @@ dependencies {
     api gradle.ext.dep.subutil_lib
 
     api gradle.ext.dep.support_appcompat_v7
-    api gradle.ext.dep.support_design
+    api gradle.ext.dep.support_material
     api gradle.ext.dep.support_multidex
     api gradle.ext.dep.constraint
     api gradle.ext.dep.kotlin
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
index caae1d45cf..0c9d8fa419 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseActivity.java
@@ -3,11 +3,12 @@
 import android.annotation.SuppressLint;
 import android.app.Activity;
 import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.v7.app.AppCompatActivity;
 import android.view.LayoutInflater;
 import android.view.View;
 
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.AppCompatActivity;
+
 import com.blankj.swipepanel.SwipePanel;
 import com.blankj.utilcode.util.AntiShakeUtils;
 import com.blankj.utilcode.util.AppUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
index 1e0ddc0b27..5d2eba8260 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseApplication.java
@@ -2,7 +2,8 @@
 
 import android.app.Application;
 import android.content.Context;
-import android.support.multidex.MultiDex;
+
+import androidx.multidex.MultiDex;
 
 import com.blankj.utilcode.util.AppUtils;
 import com.blankj.utilcode.util.CrashUtils;
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
index c7f7f1daea..ec3c895f6e 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseDrawerActivity.java
@@ -3,17 +3,18 @@
 import android.annotation.SuppressLint;
 import android.content.Intent;
 import android.net.Uri;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.StringRes;
-import android.support.design.widget.NavigationView;
-import android.support.v4.widget.DrawerLayout;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.widget.FrameLayout;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.StringRes;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import com.blankj.utilcode.util.ActivityUtils;
 import com.blankj.utilcode.util.StringUtils;
+import com.google.android.material.navigation.NavigationView;
 
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
index 5667f3f02c..0e4e7ba5cc 100755
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseFragment.java
@@ -4,17 +4,18 @@
 import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
-import android.support.annotation.IdRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.IdRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentTransaction;
+
 import com.blankj.utilcode.util.AntiShakeUtils;
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
index a40230420d..e0ed3ed10a 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/BaseTitleActivity.java
@@ -1,16 +1,17 @@
 package com.blankj.lib.base;
 
 import android.annotation.SuppressLint;
-import android.support.annotation.LayoutRes;
-import android.support.design.widget.CoordinatorLayout;
-import android.support.v7.app.ActionBar;
-import android.support.v7.widget.Toolbar;
 import android.view.LayoutInflater;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.ViewStub;
 import android.widget.FrameLayout;
 
+import androidx.annotation.LayoutRes;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.widget.Toolbar;
+import androidx.coordinatorlayout.widget.CoordinatorLayout;
+
 import com.blankj.utilcode.util.BarUtils;
 import com.blankj.utilcode.util.ColorUtils;
 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
index 29e8553899..b0550f126c 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/IBaseView.java
@@ -1,10 +1,11 @@
 package com.blankj.lib.base;
 
 import android.os.Bundle;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.Nullable;
 import android.view.View;
 
+import androidx.annotation.LayoutRes;
+import androidx.annotation.Nullable;
+
 
 /**
  * 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
index 11aa94e015..e69be6c6df 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseAdapter.java
@@ -1,12 +1,13 @@
 package com.blankj.lib.base.rv;
 
 import android.content.Context;
-import android.support.annotation.NonNull;
-import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
 import java.util.List;
 
 /**
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
index cdf42c7882..332c4caee0 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseCell.java
@@ -1,10 +1,11 @@
 package com.blankj.lib.base.rv;
 
-import android.support.annotation.NonNull;
 import android.util.SparseArray;
 import android.util.SparseIntArray;
 import android.view.View;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
index ceb1c46eac..0bd892f317 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/BaseViewHolder.java
@@ -1,7 +1,7 @@
 package com.blankj.lib.base.rv;
 
-import android.support.annotation.IdRes;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.IdRes;
+import androidx.recyclerview.widget.RecyclerView;
 import android.util.SparseArray;
 import android.view.View;
 
diff --git a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
index 3d2b90f302..dd20894e10 100644
--- a/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
+++ b/lib/base/src/main/java/com/blankj/lib/base/rv/RecycleViewDivider.java
@@ -5,11 +5,11 @@
 import android.graphics.Canvas;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.RecyclerView;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
+import androidx.core.view.ViewCompat;
+import androidx.recyclerview.widget.RecyclerView;
 import android.view.View;
 import android.widget.LinearLayout;
 
diff --git a/lib/base/src/main/res/layout/activity_base_title.xml b/lib/base/src/main/res/layout/activity_base_title.xml
index b11ecf7341..986d3669b6 100644
--- a/lib/base/src/main/res/layout/activity_base_title.xml
+++ b/lib/base/src/main/res/layout/activity_base_title.xml
@@ -1,24 +1,23 @@
 
-
 
-    
 
-        
-    
+    
 
     
 
-
+
diff --git a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
index 96f5e09d49..bd031cfb67 100644
--- a/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
+++ b/lib/base/src/main/res/layout/activity_base_title_stub_scroll.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
 
diff --git a/lib/base/src/main/res/layout/activity_drawer.xml b/lib/base/src/main/res/layout/activity_drawer.xml
index 72f70ed969..be44cd718c 100644
--- a/lib/base/src/main/res/layout/activity_drawer.xml
+++ b/lib/base/src/main/res/layout/activity_drawer.xml
@@ -1,5 +1,5 @@
 
-
 
-    
 
-
+
diff --git a/subutil/app/build.gradle b/subutil/app/build.gradle
index a2e0172413..a7027c15ef 100644
--- a/subutil/app/build.gradle
+++ b/subutil/app/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':subutil:pkg')
+    implementation gradle.ext.dep.subutil_pkg
 }
\ No newline at end of file
diff --git a/subutil/lib/build.gradle b/subutil/lib/build.gradle
index 9dcbe0b542..f3140b4f0b 100644
--- a/subutil/lib/build.gradle
+++ b/subutil/lib/build.gradle
@@ -14,7 +14,7 @@ readme {
 
 dependencies {
     compileOnly gradle.ext.dep.support_appcompat_v7
-    compileOnly gradle.ext.dep.support_design
+    compileOnly gradle.ext.dep.support_material
     api(gradle.ext.dep.glide) {
         exclude group: "com.android.support"
     }
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
index 7ee8747902..0c177b534c 100755
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/LocationUtils.java
@@ -11,7 +11,7 @@
 import android.location.LocationProvider;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.IOException;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
index 22486b3a91..934408c65e 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/PinyinUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.subutil.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 /**
  * 
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
index 9cbf4e06fd..91b336abcf 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/Utils.java
@@ -7,8 +7,8 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 import java.lang.reflect.InvocationTargetException;
 
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
index f5583397d9..2f26fb9c24 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/ExecutorFactory.java
@@ -2,7 +2,8 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
index b952f318cb..bdd4174486 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/HttpUtils.java
@@ -1,7 +1,8 @@
 package com.blankj.subutil.util.http;
 
 import android.accounts.NetworkErrorException;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.BufferedOutputStream;
 import java.io.ByteArrayOutputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
index fe39b1299c..c6eddf9b96 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/Request.java
@@ -1,6 +1,7 @@
 package com.blankj.subutil.util.http;
 
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.BufferedInputStream;
 import java.io.ByteArrayInputStream;
diff --git a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
index b8624af490..0cf43662f2 100644
--- a/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
+++ b/subutil/lib/src/main/java/com/blankj/subutil/util/http/SSLConfig.java
@@ -2,7 +2,8 @@
 
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.NonNull;
+
+import androidx.annotation.NonNull;
 
 import java.io.IOException;
 import java.net.InetAddress;
diff --git a/subutil/pkg/build.gradle b/subutil/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/subutil/pkg/build.gradle
+++ b/subutil/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
index 45e67a4a0d..9eba25c622 100644
--- a/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
+++ b/subutil/pkg/src/main/java/com/blankj/subutil/pkg/helper/DialogHelper.kt
@@ -1,6 +1,6 @@
 package com.blankj.subutil.pkg.helper
 
-import android.support.v7.app.AlertDialog
+import androidx.appcompat.app.AlertDialog
 import com.blankj.subutil.pkg.R
 import com.blankj.utilcode.util.ActivityUtils
 import com.blankj.utilcode.util.PermissionUtils
diff --git a/utilcode/README-CN.md b/utilcode/README-CN.md
index 445f206121..0bdb622940 100644
--- a/utilcode/README-CN.md
+++ b/utilcode/README-CN.md
@@ -5,7 +5,7 @@ Gradle:
 implementation 'com.blankj:utilcode:1.24.0'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
 ```
 
 
diff --git a/utilcode/README.md b/utilcode/README.md
index f449736061..5a6a295b4c 100644
--- a/utilcode/README.md
+++ b/utilcode/README.md
@@ -5,7 +5,7 @@ Gradle:
 implementation 'com.blankj:utilcode:1.24.0'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.23.7'
+implementation 'com.blankj:utilcodex:1.24.0'
 ```
 
 
diff --git a/utilcode/app/build.gradle b/utilcode/app/build.gradle
index 5616386892..ea5c172cd7 100644
--- a/utilcode/app/build.gradle
+++ b/utilcode/app/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    implementation project(':utilcode:pkg')
+    implementation gradle.ext.dep.utilcode_pkg
 }
\ No newline at end of file
diff --git a/utilcode/lib/build.gradle b/utilcode/lib/build.gradle
index e4dd3a6716..6d6c599298 100644
--- a/utilcode/lib/build.gradle
+++ b/utilcode/lib/build.gradle
@@ -18,7 +18,7 @@ dependencies {
     compile gradle.ext.dep.gson
 
     compileOnly gradle.ext.dep.support_appcompat_v7
-    compileOnly gradle.ext.dep.support_design
+    compileOnly gradle.ext.dep.support_material
 
     testImplementation gradle.ext.dep.junit
     testImplementation gradle.ext.dep.robolectric
diff --git a/utilcode/lib/project.properties b/utilcode/lib/project.properties
index 22ae3b8603..d238eda740 100644
--- a/utilcode/lib/project.properties
+++ b/utilcode/lib/project.properties
@@ -1,9 +1,9 @@
 #project
-project.name=UtilCode
+project.name=UtilCodeX
 project.groupId=com.blankj
-project.artifactId=utilcode
+project.artifactId=utilcodex
 project.packaging=aar
 project.siteUrl=https://github.com/Blankj/AndroidUtilCode
 project.gitUrl=https://github.com/Blankj/AndroidUtilCode.git
 #javadoc
-javadoc.name=UtilCode
\ No newline at end of file
+javadoc.name=UtilCodeX
\ No newline at end of file
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
index b68bfcb113..5c05c0163e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/MemoryConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
index 76f7e9a217..6db826e4ab 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/PermissionConstants.java
@@ -4,7 +4,7 @@
 import android.Manifest.permission;
 import android.annotation.SuppressLint;
 import android.os.Build;
-import android.support.annotation.StringDef;
+import androidx.annotation.StringDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
index 9932037bf8..45090576e3 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/constant/TimeConstants.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.constant;
 
-import android.support.annotation.IntDef;
+import androidx.annotation.IntDef;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
index d6a671e4fe..de1bfeb005 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ActivityUtils.java
@@ -10,14 +10,15 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v4.util.Pair;
 import android.util.Log;
 import android.view.View;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.app.ActivityOptionsCompat;
+import androidx.core.util.Pair;
+
 import java.util.List;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
index 7e87e73474..ca9036225e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AntiShakeUtils.java
@@ -1,9 +1,10 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.View;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
index a9368be59f..5a9194ce66 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/AppUtils.java
@@ -17,8 +17,6 @@
 import android.net.Uri;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
 import android.util.Log;
 
 import java.io.File;
@@ -27,6 +25,9 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..22178a5c20 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -8,11 +8,6 @@
 import android.graphics.Color;
 import android.graphics.Point;
 import android.os.Build;
-import android.support.annotation.ColorInt;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.widget.DrawerLayout;
 import android.util.Log;
 import android.util.TypedValue;
 import android.view.Display;
@@ -27,6 +22,12 @@
 
 import java.lang.reflect.Method;
 
+import androidx.annotation.ColorInt;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+import androidx.drawerlayout.widget.DrawerLayout;
+
 import static android.Manifest.permission.EXPAND_STATUS_BAR;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
index f9344b0a59..bacc519540 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BrightnessUtils.java
@@ -2,11 +2,12 @@
 
 import android.content.ContentResolver;
 import android.provider.Settings;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.view.Window;
 import android.view.WindowManager;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
index f04202043e..d272c99b98 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/BusUtils.java
@@ -16,11 +16,12 @@
 import android.os.Message;
 import android.os.Messenger;
 import android.os.RemoteException;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
 import android.text.TextUtils;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
index bb48a4b5cf..c5a9a17a6d 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
index 67e6b3fb0e..a8ae8afa5b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDiskUtils.java
@@ -8,9 +8,10 @@
 import android.graphics.drawable.Drawable;
 import android.os.Parcel;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+
 import com.blankj.utilcode.constant.CacheConstants;
 
 import org.json.JSONArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
index 2ef267bd01..6dbb9f7475 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleStaticUtils.java
@@ -3,13 +3,14 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
 
 import java.io.Serializable;
 
+import androidx.annotation.NonNull;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
index c800423c78..aca1c25837 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheDoubleUtils.java
@@ -3,7 +3,7 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
index 56abfba117..aedcfa7fc4 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryStaticUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
index d0e06e394d..ddaa2baed9 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CacheMemoryUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
-import android.support.v4.util.LruCache;
+import androidx.annotation.NonNull;
+import androidx.collection.LruCache;
 
 import com.blankj.utilcode.constant.CacheConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
index 4c0c22232b..a6603cfc44 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ColorUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
 import android.graphics.Color;
-import android.support.annotation.ColorInt;
-import android.support.annotation.ColorRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.ColorRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.core.content.ContextCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
index 18b5f814a3..081dd09761 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/CrashUtils.java
@@ -5,8 +5,8 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.io.BufferedWriter;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
index e6b1910cfc..c641c9bdae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/DeviceUtils.java
@@ -11,11 +11,12 @@
 import android.os.Debug;
 import android.os.PowerManager;
 import android.provider.Settings;
-import android.support.annotation.RequiresApi;
-import android.support.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 
+import androidx.annotation.RequiresApi;
+import androidx.annotation.RequiresPermission;
+
 import java.io.File;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
index 43b8537e75..9e8ae14ef1 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/FragmentUtils.java
@@ -3,16 +3,6 @@
 import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.os.Bundle;
-import android.support.annotation.AnimRes;
-import android.support.annotation.AnimatorRes;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IdRes;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentManager;
-import android.support.v4.app.FragmentTransaction;
 import android.util.Log;
 import android.view.View;
 
@@ -20,6 +10,17 @@
 import java.util.Collections;
 import java.util.List;
 
+import androidx.annotation.AnimRes;
+import androidx.annotation.AnimatorRes;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IdRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentManager;
+import androidx.fragment.app.FragmentTransaction;
+
 /**
  * 
  *     author: Blankj
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
index 83e01eb1ad..cbee7dd4bd 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ImageUtils.java
@@ -27,13 +27,13 @@
 import android.renderscript.Element;
 import android.renderscript.RenderScript;
 import android.renderscript.ScriptIntrinsicBlur;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.view.View;
 
 import java.io.BufferedOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
index 6faa37d043..1e26dc8a9a 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/IntentUtils.java
@@ -8,8 +8,8 @@
 import android.os.Bundle;
 import android.provider.MediaStore;
 import android.provider.Settings;
-import android.support.annotation.RequiresPermission;
-import android.support.v4.content.FileProvider;
+import androidx.annotation.RequiresPermission;
+import androidx.core.content.FileProvider;
 
 import java.io.File;
 import java.util.ArrayList;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index cfa568fa7c..de3eb285cc 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -7,7 +7,6 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.ResultReceiver;
-import android.support.annotation.NonNull;
 import android.util.Log;
 import android.view.View;
 import android.view.ViewTreeObserver.OnGlobalLayoutListener;
@@ -16,6 +15,8 @@
 import android.view.inputmethod.InputMethodManager;
 import android.widget.FrameLayout;
 
+import androidx.annotation.NonNull;
+
 import java.lang.reflect.Field;
 
 /**
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
index 1372ecd40b..9a7e11cbf5 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/LogUtils.java
@@ -10,10 +10,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.RequiresApi;
+import androidx.collection.SimpleArrayMap;
 import android.util.Log;
 
 import com.google.gson.Gson;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
index 6f6cf85b80..bd4b8da935 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/MetaDataUtils.java
@@ -8,7 +8,7 @@
 import android.content.pm.ApplicationInfo;
 import android.content.pm.PackageManager;
 import android.content.pm.ServiceInfo;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index d59eb28240..24a05a26b7 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -7,13 +7,14 @@
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
 import android.os.Build;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
 import android.text.format.Formatter;
 import android.util.Log;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
+
 import java.lang.reflect.Method;
 import java.net.InetAddress;
 import java.net.InterfaceAddress;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
index b8163d2e66..73a900b465 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/NotificationUtils.java
@@ -5,9 +5,9 @@
 import android.app.PendingIntent;
 import android.content.Context;
 import android.content.Intent;
-import android.support.annotation.Nullable;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.Nullable;
+import androidx.core.app.NotificationCompat;
+import androidx.core.app.NotificationManagerCompat;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
index be5491ece0..3c0c087a39 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ObjectUtils.java
@@ -1,9 +1,9 @@
 package com.blankj.utilcode.util;
 
 import android.os.Build;
-import android.support.annotation.RequiresApi;
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
+import androidx.annotation.RequiresApi;
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
index d35cbcc620..602efcb5db 100755
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PermissionUtils.java
@@ -9,10 +9,10 @@
 import android.os.Build;
 import android.os.Bundle;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.annotation.RequiresApi;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.core.content.ContextCompat;
 import android.util.Log;
 import android.view.MotionEvent;
 import android.view.WindowManager;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
index 99068781a4..f407f81b5f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/PhoneUtils.java
@@ -7,7 +7,7 @@
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Build;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 import android.telephony.SmsManager;
 import android.telephony.TelephonyManager;
 import android.text.TextUtils;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
index adcd265f72..619b175549 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ProcessUtils.java
@@ -10,8 +10,8 @@
 import android.content.pm.PackageManager;
 import android.content.pm.ResolveInfo;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.Log;
 
 import java.util.Arrays;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
index ba57fab956..817a94149f 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/RegexUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.SimpleArrayMap;
+import androidx.collection.SimpleArrayMap;
 
 import com.blankj.utilcode.constant.RegexConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
index 81d10f08cf..3fb515c06b 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ResourceUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.RawRes;
+import androidx.annotation.RawRes;
 
 import java.io.BufferedOutputStream;
 import java.io.BufferedReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
index d3e21fb873..21274c3023 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPStaticUtils.java
@@ -1,7 +1,7 @@
 package com.blankj.utilcode.util;
 
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Map;
 import java.util.Set;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
index 554a2ed586..a9d18a1a55 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SPUtils.java
@@ -3,7 +3,7 @@
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.util.Collections;
 import java.util.HashMap;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
index 7390fceed0..3245eb115c 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ScreenUtils.java
@@ -10,8 +10,8 @@
 import android.graphics.Point;
 import android.os.Build;
 import android.provider.Settings;
-import android.support.annotation.NonNull;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresPermission;
 import android.util.DisplayMetrics;
 import android.view.Surface;
 import android.view.View;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
index b7ad2fa9d2..fc10a601ae 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ShellUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import java.io.BufferedReader;
 import java.io.DataOutputStream;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
index b164e6154e..eab1990d29 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
@@ -1,12 +1,12 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.NonNull;
-import android.support.design.widget.Snackbar;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.NonNull;
+import com.google.android.material.snackbar.Snackbar;
 import android.text.SpannableString;
 import android.text.Spanned;
 import android.text.style.ForegroundColorSpan;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
index b8d9d53aed..4d49451ec0 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/SpanUtils.java
@@ -14,14 +14,14 @@
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
 import android.net.Uri;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.FloatRange;
-import android.support.annotation.IntDef;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.support.annotation.Nullable;
-import android.support.v4.content.ContextCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.FloatRange;
+import androidx.annotation.IntDef;
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
 import android.text.Layout;
 import android.text.Layout.Alignment;
 import android.text.SpannableStringBuilder;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
index c3254e3d32..70f0defe50 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/StringUtils.java
@@ -1,8 +1,8 @@
 package com.blankj.utilcode.util;
 
 import android.content.res.Resources;
-import android.support.annotation.ArrayRes;
-import android.support.annotation.StringRes;
+import androidx.annotation.ArrayRes;
+import androidx.annotation.StringRes;
 
 /**
  * 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index 0545a27fa0..19de94ca33 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -2,10 +2,11 @@
 
 import android.os.Handler;
 import android.os.Looper;
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
 import android.util.Log;
 
+import androidx.annotation.IntRange;
+import androidx.annotation.NonNull;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.Executor;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
index adaa920474..a5286b0fbe 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/TimeUtils.java
@@ -1,6 +1,6 @@
 package com.blankj.utilcode.util;
 
-import android.support.annotation.NonNull;
+import androidx.annotation.NonNull;
 
 import com.blankj.utilcode.constant.TimeConstants;
 
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
index 150425cdba..0dd47cfa3e 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/ToastUtils.java
@@ -12,11 +12,11 @@
 import android.os.Build;
 import android.os.Handler;
 import android.os.Message;
-import android.support.annotation.ColorInt;
-import android.support.annotation.DrawableRes;
-import android.support.annotation.LayoutRes;
-import android.support.annotation.StringRes;
-import android.support.v4.app.NotificationManagerCompat;
+import androidx.annotation.ColorInt;
+import androidx.annotation.DrawableRes;
+import androidx.annotation.LayoutRes;
+import androidx.annotation.StringRes;
+import androidx.core.app.NotificationManagerCompat;
 import android.util.Log;
 import android.view.Gravity;
 import android.view.LayoutInflater;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
index 9ad408912a..20fdc39b81 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/UriUtils.java
@@ -8,12 +8,14 @@
 import android.os.Environment;
 import android.provider.DocumentsContract;
 import android.provider.MediaStore;
-import android.support.annotation.NonNull;
-import android.support.v4.content.FileProvider;
+import android.text.TextUtils;
 import android.util.Log;
 
 import java.io.File;
 
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
 /**
  * 
  *     author: Blankj
@@ -75,12 +77,19 @@ public static File uri2File(@NonNull final Uri uri) {
                 Log.d("UriUtils", uri.toString() + " parse failed. -> 1");
                 return null;
             } else if ("com.android.providers.downloads.documents".equals(authority)) {
-                final String id = DocumentsContract.getDocumentId(uri);
-                final Uri contentUri = ContentUris.withAppendedId(
-                        Uri.parse("content://downloads/public_downloads"),
-                        Long.valueOf(id)
-                );
-                return getFileFromUri(contentUri, 2);
+                String id = DocumentsContract.getDocumentId(uri);
+                if (!TextUtils.isEmpty(id)) {
+                    if (id.startsWith("raw:")) {
+                        return new File(id.substring(4));
+                    }
+                    final Uri contentUri = ContentUris.withAppendedId(
+                            Uri.parse(Environment.DIRECTORY_DOWNLOADS),
+                            Long.valueOf(id)
+                    );
+                    return getFileFromUri(contentUri, 2);
+                }
+                Log.d("UriUtils", uri.toString() + " parse failed. -> 3");
+                return null;
             } else if ("com.android.providers.media.documents".equals(authority)) {
                 final String docId = DocumentsContract.getDocumentId(uri);
                 final String[] split = docId.split(":");
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
index d0c98afc96..1992a2c902 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/Utils.java
@@ -13,13 +13,14 @@
 import android.os.Bundle;
 import android.os.Handler;
 import android.os.Looper;
-import android.support.v4.content.FileProvider;
 import android.text.TextUtils;
 import android.util.DisplayMetrics;
 import android.util.Log;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 
+import androidx.core.content.FileProvider;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileReader;
diff --git a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
index a57bbb8241..622d657817 100644
--- a/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
+++ b/utilcode/lib/src/main/java/com/blankj/utilcode/util/VibrateUtils.java
@@ -2,7 +2,7 @@
 
 import android.content.Context;
 import android.os.Vibrator;
-import android.support.annotation.RequiresPermission;
+import androidx.annotation.RequiresPermission;
 
 import static android.Manifest.permission.VIBRATE;
 
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
index 85bc9d8ac2..2dadedff8c 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/BaseTest.java
@@ -1,8 +1,5 @@
 package com.blankj.utilcode.util;
 
-
-import android.support.annotation.NonNull;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.robolectric.RobolectricTestRunner;
@@ -29,7 +26,7 @@ public BaseTest() {
         ShadowLog.stream = System.out;
         ThreadUtils.setDeliver(new Executor() {
             @Override
-            public void execute(@NonNull Runnable command) {
+            public void execute(Runnable command) {
                 command.run();
             }
         });
@@ -201,8 +198,8 @@ public void onFail(Throwable t) {
     static class Person implements Comparable {
 
         String name;
-        int age;
-        int time;
+        int    age;
+        int    time;
 
         public Person(String name) {
             this.name = name;
@@ -220,7 +217,7 @@ public String toString() {
         }
 
         @Override
-        public int compareTo(@NonNull Person o) {
+        public int compareTo(Person o) {
             int res = o.age - age;
             if (res != 0) {
                 return res;
diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
index a0203f78fc..ed12c24d8d 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/ObjectUtilsTest.java
@@ -1,7 +1,5 @@
 package com.blankj.utilcode.util;
 
-import android.support.v4.util.LongSparseArray;
-import android.support.v4.util.SimpleArrayMap;
 import android.util.SparseArray;
 import android.util.SparseBooleanArray;
 import android.util.SparseIntArray;
@@ -12,6 +10,9 @@
 import java.util.HashMap;
 import java.util.LinkedList;
 
+import androidx.collection.LongSparseArray;
+import androidx.collection.SimpleArrayMap;
+
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/utilcode/pkg/build.gradle b/utilcode/pkg/build.gradle
index 9fe360a5dd..881637b34a 100644
--- a/utilcode/pkg/build.gradle
+++ b/utilcode/pkg/build.gradle
@@ -4,5 +4,5 @@ apply {
 
 dependencies {
     implementation fileTree(dir: 'libs', include: ['*.jar'])
-    api project(':lib:base')
+    api gradle.ext.dep.lib_base
 }
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
index e784f98401..9982c948b7 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/ActivityActivity.kt
@@ -6,7 +6,7 @@ import android.graphics.Bitmap
 import android.graphics.drawable.BitmapDrawable
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityOptionsCompat
+import androidx.core.app.ActivityOptionsCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
index 0c63773639..abf0151bbc 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/activity/SubActivityActivity.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.activity
 
 import android.os.Build
 import android.os.Bundle
-import android.support.v4.app.ActivityCompat
+import androidx.core.app.ActivityCompat
 import android.view.View
 import android.view.Window
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
index d4f0d60530..fc8020b3e5 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bar/BarStatusFragmentActivity.kt
@@ -3,10 +3,10 @@ package com.blankj.utilcode.pkg.feature.bar
 import android.content.Context
 import android.content.Intent
 import android.os.Bundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
-import android.support.v4.app.FragmentPagerAdapter
-import android.support.v4.view.ViewPager
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentPagerAdapter
+import androidx.viewpager.widget.ViewPager
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -37,7 +37,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             R.id.barStatusFragmentNavigationCustom
     )
 
-    private val mFragmentList = ArrayList()
+    private val mFragmentList = ArrayList()
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener l@{ item ->
         when (item.itemId) {
@@ -78,8 +78,8 @@ class BarStatusFragmentActivity : BaseActivity() {
         mFragmentList.add(BarStatusCustomFragment.newInstance())
 
         barStatusFragmentVp.offscreenPageLimit = 3
-        barStatusFragmentVp.adapter = object : FragmentPagerAdapter(supportFragmentManager) {
-            override fun getItem(position: Int): Fragment {
+        barStatusFragmentVp.adapter = object : androidx.fragment.app.FragmentPagerAdapter(supportFragmentManager) {
+            override fun getItem(position: Int): androidx.fragment.app.Fragment {
                 return mFragmentList[position]
             }
 
@@ -88,7 +88,7 @@ class BarStatusFragmentActivity : BaseActivity() {
             }
         }
 
-        barStatusFragmentVp.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+        barStatusFragmentVp.addOnPageChangeListener(object : androidx.viewpager.widget.ViewPager.OnPageChangeListener {
             override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
 
             override fun onPageSelected(position: Int) {
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
index ada9dd0d10..86972c449d 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/ContainerFragment.kt
@@ -2,8 +2,8 @@ package com.blankj.utilcode.pkg.feature.fragment
 
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.RequiresApi
-import android.support.v4.app.Fragment
+import androidx.annotation.RequiresApi
+import androidx.fragment.app.Fragment
 import android.transition.*
 import android.view.View
 import com.blankj.lib.base.BaseLazyFragment
@@ -128,7 +128,7 @@ class ContainerFragment : BaseLazyFragment(), FragmentUtils.OnBackClickListener
         }
     }
 
-    private fun addSharedElement(fragment: Fragment): Fragment {
+    private fun addSharedElement(fragment: androidx.fragment.app.Fragment): androidx.fragment.app.Fragment {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             fragment.sharedElementEnterTransition = DetailTransition()
             fragment.enterTransition = Fade()
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
index 446271b366..b18a2e236b 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/fragment/FragmentActivity.kt
@@ -4,8 +4,8 @@ import android.content.Context
 import android.content.Intent
 import android.os.Bundle
 import android.os.PersistableBundle
-import android.support.design.widget.BottomNavigationView
-import android.support.v4.app.Fragment
+import com.google.android.material.bottomnavigation.BottomNavigationView
+import androidx.fragment.app.Fragment
 import android.view.View
 import com.blankj.lib.base.BaseActivity
 import com.blankj.utilcode.pkg.R
@@ -29,7 +29,7 @@ class FragmentActivity : BaseActivity() {
         }
     }
 
-    private val mFragments = arrayListOf()
+    private val mFragments = arrayListOf()
     private var curIndex: Int = 0
 
     private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
index 0e092e0062..2c6656f220 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt
@@ -6,12 +6,12 @@ import android.graphics.Bitmap
 import android.graphics.Color
 import android.os.Build
 import android.os.Bundle
-import android.support.annotation.StringRes
-import android.support.v7.widget.LinearLayoutManager
 import android.view.View
 import android.widget.Button
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.annotation.StringRes
+import androidx.recyclerview.widget.LinearLayoutManager
 import com.blankj.lib.base.BaseTaskActivity
 import com.blankj.lib.base.rv.BaseAdapter
 import com.blankj.lib.base.rv.BaseCell
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
index a0ea36d528..cd1c1b0d99 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/snackbar/SnackbarActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.text.SpannableStringBuilder
 import android.view.View
 import android.view.ViewGroup
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
index d84ced168c..202069ed61 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/span/SpanActivity.kt
@@ -5,7 +5,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.*
 import android.os.Bundle
-import android.support.annotation.ColorInt
+import androidx.annotation.ColorInt
 import android.text.Layout
 import android.text.SpannableStringBuilder
 import android.text.TextPaint
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
index 314ba33d59..458ecbb3fb 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/CustomToast.kt
@@ -2,7 +2,7 @@ package com.blankj.utilcode.pkg.feature.toast
 
 import android.os.Handler
 import android.os.Looper
-import android.support.annotation.StringRes
+import androidx.annotation.StringRes
 import android.widget.TextView
 import android.widget.Toast
 
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
index 51c9e53774..47f91e826e 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/toast/ToastActivity.kt
@@ -4,7 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.graphics.Color
 import android.os.Bundle
-import android.support.v4.content.ContextCompat
+import androidx.core.content.ContextCompat
 import android.view.Gravity
 import android.view.View
 import com.blankj.lib.base.BaseTitleActivity
diff --git a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
index 344a69e448..a495a13013 100644
--- a/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
+++ b/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/helper/DialogHelper.kt
@@ -3,7 +3,6 @@ package com.blankj.utilcode.pkg.helper
 import android.app.Dialog
 import android.graphics.Bitmap
 import android.graphics.drawable.ColorDrawable
-import android.support.v7.app.AlertDialog
 import android.text.method.ScrollingMovementMethod
 import android.view.Gravity
 import android.view.LayoutInflater
@@ -12,9 +11,9 @@ import android.widget.Button
 import android.widget.EditText
 import android.widget.ImageView
 import android.widget.TextView
+import androidx.appcompat.app.AlertDialog
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.*
-import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldRequest
 
 /**
  * ```
@@ -26,7 +25,7 @@ import com.blankj.utilcode.util.PermissionUtils.OnRationaleListener.ShouldReques
  */
 object DialogHelper {
 
-    fun showRationaleDialog(shouldRequest: ShouldRequest) {
+    fun showRationaleDialog(shouldRequest: PermissionUtils.OnRationaleListener.ShouldRequest) {
         val topActivity = ActivityUtils.getTopActivity()
         AlertDialog.Builder(topActivity)
                 .setTitle(android.R.string.dialog_alert_title)
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
index 792ae5672e..9be8749952 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen.xml
@@ -1,5 +1,5 @@
 
-
 
-
+
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
index ccc88dddb6..1522b0741b 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_close.xml
@@ -8,7 +8,7 @@
     android:fillViewport="true"
     tools:context=".feature.adaptScreen.AdaptCloseActivity">
 
-    
 
@@ -43,6 +43,6 @@
             android:textSize="30pt"
             app:layout_constraintTop_toBottomOf="@id/adaptScreenCloseAdaptDpTv" />
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
index 350921b04d..75fa87e8e5 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_height.xml
@@ -1,13 +1,12 @@
 
-
 
-    
 
@@ -94,6 +93,6 @@
                 android:textSize="30pt" />
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
index 121415e1b6..dd9f9f40c7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_adaptscreen_width.xml
@@ -8,7 +8,7 @@
     android:fillViewport="true"
     tools:context=".feature.adaptScreen.AdaptWidthActivity">
 
-    
 
@@ -149,6 +149,6 @@
 
         
 
-    
+    
 
 
\ No newline at end of file
diff --git a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
index 3ce196004b..bd6e43e7a7 100644
--- a/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
+++ b/utilcode/pkg/src/main/res/layout/activity_bar_status_fragment.xml
@@ -6,7 +6,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical">
 
-    
 
-    
 
-    
-
Date: Sat, 29 Jun 2019 19:59:42 +0800
Subject: [PATCH 005/173] see 06/29 log

---
 .../test/java/com/blankj/utilcode/util/TimeUtilsTest.java    | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
index 2ba0a41586..5ab8ee17eb 100644
--- a/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
+++ b/utilcode/lib/src/test/java/com/blankj/utilcode/util/TimeUtilsTest.java
@@ -42,15 +42,14 @@ public class TimeUtilsTest  {
     public void millis2String() {
         assertEquals(timeString, TimeUtils.millis2String(timeMillis));
         assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, mFormat));
-        assertEquals("2017年05月04日", TimeUtils.millis2String(timeMillis, "yyyy年MM月dd日"));
-        assertEquals("16时37分", TimeUtils.millis2String(timeMillis, "HH时mm分"));
+        assertEquals(timeStringFormat, TimeUtils.millis2String(timeMillis, "yyyy MM dd HH:mm:ss"));
     }
 
     @Test
     public void string2Millis() {
         assertEquals(timeMillis, TimeUtils.string2Millis(timeString));
         assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, mFormat));
-        assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy年MM月dd日HH时mm分"));
+        assertEquals(timeMillis, TimeUtils.string2Millis(timeStringFormat, "yyyy MM dd HH:mm:ss"));
     }
 
     @Test

From 948a87bdd9935e90c07a08507428e4230db86dcc Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Thu, 18 Jul 2019 21:54:44 +0800
Subject: [PATCH 006/173] see 07/18 log

---
 .travis.yml                                   |   2 +-
 CHANGELOG.md                                  |   1 +
 art/busutil_vs_eventbus.png                   | Bin 0 -> 63550 bytes
 buildSrc/src/main/groovy/Config.groovy        |   4 +-
 buildSrc/src/main/groovy/ConfigUtils.groovy   |  57 +-
 .../blankj/common/CommonTitleActivity.java    |   2 +-
 .../common_activity_title_stub_no_scroll.xml  |   2 +-
 .../common_activity_title_stub_scroll.xml     |   4 +-
 lib/utilcode/README-API.md                    |  76 --
 lib/utilcode/README-BUS.md                    |  94 ---
 lib/utilcode/README-CN.md                     |  10 +-
 lib/utilcode/README.md                        |  10 +-
 .../com/blankj/utilcode/util/ApiUtils.java    |   5 +-
 plugin/api-gradle-plugin/README.md            | 310 ++++++++
 .../src/test/java/com/blankj/api/ApiTest.java |   7 +
 .../test/java/com/blankj/api/ApiUtils.java    |   5 +-
 plugin/bus-gradle-plugin/README.md            | 686 ++++++++++++++++++
 17 files changed, 1061 insertions(+), 214 deletions(-)
 create mode 100644 art/busutil_vs_eventbus.png
 delete mode 100644 lib/utilcode/README-API.md
 delete mode 100644 lib/utilcode/README-BUS.md
 create mode 100644 plugin/api-gradle-plugin/README.md
 create mode 100644 plugin/bus-gradle-plugin/README.md

diff --git a/.travis.yml b/.travis.yml
index 20b411b78b..195511dd82 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -21,4 +21,4 @@ before_install:
   - yes | $ANDROID_HOME/tools/bin/sdkmanager "build-tools;26.0.2"
 
 script:
-  - ./gradlew build connectedCheck
+  - ./gradlew aR
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 70b6a5bc94..4f439d24c7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+* `19/07/18` [add] README of ApiUtils and BusUtils.
 * `19/07/15` [add] Publish v1.25.0.
 * `19/07/14` [upd] Bus plugin for use BusUtils. Publish bus plugin v2.0.
 * `19/07/13` [add] Api plugin for use ApiUtils. Publish api plugin v1.0.
diff --git a/art/busutil_vs_eventbus.png b/art/busutil_vs_eventbus.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a2272b808741d783c9d4955d34bf925b1fa59cf
GIT binary patch
literal 63550
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
x|NP&3v_abacB-@|6T*F!aa89{vWyHhd2NL

literal 0
HcmV?d00001

diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index e60ed7b621..db56f272a0 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -38,11 +38,11 @@ class Config {
                     // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false
                     // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false
                     // 发布版本的话把 useLocal = false, isApply = false,发布成功后 isApply = true 即可使用远程库版本
-                    api    : new DepConfig(false/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.0", true/*是否使用插件*/),
+                    api    : new DepConfig(true/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.0", true/*是否使用插件*/),
                     bus    : new DepConfig(false/*是否本地调试*/, "com.blankj:bus-gradle-plugin:2.0", true/*是否使用插件*/),
             ],
 
-            api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", false),
+            api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", true),
             bus_gradle_plugin: new DepConfig(":plugin:bus-gradle-plugin", false),
 
             feature          : [
diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy
index 5615b6ef9e..d04e9dae71 100644
--- a/buildSrc/src/main/groovy/ConfigUtils.groovy
+++ b/buildSrc/src/main/groovy/ConfigUtils.groovy
@@ -59,28 +59,6 @@ class ConfigUtils {
         return applyExports
     }
 
-    static Map getDepConfigByFilter(DepConfigFilter filter) {
-        return _getDepConfigByFilter("", Config.depConfig, filter)
-    }
-
-    private static _getDepConfigByFilter(String namePrefix, Map map, DepConfigFilter filter) {
-        def depConfigList = [:]
-        for (Map.Entry entry : map.entrySet()) {
-            def (name, value) = [entry.getKey(), entry.getValue()]
-            if (value instanceof Map) {
-                namePrefix += (name + '.')
-                depConfigList.putAll(_getDepConfigByFilter(namePrefix, value, filter))
-                namePrefix -= (name + '.')
-                continue
-            }
-            def config = value as DepConfig
-            if (filter == null || filter.accept(namePrefix + name, config)) {
-                depConfigList.put(namePrefix + name, config)
-            }
-        }
-        return depConfigList
-    }
-
     static addBuildListener(Gradle gradle) {
         gradle.addBuildListener(new ConfigBuildListener())
     }
@@ -90,6 +68,9 @@ class ConfigUtils {
         private List taskInfoList = []
         private long startBuildMillis
 
+        @Override
+        void buildStarted(Gradle gradle) {}
+
         @Override
         void settingsEvaluated(Settings settings) {
             startBuildMillis = System.currentTimeMillis()
@@ -150,9 +131,6 @@ class ConfigUtils {
             })
         }
 
-        @Override
-        void buildStarted(Gradle gradle) {}
-
         @Override
         void buildFinished(BuildResult result) {
             GLog.d("buildFinished")
@@ -184,6 +162,9 @@ class ConfigUtils {
          * 在 settings.gradle 中 根据 appConfig 和 pkgConfig 来 include 本地模块
          */
         private static includeModule(Settings settings) {
+            if (Config.pkgConfig.isEmpty()) {
+                Config.depConfig.feature.mock.isApply = false
+            }
             def config = getDepConfigByFilter(new DepConfigFilter() {
                 @Override
                 boolean accept(String name, DepConfig config) {
@@ -193,8 +174,8 @@ class ConfigUtils {
                             config.isApply = false
                         }
                     }
-                    if (!Config.pkgConfig.isEmpty()) {
-                        if (name.endsWith('.pkg')) {
+                    if (name.endsWith('.pkg')) {
+                        if (!Config.pkgConfig.isEmpty()) {
                             def pkgName = name.substring('feature.'.length(), name.length() - 4)
                             if (!Config.pkgConfig.contains(pkgName)) {
                                 config.isApply = false
@@ -247,6 +228,28 @@ class ConfigUtils {
         }
     }
 
+    static Map getDepConfigByFilter(DepConfigFilter filter) {
+        return _getDepConfigByFilter("", Config.depConfig, filter)
+    }
+
+    private static _getDepConfigByFilter(String namePrefix, Map map, DepConfigFilter filter) {
+        def depConfigList = [:]
+        for (Map.Entry entry : map.entrySet()) {
+            def (name, value) = [entry.getKey(), entry.getValue()]
+            if (value instanceof Map) {
+                namePrefix += (name + '.')
+                depConfigList.putAll(_getDepConfigByFilter(namePrefix, value, filter))
+                namePrefix -= (name + '.')
+                continue
+            }
+            def config = value as DepConfig
+            if (filter == null || filter.accept(namePrefix + name, config)) {
+                depConfigList.put(namePrefix + name, config)
+            }
+        }
+        return depConfigList
+    }
+
     interface DepConfigFilter {
         boolean accept(String name, DepConfig config);
     }
diff --git a/lib/common/src/main/java/com/blankj/common/CommonTitleActivity.java b/lib/common/src/main/java/com/blankj/common/CommonTitleActivity.java
index f169187a2b..9ff3a74aea 100644
--- a/lib/common/src/main/java/com/blankj/common/CommonTitleActivity.java
+++ b/lib/common/src/main/java/com/blankj/common/CommonTitleActivity.java
@@ -50,7 +50,7 @@ public void setRootLayout(@LayoutRes int layoutId) {
                 mViewStub = findViewById(R.id.baseTitleStubNoScroll);
             }
             mViewStub.setVisibility(View.VISIBLE);
-            baseTitleContentView = findViewById(R.id.baseTitleContentView);
+            baseTitleContentView = findViewById(R.id.commonTitleContentView);
             LayoutInflater.from(this).inflate(layoutId, baseTitleContentView);
         }
         setTitleBar();
diff --git a/lib/common/src/main/res/layout/common_activity_title_stub_no_scroll.xml b/lib/common/src/main/res/layout/common_activity_title_stub_no_scroll.xml
index a0167784fb..438937c438 100644
--- a/lib/common/src/main/res/layout/common_activity_title_stub_no_scroll.xml
+++ b/lib/common/src/main/res/layout/common_activity_title_stub_no_scroll.xml
@@ -1,5 +1,5 @@
 
 
diff --git a/lib/common/src/main/res/layout/common_activity_title_stub_scroll.xml b/lib/common/src/main/res/layout/common_activity_title_stub_scroll.xml
index 6ab1978079..8842a29c4e 100644
--- a/lib/common/src/main/res/layout/common_activity_title_stub_scroll.xml
+++ b/lib/common/src/main/res/layout/common_activity_title_stub_scroll.xml
@@ -1,12 +1,12 @@
 
 
 
     
 
diff --git a/lib/utilcode/README-API.md b/lib/utilcode/README-API.md
deleted file mode 100644
index d027b8c937..0000000000
--- a/lib/utilcode/README-API.md
+++ /dev/null
@@ -1,76 +0,0 @@
-# ApiUtils
-
-## 关于
-
-组件化开发会涉及到模块与模块之的相互调用,而各模块之间又是解偶的,所以就产生了很多路由方案,或者是把接口下沉到 `base` 组件中,在 AucFrame 架构中,我们可以通过 ApiUtils 来自由调用各模块的 APIs,各业务通过对外提供 export 模块来供其他业务方使用,自身实现 export 中的接口即可。AucFrame 结构如下图所示:
-
-![AucFrame](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png)
-
-ApiUtils 扮演的角色如下所示:
-
-![ApiUtilsPlayer](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
-
-当然,在正常项目中你也可以使用 ApiUtils,下面来介绍其使用方式。
-
-
-## 基本使用
-
-在项目根目录的 `build.gradle` 中添加 `api` 插件:
-
-```groovy
-buildscript {
-    dependencies {
-        ...
-        classpath 'com.blankj:api-gradle-plugin:1.0'
-    }
-}
-```
-
-然后在 application 模块中使用该插件:
-
-```groovy
-apply plugin: "com.blankj.api"
-```
-
-给 base 模块添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
-
-```groovy
-api "com.blankj:utilcode:1.25.0"
-```
-
-比如 feature0 中存在的 `Feature0Activity.java`,我们通常都是在它内部写一个 `start` 函数来启动它,现在我们通过 ApiUtils 来启动它,建立一个抽象类 `Feature0Api` 如下所示:
-
-```java
-
-```
-
-在其他模块通过 `BusUtils.post("startModule0", Context, String, int)` 即可访问到它,一定要注意 `name` 之后的参数顺序和个数一定要和前面声明的函数相一致,其返回值也就是前面函数的返回值:
-
-```java
-// java
-boolean api = BusUtils.post("startModule0", context, "blankj", 18);
-
-// kotlin
-val result = BusUtils.post("startModule0", context, "blankj", 18)
-```
-
-点击编译之后会在该 application 模块中生成 `__bus__.json` 文件
-
-```txt
-{
-  "startModule0": "boolean com.blankj.module0.Module0Activity.start(android.content.Context,java.lang.String,int)"
-}
-```
-
-
-## 高级使用
-
-参看本项目的组件化即可。
-
-主要文件:settings.gradle
-
-
-
-
-[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo_static_bus.png
-[bus]: https://github.com/Blankj/AndroidUtilCode/utilcode/README-STATIC-BUS.md
\ No newline at end of file
diff --git a/lib/utilcode/README-BUS.md b/lib/utilcode/README-BUS.md
deleted file mode 100644
index 97f310a4b6..0000000000
--- a/lib/utilcode/README-BUS.md
+++ /dev/null
@@ -1,94 +0,0 @@
-![logo][logo]
-
-## 关于
-
-组件化开发会涉及到模块与模块之间相互调用,而各模块之间又是解偶的,所以就产生了很多路由方案,或者是把接口下沉到 `base` 组件中,但在 **[StaticBus][bus]** 看来,它们都略显复杂,**[StaticBus][bus]** 只需调用一个静态函数便可自由穿梭于各个模块,就像一辆巴士,由于是基于静态函数来实现,所以称她为 **[StaticBus][bus]**,如今已支持 Kotlin。
-
-
-## 基本使用
-
-在项目根目录的 `build.gradle` 中添加 `bus` 插件:
-
-```groovy
-buildscript {
-    dependencies {
-        ...
-        classpath 'com.blankj:bus-gradle-plugin:2.0'
-    }
-}
-```
-
-然后在 application 模块中使用该插件:
-
-```groovy
-apply plugin: "com.blankj.bus"
-```
-
-给 base 模块添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
-
-```groovy
-result "com.blankj:utilcode:1.25.0"
-```
-
-比如 module0 中存在的 `Module0Activity.java`,我们通常都是在它内部写一个 `start` 函数来启动它,现在我们给它添加 `@BusUtils.Subscribe` 注解,并给注解的 `name` 赋唯一值,要注意,函数务必要 `public static` 哦:
-
-```java
-// java
-public class Module0Activity extends Activity {
-
-    @BusUtils.Subscribe(name = "startModule0")
-    public static boolean start(Context context, String name, int age) {
-        Intent starter = new Intent(context, Module0Activity.class);
-        starter.putExtra("name", name);
-        starter.putExtra("age", age);
-        context.startActivity(starter);
-        return true;
-    }
-}
-
-// kotlin
-class Module0Activity : Activity() {
-
-    companion object {
-        @BusUtils.Subscribe(name = "startModule0")
-        fun start(context: Context, name: String, age: Int): Boolean {
-            val starter = Intent(context, Module0Activity::class.java)
-            starter.putExtra("name", name)
-            starter.putExtra("age", age)
-            context.startActivity(starter)
-            return true
-        }
-    }
-}
-```
-
-在其他模块通过 `BusUtils.post("startModule0", Context, String, int)` 即可访问到它,一定要注意 `name` 之后的参数顺序和个数一定要和前面声明的函数相一致,其返回值也就是前面函数的返回值:
-
-```java
-// java
-boolean result = BusUtils.post("startModule0", context, "blankj", 18);
-
-// kotlin
-val result = BusUtils.post("startModule0", context, "blankj", 18)
-```
-
-点击编译之后会在该 application 模块中生成 `__bus__.json` 文件
-
-```txt
-{
-  "startModule0": "boolean com.blankj.module0.Module0Activity.start(android.content.Context,java.lang.String,int)"
-}
-```
-
-
-## 高级使用
-
-参看本项目的组件化即可。
-
-主要文件:settings.gradle
-
-
-
-
-[logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo_static_bus.png
-[bus]: https://github.com/Blankj/AndroidUtilCode/utilcode/README-STATIC-BUS.md
\ No newline at end of file
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index c5d8430ca6..a07b9a3201 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -41,6 +41,11 @@ pt2Px      : pt 转 px
 px2Pt      : px 转 pt
 ```
 
+* ### Api 相关 -> [ApiUtils.java][api.java] -> [README][api.readme]
+```
+getApi: 获取 api 的实例
+```
+
 * ### App 相关 -> [AppUtils.java][app.java] -> [Demo][app.demo]
 ```
 registerAppStatusChangedListener  : 注册 App 前后台切换监听器
@@ -984,6 +989,9 @@ getComments       : 获取压缩文件中的注释链表
 [adaptScreen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
 [adaptScreen.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt
 
+[api.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
+[api.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/plugin/api-gradle-plugin
+
 [app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
 [app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
 
@@ -994,7 +1002,7 @@ getComments       : 获取压缩文件中的注释链表
 [brightness.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
 
 [bus.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
-[bus.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-STATIC-BUS.md
+[bus.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/plugin/bus-gradle-plugin
 
 [cacheDiskStatic.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
 [cacheDiskStatic.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/CacheDiskStaticUtilsTest.java
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 824d6d28fd..95b421d258 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -41,6 +41,11 @@ pt2Px
 px2Pt
 ```
 
+* ### About Api -> [ApiUtils.java][api.java] -> [README][api.readme]
+```
+getApi
+```
+
 * ### About App -> [AppUtils.java][app.java] -> [Demo][app.demo]
 ```
 registerAppStatusChangedListener
@@ -984,6 +989,9 @@ getComments
 [adaptScreen.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/AdaptScreenUtils.java
 [adaptScreen.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/adaptScreen/AdaptScreenActivity.kt
 
+[api.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
+[api.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/plugin/api-gradle-plugin
+
 [app.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/AppUtils.java
 [app.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/app/AppActivity.kt
 
@@ -994,7 +1002,7 @@ getComments
 [brightness.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/brightness/BrightnessActivity.kt
 
 [bus.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/BusUtils.java
-[bus.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/README-STATIC-BUS.md
+[bus.readme]: https://github.com/Blankj/AndroidUtilCode/blob/master/plugin/bus-gradle-plugin
 
 [cacheDiskStatic.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/main/java/com/blankj/utilcode/util/CacheDiskStaticUtils.java
 [cacheDiskStatic.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/CacheDiskStaticUtilsTest.java
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
index 482e06f2ea..cd3346f36d 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ApiUtils.java
@@ -87,7 +87,7 @@ private  Result getApiInner(Class apiClass) {
             }
         }
         //noinspection unchecked
-        return (Result) api.invoke();
+        return (Result) api;
     }
 
     private static class LazyHolder {
@@ -101,8 +101,5 @@ private static class LazyHolder {
     }
 
     public abstract static class BaseApi {
-        private BaseApi invoke() {
-            return this;
-        }
     }
 }
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
new file mode 100644
index 0000000000..d04b7e5e2e
--- /dev/null
+++ b/plugin/api-gradle-plugin/README.md
@@ -0,0 +1,310 @@
+# 一学就会的模块间通讯(ApiUtils)
+
+## 背景
+
+随着项目业务越来越多,开发出一套好的组件化方案势在必行,如果还在探寻一套好的组件化架构,那么 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 想必会是你的菜。
+
+组件化方案中各业务是相互隔离的,所以两个业务模块要通信的话,就需要通过路由或者接口下沉来完成,业界的方案都无法与 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 完美融合,所以我就只好自己动手来完成一个更方便、精简、完美的 `ApiUtils`,它功能类似 SPI,但比 SPI 更适合于 Android,而且功能更强大。
+
+在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 架构中,我们可以通过 ApiUtils 来自由调用各模块的 APIs,各业务通过对外提供的 `export` 模块来供其他业务方使用,各业务方只需实现自身的 `export` 中的 APIs 即可。其 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 结构如下图所示:
+
+
+![AucFrame](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png)
+
+`ApiUtils` 扮演的角色如下所示:
+
+![ApiUtilsPlayer](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
+
+图中还有提到 **[BusUtils](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/plugin/bus-gradle-plugin)**,这是一个比 EventBus 更高效的模块内通讯工具,想了解的可以点进去看看哈。当然,`ApiUtils` 不仅在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中可以使用,在正常项目中你也可以使用它来做业务隔离,下面来介绍其具体使用方式。
+
+
+## 使用
+
+在项目根目录的 `build.gradle` 中添加 `api` 插件:
+
+```groovy
+buildscript {
+    dependencies {
+        ...
+        classpath 'com.blankj:api-gradle-plugin:1.0'
+    }
+}
+```
+
+然后在 `application` 模块中使用该插件:
+
+```groovy
+apply plugin: "com.blankj.api"
+```
+
+给你的项目添加 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 依赖:
+
+```groovy
+api "com.blankj:utilcode:1.25.0"
+```
+
+如果你单纯只想引入 `ApiUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,然后在 app 下的 `build.gradle` 中 配置 api 的 SDL 域如下所示:
+
+```groovy
+api {
+    apiUtilsClass "com.xxx.xxx.ApiUtils"
+}
+
+android {
+    ...
+}
+```
+
+可以猜测到默认的 apiUtilsClass 为 `com.blankj.utilcode.util.ApiUtils` 哈。
+
+当然,如果你项目是开启混淆的话,全量引入 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 也是可以的,混淆会帮你去除未使用到的类和方法。
+
+好了,插件和依赖都配置完毕,下面就让我们在项目中使用吧,我们举一个实际的例子,比如 `login` 模块中存在 `LoginActivity`,`main` 模块存在 `MainActivity`,这两个模块是平行的关系,两者互不依赖,现在我们通过 `ApiUtils` 让 `LoginActivity` 来启动 `MainActivity`,在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中每个业务模块下都有 `export` 模块,类似于你们自己项目中的底层公共模块,因为是 `login` 来调用 `main` 模块,所以是 `mian` 模块需要提供 `api` 来供 `login` 来调,所以我们在 `main` 的 `export` 中加入一个继承自 `ApiUtils.BaseApi` 的抽象类 `MainApi`,并添加启动 `MainActivity` 的抽象方法,我们把方法搞得更复杂点,带上自定义的参数和返回值,具体如下所示:
+
+```java
+public abstract class MainApi extends ApiUtils.BaseApi {
+    public abstract MainResult startMainActivity(Context context, MainParam param);
+}
+
+public class MainParam {
+
+    private String name;
+
+    public MainParam(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+
+public class MainResult {
+
+    private String name;
+
+    public MainResult(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}
+```
+
+接下来我们在 `main` 模块新建 `MainApiImpl` 去实现这个抽象类,但需要额外做一步,**对该实现类加一个 `@ApiUtils.Api` 注解**,该注解是提供给 `api` 插件注入使用的,后面原理分析会提到,而且需要保证只能有一个空参的构造函数,因为后续调用的时候会用无参构造来生成实例,具体如下所示:
+
+```java
+@ApiUtils.Api
+public class MainApiImpl extends MainApi {
+    @Override
+    public MainResult startMainActivity(Context context, MainParam param) {
+        MainActivity.start(context, param);
+        return new MainResult("result");
+    }
+}
+```
+
+关于各模块的 `impl` 我建议最好放在各模块包名的最外层,这样方便打开这个模块源码就能找到这个模块向外暴露的 `apis`。
+
+注解 `@ApiUtils.Api` 中还提供了一个 `isMock` 的值,该值默认是 `false`,所以如上注解相当于 `@ApiUtils.Api(isMock = false)`,该值代表该接口是否用于 mock,一个 `api` 在项目中只有一个实现,所以在单模块调试的时候,该模块在通过 `ApiUtils` 调用其他模块 `api` 的时候,因为其他模块没有依赖进来,所以此时就需要 mock 其他模块的 `api`,防止因为找不到其他模块的 `api` 而 crash,在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中的 `mock` 层中我们就是这么做的,比如 `login` 模块在单独调试的时候,此时 `main` 模块是不存在的,我们就要写一个 mock 的 `api` 如下所示:
+
+```java
+@ApiUtils.Api(isMock = true)
+public class MainApiMockImpl extends MainApi {
+    @Override
+    public MainResult startMainActivity(Context context, MainParam param) {
+        ToastUtils.showLong("Start MainActivity succeed.");
+        return new MainResult("mock result");
+    }
+}
+```
+
+当 `MainApiImpl` 和 `MainApiMockImpl` 同时存在的时候,`api` 插件会让 `isMock = false` 为最终的 `api` 实现类,也就是 `MainApiImpl`,在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中,mock 层是在非全量 pkg 的情况下才会参与编译,所以不用担心最终全量的 app 中存有 `mock` 的冗余操作。
+
+下面就让我们在 `login` 中通过 `ApiUtils` 来调用 `mian` 提供的 `api` 吧,如下所示:
+
+```java
+MainResult result = ApiUtils.getApi(MainApi.class)
+        .startMainActivity(LoginActivity.this, new MainParam("MainParam"));
+```
+
+这里说明下,`ApiUtils.getApi(MainApi.class)` 这一步是懒加载的,也就是只会在第一次调用的时候才初始化,所以不用担心初始化的时候把所有业务 `api` 都一股脑实现降低效率的风险。
+
+现在,我们便可以运行一下查看是否可以跳转成功,`api` 插件还会在你的 application 目录下生成一份 `__api__.json` 的 api 列表文件,具体如下所示:
+
+```json
+{
+  "ApiUtilsClass": "com.blankj.utilcode.util.ApiUtils",
+  "implApis": {
+    "com/blankj/main/export/api/MainApi": "{ implApiClass: com/blankj/main/pkg/MainApiImpl, isMock: false }"
+  },
+  "noImplApis": []
+}
+```
+
+如果项目中并没有实现 `MainApi` 的话,为了确保项目不会因为 `ApiUtils` 在运行时崩溃,`api` 插件会使其在编译时就不过,此时 `__api__.json` 文件如下所示,提示你需要实现 `MainApi`:
+
+```json
+{
+  "ApiUtilsClass": "com.blankj.utilcode.util.ApiUtils",
+  "implApis": {},
+  "noImplApis": [
+    "com/blankj/main/export/api/MainApi"
+  ]
+}
+```
+
+好了,使用已经介绍完毕了,看完是不是觉得还不错,6 着干嘛,赶紧扣愣吧,结合 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 使用简直美哉哈。
+
+
+## 规范
+
+要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
+
+* `impl` 和 `api` 应该都是 `public` 的,而且 `impl` 中应该只存在一个无参的 `public` 构造函数(默认不写即可)。
+* `api` 中修改接口不要在老的接口上动手脚,更不要删除老的接口,而应该建立新的接口后,通知业务方来调用新的接口,还是上面的跳转 `main` 的例子,由于我们前期接口设计有问题,需要新增一个 `UserInfo` 的参数,具体如下所示:
+```java
+// old
+public abstract class MainApi extends ApiUtils.BaseApi {
+    public abstract MainResult startMainActivity(Context context, MainParam param);
+}
+
+// good
+public abstract class MainApi extends ApiUtils.BaseApi {
+    @Deprecated
+    public abstract MainResult startMainActivity(Context context, MainParam param);
+
+    public abstract MainResult startMainActivity(Context context, MainParam param, UserInfo info);
+}
+
+// don't
+public abstract class MainApi extends ApiUtils.BaseApi {
+    public abstract MainResult startMainActivity(Context context, MainParam param, UserInfo info);
+}
+```
+如果删除或修改老的接口的话,会导致其他模块还没来得及更新你的接口,从而调用你老的接口直接编译不过的问题。
+* 把 `impl` 放在业务包的最外层,开门见山,方便寻找。
+* 如果能结合 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 来使用,那就更规范不过了。
+
+
+## 原理
+
+### api 插件的作用
+
+可以参考下[源码传送门](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/api-gradle-plugin),插件通过 Gradle 的 transform 来完成对 `ApiUtils.init()` 做注入,下面来一步步分析:
+
+不明白 transform 的可以先去了解下,简单来说 transform 就是专门用来做字节码插入操作的,最常见的就是 AOP(面向切面编程),这部分我就不科普了,有兴趣的可以自己搜索了解。
+
+说到字节码操作,那就又有知识点了,想要上手快速简单的可以使用 `javassist`,不过,我选择了更强大快速的 `ASM`,这里我就不详细介绍了,有兴趣的可以自己去学习,`ASM` 其实也很简单的,在 [ASM Bytecode Outline](https://plugins.jetbrains.com/plugin/5918-asm-bytecode-outline) 这个插件帮助下写得还是很快的。
+
+通过 ASM 扫描出所有继承自 `ApiUtils.BaseApi` 的类,以及所有带有 `@ApiUtils.Api` 注解的类,然后保存起来,相关代码如下所示:
+
+```java
+@Override
+public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+    className = name;
+    superClassName = superName;
+    if ((mApiUtilsClass + "$BaseApi").equals(superName)) {
+        mApiClasses.add(name);
+    }
+    super.visit(version, access, name, signature, superName, interfaces);
+}
+
+@Override
+public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+    if (("L" + mApiUtilsClass + "$Api;").equals(desc)) {
+        hasAnnotation = true;
+        return new AnnotationVisitor(Opcodes.ASM5, super.visitAnnotation(desc, visible)) {
+            @Override
+            public void visit(String name, Object value) {// 可获取注解的值
+                isMock = (boolean) value;
+                super.visit(name, value);
+            }
+        };
+    }
+    return super.visitAnnotation(desc, visible);
+}
+
+@Override
+public void visitEnd() {
+    super.visitEnd();
+    if (hasAnnotation) {
+        if (!isMock) {// 如果不是 mock 的话,那么直接写入
+            mApiImplMap.put(superClassName, new ApiInfo(className, false));
+        } else {// mock 的话,如果 map 中已存在就不覆盖了
+            if (!mApiImplMap.containsKey(superClassName)) {
+                mApiImplMap.put(superClassName, new ApiInfo(className, true));
+            }
+        }
+    }
+}
+```
+
+然后往 `ApiUtils.init()` 插入扫描出来的内容,比如上面举例的 `MainApi`,那么其插入的代码如下所示:
+
+```java
+private void init() {
+    this.registerImpl(MainApiImpl.class);
+}
+```
+
+我们来看下 `registerImpl` 的实现:
+
+```java
+private void registerImpl(Class implClass) {
+    mInjectApiImplMap.put(implClass.getSuperclass(), implClass);
+}
+```
+
+很简单,就是往 `mInjectApiImplMap` 中插入了 key 为 `MainApiImpl` 的父类:`MainApi` 的 class,value 为 `MainApiImpl` 的 class。
+
+后面就让我们来看具体调用 `getApi` 的操作吧:
+
+```java
+public static  T getApi(@NonNull final Class apiClass) {
+    return getInstance().getApiInner(apiClass);
+}
+
+private  Result getApiInner(Class apiClass) {
+    BaseApi api = mApiMap.get(apiClass);
+    if (api == null) {
+        synchronized (this) {
+            api = mApiMap.get(apiClass);
+            if (api == null) {
+                Class implClass = mInjectApiImplMap.get(apiClass);
+                if (implClass != null) {
+                    try {
+                        api = (BaseApi) implClass.newInstance();
+                        mApiMap.put(apiClass, api);
+                    } catch (Exception ignore) {
+                        Log.e(TAG, "The <" + implClass + "> has no parameterless constructor.");
+                        return null;
+                    }
+                } else {
+                    Log.e(TAG, "The <" + apiClass + "> doesn't implement.");
+                    return null;
+                }
+            }
+        }
+    }
+    //noinspection unchecked
+    return (Result) api;
+}
+
+public abstract static class BaseApi {
+}
+```
+
+这段代码很好理解,而且加了同步锁操作,防止多线程生成多个 `impl`,然后,根据传进来的 `api` 的 class,我们通过注入的 `map` 中找到具体的 `impl` 的 class,如果缓存中有就取缓存中的,没有的话就通过 `newInstance` 来实例化一个 `impl`,并放入缓存中,最终返回其 `impl`。因为是通过 `newInstance` 来实例化 `impl`,这也解释了为什么 `impl` 中需保留无参构造函数,而且只有在使用时才会初始化,而不是一股脑把所有的 `api` 都初始化。
+
+简易实用,不到 100 行代码实现模块间跳转的 `ApiUtils` 已介绍完毕,接下来你就可以小试牛刀了。
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiTest.java b/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiTest.java
index 597e9f518a..94fdce9fe0 100644
--- a/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiTest.java
+++ b/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiTest.java
@@ -38,6 +38,13 @@ private static Map getApiImplMap() throws IOException {
         cr.accept(cv, ClassReader.SKIP_FRAMES);
 
         System.out.println("apiImplMap = " + apiImplMap);
+
+        apiClasses = new ArrayList<>();
+        cr = new ClassReader(TestApi.class.getName());
+        cw = new ClassWriter(cr, 0);
+        cv = new ApiClassVisitor(cw, apiImplMap, apiClasses, ApiUtils.class.getCanonicalName());
+        cr.accept(cv, ClassReader.SKIP_FRAMES);
+
         System.out.println("apiClasses = " + apiClasses);
         return apiImplMap;
     }
diff --git a/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiUtils.java b/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiUtils.java
index ef0ea2feb1..a8cf9237de 100644
--- a/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiUtils.java
+++ b/plugin/api-gradle-plugin/src/test/java/com/blankj/api/ApiUtils.java
@@ -86,7 +86,7 @@ private  Result getApiInner(Class apiClass) {
             }
         }
         //noinspection unchecked
-        return (Result) api.invoke();
+        return (Result) api;
     }
 
     private static class LazyHolder {
@@ -100,8 +100,5 @@ private static class LazyHolder {
     }
 
     public abstract static class BaseApi {
-        private BaseApi invoke() {
-            return this;
-        }
     }
 }
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
new file mode 100644
index 0000000000..13e32ea5c3
--- /dev/null
+++ b/plugin/bus-gradle-plugin/README.md
@@ -0,0 +1,686 @@
+## 比 EventBus 更高效的事件总线(BusUtils)
+
+## 背景
+
+设计这个 `BusUtils` 其实是在做 [ApiUtils](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/api-gradle-plugin) 时顺手做的,因为两者实现方式基本一致,设计前我也没想着要和 greenrobot 的 `EventBus` 一较高低,但设计完总需要一个对比,所以就拿业界最优秀的事件总线 `EventBus` 比较一下吧,然后就发现我这区区 300 行不到的 `BusUtils` 性能比 `EventBus` 要高出好多,当然,这一切的前提都是在 `BusUtils` 是切实可用并且有效的,它也是一款线程安全的事件总线,这些我都在单测中有做过实际测试的,不吹不擂,后面我们拿数据说话,有小伙伴不相信的话也可以通过下载我的源码来比较即可,单测地址:[BusUtilsVsEventBusTest](https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsVsEventBusTest.java),Android 测试地址:[BusCompareActivity](https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt),`BusUtils` 在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中的作用就是模块内传值,其扮演的角色如下所示:
+
+![BusUtilsPlayer](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
+
+下面介绍其使用:
+
+
+## 使用
+
+### 配置
+
+在项目根目录的 `build.gradle` 中添加 `bus` 插件:
+
+```groovy
+buildscript {
+    dependencies {
+        ...
+        classpath 'com.blankj:bus-gradle-plugin:2.0'
+    }
+}
+```
+
+然后在 application 模块中使用该插件:
+
+```groovy
+apply plugin: "com.blankj.bus"
+```
+
+给你的项目添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
+
+```groovy
+api "com.blankj:utilcode:1.25.0"
+```
+
+如果你单纯只想引入 `BusUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,记得还要拷贝 `ThreadUtils` 哦,然后在 app 下的 `build.gradle` 中 配置 bus 的 SDL 域如下所示:
+
+```groovy
+api {
+    busUtilsClass "com.xxx.xxx.BusUtils"
+}
+
+android {
+    ...
+}
+```
+
+可以猜测到默认的 busUtilsClass 为 `com.blankj.utilcode.util.BusUtils` 哈。
+
+当然,如果你项目是开启混淆的话,全量引入 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 也是可以的,混淆会帮你去除未使用到的类和方法。
+
+好了,插件和依赖都配置完毕,下面介绍基本使用。
+
+### 基本使用
+
+```java
+public static final String TAG_NO_PARAM  = "TagNoParam";
+public static final String TAG_ONE_PARAM = "TagOneParam";
+
+@BusUtils.Bus(tag = TAG_NO_PARAM)
+public void noParamFun() {/* Do something */}
+
+@BusUtils.Bus(tag = TAG_ONE_PARAM)
+public void oneParamFun(String param) {/* Do something */}
+
+@Override
+public void onStart() {
+    super.onStart();
+    BusUtils.register(this);
+}
+
+@Override
+public void onStop() {
+    super.onStop();
+    BusUtils.unregister(this);
+}
+
+BusUtils.post(TAG_NO_PARAM);// noParamFun() will receive
+BusUtils.post(TAG_ONE_PARAM, "param");// oneParamFun() will receive
+```
+
+使用过 `EventBus` 的肯定一下子就能看懂。
+
+### 高级使用
+
+#### 粘性事件
+
+支持粘性事件,也就是先发送,然后在订阅的时候接收到之前发送的粘性事件,把其消费掉,使用方式和 `EventBus` 一致,就是在 `@BusUtils.Bus` 注解中设置 `sticky = true`,具体例子如下所示:
+```java
+public static final String TAG_NO_PARAM_STICKY  = "TagNoParamSticky";
+
+@BusUtils.Bus(tag = TAG_NO_PARAM_STICKY, sticky = true)
+public void noParamStickyFun() {/* Do something */}
+
+BusUtils.postSticky(TAG_NO_PARAM_STICKY);
+
+BusUtils.register(xxx);// will invoke noParamStickyFun
+
+BusUtils.removeSticky(TAG_NO_PARAM_STICKY);// When u needn't use the sticky, remove it
+
+BusUtils.unregister(xxx);
+```
+
+#### 线程切换
+
+线程切换使用的是 ThreadUtils 中的线程池,它具有安全的 Cached 线程池,以及 MAIN, IO, CPU, CACHED, SINGLE 线程池,默认不设置的话就是在提交的线程 POSTING,使用的话就是在 `@BusUtils.Bus` 注解中设置 `threadMode = BusUtils.ThreadMode.xx` 即可。
+
+
+### 规范
+
+要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
+
+* 持有事件的类和函数确保确保都是 `public` 的。
+* 由于 `BusUtils` 是用于模块内调用,所以我们可以写一个 `BusConfig` 的类来保存一个模块内所有 bus 的 `Tag`,方便查找到使用方及调用方。
+* `Tag` 中最好还能带有业务模块后缀名防止重复,是 sticky 类型的话也带上 sticky,指定具体线程的话也带上线程名,例如:`update_avatar_sticky_main_info` 这个 `Tag`,让人直接望文生义。
+* 如果能结合 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 来使用,那就更规范不过了。
+
+
+使用已经介绍完毕,下面我们来和 `EventBus` 对比下性能。
+
+
+## 性能测试
+
+首先,我们把两者的事件定义好,因为比较的是事件达到的快慢,所以内部都是空实现即可,具体代码如下所示:
+```java
+@Subscribe
+public void eventBusFun(String param) {
+}
+
+@BusUtils.Bus(tag = "busUtilsFun")
+public void busUtilsFun(String param) {
+}
+```
+
+我们的 BusUtils 在编译时会根据 `@BusUtils.Bus` 注解生成一份记录 tag 和 方法签名的映射表,因为是在编译时完成的,这里我们通过反射来完成。
+```java
+@Before
+public void setUp() throws Exception {
+    // 这一步是在 AOP 的时候注入的,这里通过反射来注入 busUtilsFun 事件,效果是一样的。
+    ReflectUtils getInstance = ReflectUtils.reflect(BusUtils.class).method("getInstance");
+    getInstance.method("registerBus", "busUtilsFun", BusUtilsVsEventBusTest.class.getName(), "busUtilsFun", String.class.getName(), "param", false, "POSTING");
+}
+```
+
+我们通过比较如下几点的测试来完成对比:
+
+* 注册 10000 个订阅者,共执行 10 次取平均值
+* 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
+* 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
+* 注销 10000 个订阅者,共执行 10 次取平均值
+
+我们的测试机器如下所示:
+```
+macOS: 2.2GHz Intel Core i7 16GB
+一加6: Android 9 8GB
+```
+
+在 Android 上我们加入 `EventBus` 的注解处理器来提升 `EventBus` 效率,让其在最优情况下和 `BusUtils` 比较。
+
+接下来,我们把测试的模板代码写好,方便我们后续可以直接把两者比较的代码往回调中塞入即可,具体代码如下所示:
+```java
+/**
+ * @param name       传入的测试函数名
+ * @param sampleSize 样本的数量
+ * @param times      每次执行的次数
+ * @param callback   比较的回调函数
+ */
+private void compareWithEventBus(String name, int sampleSize, int times, CompareCallback callback) {
+    long[][] dur = new long[2][sampleSize];
+    for (int i = 0; i < sampleSize; i++) {
+        long cur = System.currentTimeMillis();
+        for (int j = 0; j < times; j++) {
+            callback.runEventBus();
+        }
+        dur[0][i] = System.currentTimeMillis() - cur;
+        cur = System.currentTimeMillis();
+        for (int j = 0; j < times; j++) {
+            callback.runBusUtils();
+        }
+        dur[1][i] = System.currentTimeMillis() - cur;
+        callback.restState();
+    }
+    long eventBusAverageTime = 0;
+    long busUtilsAverageTime = 0;
+    for (int i = 0; i < sampleSize; i++) {
+        eventBusAverageTime += dur[0][i];
+        busUtilsAverageTime += dur[1][i];
+    }
+    System.out.println(
+            name +
+            "\nEventBusCostTime: " + eventBusAverageTime / sampleSize +
+            "\nBusUtilsCostTime: " + busUtilsAverageTime / sampleSize
+    );
+}
+
+public interface CompareCallback {
+    void runEventBus();
+    void runBusUtils();
+    void restState();
+}
+```
+下面就让我们来一一对比测试。
+
+### 注册 10000 个订阅者,共执行 10 次取平均值
+```java
+/**
+ * 注册 10000 个订阅者,共执行 10 次取平均值
+ */
+@Test
+public void compareRegister10000Times() {
+    final List eventBusTests = new ArrayList<>();
+    final List busUtilsTests = new ArrayList<>();
+    compareWithEventBus("Register 10000 times.", 10, 10000, new CompareCallback() {
+        @Override
+        public void runEventBus() {
+            BusUtilsVsEventBusTest test = new BusUtilsVsEventBusTest();
+            EventBus.getDefault().register(test);
+            eventBusTests.add(test);
+        }
+        @Override
+        public void runBusUtils() {
+            BusUtilsVsEventBusTest test = new BusUtilsVsEventBusTest();
+            BusUtils.register(test);
+            busUtilsTests.add(test);
+        }
+        @Override
+        public void restState() {
+            for (BusUtilsVsEventBusTest test : eventBusTests) {
+                EventBus.getDefault().unregister(test);
+            }
+            eventBusTests.clear();
+            for (BusUtilsVsEventBusTest test : busUtilsTests) {
+                BusUtils.unregister(test);
+            }
+            busUtilsTests.clear();
+        }
+    });
+}
+// MacOS Output:
+// Register 10000 times.
+// EventBusCostTime: 427
+// BusUtilsCostTime: 41
+
+// 一加6 Output:
+// Register 10000 times.
+// EventBusCostTime: 1268
+// BusUtilsCostTime: 399
+```
+
+### 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
+``` java
+/**
+ * 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
+ */
+@Test
+public void comparePostTo1Subscriber1000000Times() {
+    comparePostTemplate("Post to 1 subscriber 1000000 times.", 1, 1000000);
+}
+// MacOS Output:
+// Post to 1 subscriber 1000000 times.
+// EventBusCostTime: 145
+// BusUtilsCostTime: 33
+
+// 一加6 Output:
+// Post to 1 subscriber 1000000 times.
+// EventBusCostTime: 1247
+// BusUtilsCostTime: 696
+
+private void comparePostTemplate(String name, int subscribeNum, int postTimes) {
+    final List tests = new ArrayList<>();
+    for (int i = 0; i < subscribeNum; i++) {
+        BusUtilsVsEventBusTest test = new BusUtilsVsEventBusTest();
+        EventBus.getDefault().register(test);
+        BusUtils.register(test);
+        tests.add(test);
+    }
+    compareWithEventBus(name, 10, postTimes, new CompareCallback() {
+        @Override
+        public void runEventBus() {
+            EventBus.getDefault().post("EventBus");
+        }
+        @Override
+        public void runBusUtils() {
+            BusUtils.post("busUtilsFun", "BusUtils");
+        }
+        @Override
+        public void restState() {
+        }
+    });
+    for (BusUtilsVsEventBusTest test : tests) {
+        EventBus.getDefault().unregister(test);
+        BusUtils.unregister(test);
+    }
+}
+```
+
+### 向 100 个订阅者发送 * 10000 次,共执行 10 次取平均值
+```java
+/**
+ * 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
+ */
+@Test
+public void comparePostTo100Subscribers10000Times() {
+    comparePostTemplate("Post to 100 subscribers 100000 times.", 100, 100000);
+}
+// MacOS Output:
+// Post to 100 subscribers 100000 times.
+// EventBusCostTime: 139
+// BusUtilsCostTime: 79
+
+// 一加6 Output:
+// Post to 100 subscribers 100000 times.
+// EventBusCostTime: 3092
+// BusUtilsCostTime: 2900
+```
+
+### 注销 10000 个订阅者,共执行 10 次取平均值
+```java
+/**
+ * 注销 10000 个订阅者,共执行 10 次取平均值
+ */
+@Test
+public void compareUnregister10000Times() {
+    final List tests = new ArrayList<>();
+    for (int i = 0; i < 10000; i++) {
+        BusUtilsVsEventBusTest test = new BusUtilsVsEventBusTest();
+        EventBus.getDefault().register(test);
+        BusUtils.register(test);
+        tests.add(test);
+    }
+    compareWithEventBus("Unregister 10000 times.", 10, 1, new CompareCallback() {
+        @Override
+        public void runEventBus() {
+            for (BusUtilsVsEventBusTest test : tests) {
+                EventBus.getDefault().unregister(test);
+            }
+        }
+        @Override
+        public void runBusUtils() {
+            for (BusUtilsVsEventBusTest test : tests) {
+                BusUtils.unregister(test);
+            }
+        }
+        @Override
+        public void restState() {
+            for (BusUtilsVsEventBusTest test : tests) {
+                EventBus.getDefault().register(test);
+                BusUtils.register(test);
+            }
+        }
+    });
+    for (BusUtilsVsEventBusTest test : tests) {
+        EventBus.getDefault().unregister(test);
+        BusUtils.unregister(test);
+    }
+}
+// MacOS Output:
+// Unregister 10000 times.
+// EventBusCostTime: 231
+// BusUtilsCostTime: 23
+
+// 一加6 Output:
+// Unregister 10000 times.
+// EventBusCostTime: 800
+// BusUtilsCostTime: 199
+```
+
+### 结论
+
+为了方便观察,我们生成一份图表来比较两者之间的性能:
+
+![BusUtilsVsEventBusChart](https://github.com/Blankj/AndroidUtilCode/blob/master/art/busutil_vs_eventbus.png)
+
+图表中分别对四个函数在 MacOS 和 OnePlus6 中的表现进行统计,每个函数中从左向右分别是 「MacOS 的 BusUtils」、「MacOS 的 EventBus」、「OnePlus6 的 BusUtils」、「OnePlus6 的 EventBus」,可以发现,BusUtils 在注册和注销上基本比 `EventBus` 要快上好几倍,BusUtils 在向少量订阅者发送多次事件比 `EventBus` 也快上好多,在向多个订阅者发送多次事件也比 `EventBus` 快上些许。
+
+基于以上说的这么多,如果你项目中事件总线用得比较频繁,那么可以试着用我的 `BusUtils` 来替代 `EventBus` 来提升性能,或者在新的项目中,你也可以使用性能更好的 `BusUtils`。
+
+
+## 原理
+
+### bus 插件的作用
+
+可以参考下[源码传送门](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/bus-gradle-plugin),插件通过 Gradle 的 transform 来完成对 `BusUtils.init()` 做注入,下面来一步步分析:
+
+不明白 transform 的可以先去了解下,简单来说 transform 就是专门用来做字节码插入操作的,最常见的就是 AOP(面向切面编程),这部分我就不科普了,有兴趣的可以自己搜索了解。
+
+说到字节码操作,那就又有知识点了,想要上手快速简单的可以使用 `javassist`,不过,我选择了更强大快速的 `ASM`,这里我就不详细介绍了,有兴趣的可以自己去学习,`ASM` 其实也很简单的,在 [ASM Bytecode Outline](https://plugins.jetbrains.com/plugin/5918-asm-bytecode-outline) 这个插件帮助下写得还是很快的。
+
+通过 ASM 扫描出所有带有 `@BusUtils.Bus` 注解的函数,读取并保存注解的值和函数的参数信息,相关代码如下所示:
+
+```java
+@Override
+public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+    className = name.replace("/", ".");
+    super.visit(version, access, name, signature, superName, interfaces);
+}
+
+@Override
+public MethodVisitor visitMethod(int access, String funName, String desc, String signature, String[] exceptions) {
+    if (cv == null) return null;
+    MethodVisitor mv = cv.visitMethod(access, funName, desc, signature, exceptions);
+    busInfo = null;
+    mv = new AdviceAdapter(Opcodes.ASM5, mv, access, funName, desc) {
+        @Override
+        public AnnotationVisitor visitAnnotation(String desc1, boolean visible) {
+            final AnnotationVisitor av = super.visitAnnotation(desc1, visible);
+            if (("L" + mBusUtilsClass + "$Bus;").equals(desc1)) {
+                busInfo = new BusInfo(className, funName);
+                funParamDesc = desc.substring(1, desc.indexOf(")"));
+                return new AnnotationVisitor(Opcodes.ASM5, av) {
+                    @Override
+                    public void visit(String name, Object value) {// 可获取注解的值
+                        super.visit(name, value);
+                        if ("tag".equals(name)) {
+                            tag = (String) value;
+                        } else if ("sticky".equals(name) && (Boolean) value) {
+                            busInfo.sticky = true;
+                        }
+                    }
+                    @Override
+                    public void visitEnum(String name, String desc, String value) {
+                        super.visitEnum(name, desc, value);
+                        if ("threadMode".equals(name)) {
+                            busInfo.threadMode = value;
+                        }
+                    }
+                };
+            }
+            return av;
+        }
+        @Override
+        public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) {
+            super.visitLocalVariable(name, desc, signature, start, end, index);// 获取方法参数信息
+            if (busInfo != null && !funParamDesc.equals("")) {
+                if ("this".equals(name)) {
+                    return;
+                }
+                funParamDesc = funParamDesc.substring(desc.length());// 每次去除参数直到为 "",那么之后的就不是参数了
+                busInfo.paramsInfo.add(new BusInfo.ParamsInfo(Type.getType(desc).getClassName(), name));
+                if (busInfo.isParamSizeNoMoreThanOne && busInfo.paramsInfo.size() > 1) {
+                    busInfo.isParamSizeNoMoreThanOne = false;
+                }
+            }
+        }
+        @Override
+        public void visitEnd() {
+            super.visitEnd();
+            if (busInfo != null) {
+                List infoList = mBusMap.get(tag);
+                if (infoList == null) {
+                    infoList = new ArrayList<>();
+                    mBusMap.put(tag, infoList);
+                } else if (infoList.size() == 0) {
+                    mBusMap.put(tag, infoList);
+                } else if (infoList.size() == 1) {
+                    BusInfo info0 = infoList.get(0);
+                    info0.isTagRepeat = true;
+                    busInfo.isTagRepeat = true;
+                } else {
+                    busInfo.isTagRepeat = true;
+                }
+                infoList.add(busInfo);
+            }
+        }
+    };
+    return mv;
+}
+```
+
+然后往 `BusUtils.init()` 插入扫描出来的内容,比如上面提到的 `oneParamFun` 这个函数,那么其插入的代码如下所示:
+
+```java
+
+private void init() {
+    this.registerBus("TagOneParam", "com.blankj.bus.BusTest", "oneParamFun", "java.lang.String", "param", false, "POSTING");
+}
+```
+
+我们来看下 `registerBus` 的实现:
+
+```java
+private void registerBus(String tag,
+                         String className, String funName, String paramType, String paramName,
+                         boolean sticky, String threadMode) {
+    mTag_BusInfoMap.put(tag, new BusInfo(className, funName, paramType, paramName, sticky, threadMode));
+}
+```
+
+很简单,就是往 `mTag_BusInfoMap` 中插入了 key 为 `tag`,value 为 `BusInfo` 的一个实例,这样我们便把一个事件保留了下来。
+
+接下来就是使用了,一开始我们都是先 register,源码如下所示:
+
+```java
+public static void register(final Object bus) {
+    getInstance().registerInner(bus);
+}
+
+private void registerInner(final Object bus) {
+    if (bus == null) return;
+    String className = bus.getClass().getName();
+    synchronized (mClassName_BusesMap) {
+        Set buses = mClassName_BusesMap.get(className);
+        if (buses == null) {
+            buses = new CopyOnWriteArraySet<>();
+            mClassName_BusesMap.put(className, buses);
+        }
+        buses.add(bus);
+    }
+    processSticky(bus);
+}
+```
+
+我们获取 bus 的类名,然后对 `mClassName_BusesMap` 加锁来把它插入到 `mClassName_BusesMap` 的 value 的集合中,可以看到我们用了线程安全的 `CopyOnWriteArraySet` 集合,然后还需要处理下之前是否订阅过粘性事件 `processSticky`,到这里 register 便结束了。
+
+然后就是 `post` 来发送事件了,我们分析下源码:
+
+```java
+public static void post(final String tag) {
+    post(tag, NULL);
+}
+
+public static void post(final String tag, final Object arg) {
+    getInstance().postInner(tag, arg);
+}
+
+private void postInner(final String tag, final Object arg) {
+    postInner(tag, arg, false);
+}
+
+private void postInner(final String tag, final Object arg, final boolean sticky) {
+    BusInfo busInfo = mTag_BusInfoMap.get(tag);
+    if (busInfo == null) {
+        Log.e(TAG, "The bus of tag <" + tag + "> is not exists.");
+        return;
+    }
+    if (busInfo.method == null) {
+        Method method = getMethodByBusInfo(busInfo);
+        if (method == null) {
+            return;
+        }
+        busInfo.method = method;
+    }
+    invokeMethod(tag, arg, busInfo, sticky);
+}
+
+private Method getMethodByBusInfo(BusInfo busInfo) {
+    try {
+        if ("".equals(busInfo.paramType)) {
+            return Class.forName(busInfo.className).getDeclaredMethod(busInfo.funName);
+        } else {
+            return Class.forName(busInfo.className).getDeclaredMethod(busInfo.funName, Class.forName(busInfo.paramType));
+        }
+    } catch (ClassNotFoundException e) {
+        e.printStackTrace();
+    } catch (NoSuchMethodException e) {
+        e.printStackTrace();
+    }
+    return null;
+}
+
+private void invokeMethod(final String tag, final Object arg, final BusInfo busInfo, final boolean sticky) {
+    Runnable runnable = new Runnable() {
+        @Override
+        public void run() {
+            realInvokeMethod(tag, arg, busInfo, sticky);
+        }
+    };
+    switch (busInfo.threadMode) {
+        case "MAIN":
+            Utils.runOnUiThread(runnable);
+            return;
+        case "IO":
+            ThreadUtils.getIoPool().execute(runnable);
+            return;
+        case "CPU":
+            ThreadUtils.getCpuPool().execute(runnable);
+            return;
+        case "CACHED":
+            ThreadUtils.getCachedPool().execute(runnable);
+            return;
+        case "SINGLE":
+            ThreadUtils.getSinglePool().execute(runnable);
+            return;
+        default:
+            runnable.run();
+    }
+}
+
+private void realInvokeMethod(final String tag, Object arg, BusInfo busInfo, boolean sticky) {
+    Set buses = mClassName_BusesMap.get(busInfo.className);
+    if (buses == null || buses.size() == 0) {
+        if (!sticky) {
+            Log.e(TAG, "The bus of tag <" + tag + "> was not registered before.");
+            return;
+        } else {
+            return;
+        }
+    }
+    try {
+        if (arg == NULL) {
+            for (Object bus : buses) {
+                busInfo.method.invoke(bus);
+            }
+        } else {
+            for (Object bus : buses) {
+                busInfo.method.invoke(bus, arg);
+            }
+        }
+    } catch (IllegalAccessException e) {
+        e.printStackTrace();
+    } catch (InvocationTargetException e) {
+        e.printStackTrace();
+    }
+}
+```
+
+可以看到代码还是比较多的,不过别急,我们一步步来还是很简单的,首先去我们注入的 `mTag_BusInfoMap` 中查找是否有该 `tag` 的 `BusInfo`,没有的话就输出错误日志直接返回。
+
+然后我们根据获取到的 `BusInfo` 来找到 `method` 实例,`BusInfo` 第一次会把 `method` 保存在实例中,之后调用的话直接从实例中取出 `method` 即可。
+
+接着我们从 `BusInfo` 中取出线程信息,最后在线程中执行 `method` 的反射,大体就是这样,具体细节的话还是需要自己分析源码。
+
+最后就是 `unregister` 了:
+
+```java
+public static void unregister(final Object bus) {
+    getInstance().unregisterInner(bus);
+}
+
+private void unregisterInner(final Object bus) {
+    if (bus == null) return;
+    String className = bus.getClass().getName();
+    synchronized (mClassName_BusesMap) {
+        Set buses = mClassName_BusesMap.get(className);
+        if (buses == null || !buses.contains(bus)) {
+            Log.e(TAG, "The bus of <" + bus + "> was not registered before.");
+            return;
+        }
+        buses.remove(bus);
+    }
+}
+```
+
+`unregister` 和 `register` 相反,就是从 `mClassName_BusesMap` 的 value 集合中移除,同样需要对 `mClassName_BusesMap` 加锁哦。
+
+
+## 总结
+
+下面我来总结下 `BusUtils` 的优点:
+
+* `BusUtils` 是通过事件 `Tag` 来确定唯一事件的,所以接收函数支持无参或者一个参数,而 `EventBus` 只能通过 MessageEvent 来确定具体的接收者,只能接收一个参数,即便仅仅是通知,也需要定义一个 MessageEvent,所以,`BusUtils` 传参更灵活。
+* `BusUtils` 在应用到项目中后,编译后便会在 application 中生成 `__bus__.json` 事件列表,如上生成的事件列表如下所示:
+
+```json
+{
+  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
+  "rightBus": {
+    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
+    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param), threadMode: POSTING }"
+  },
+  "wrongBus": {}
+}
+```
+
+我们修改 `oneParamFun` 为两个参数的话,为了确保项目不会因为 `BusUtils` 在运行时崩溃,`api` 插件会使其在编译时就不过,此时 `__bus__.json` 文件如下所示,提示你参数个数不对:
+
+```json
+{
+  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
+  "rightBus": {
+    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
+  },
+  "wrongBus": {
+    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param, java.lang.String param1), threadMode: POSTING, paramSize: 2 }"
+  }
+```
+
+同理,如果两个 bus 的 `Tag` 相同了,也会编译不过,提示你项目中存在 `Tag` 相同的 bus。
+
+所以,`BusUtils` 比 `EventBus` 更友好。
+
+* `BusUtils` 比 `EventBus` 代码少得太多,`BusUtils` 的源码只有区区 300 行,而 `EventBus` 3000 行肯定是不止的哈。
+* `BusUtils` 比 `EventBus` 性能更好,下面我们会来对其进行性能对比。
\ No newline at end of file

From 6d34d1db7eaed9eb35ecbab0252da454ef9a68f4 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Thu, 18 Jul 2019 22:21:33 +0800
Subject: [PATCH 007/173] see 07/18 log

---
 plugin/bus-gradle-plugin/README.md | 99 +++++++++++++++---------------
 1 file changed, 48 insertions(+), 51 deletions(-)

diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index 13e32ea5c3..d72f8ab332 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -114,7 +114,7 @@ BusUtils.unregister(xxx);
 要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
 
 * 持有事件的类和函数确保确保都是 `public` 的。
-* 由于 `BusUtils` 是用于模块内调用,所以我们可以写一个 `BusConfig` 的类来保存一个模块内所有 bus 的 `Tag`,方便查找到使用方及调用方。
+* 由于 `BusUtils` 是用于模块内调用,所以可以写一个 `BusConfig` 的类来保存一个模块内所有 bus 的 `Tag`,方便查找到使用方及调用方。
 * `Tag` 中最好还能带有业务模块后缀名防止重复,是 sticky 类型的话也带上 sticky,指定具体线程的话也带上线程名,例如:`update_avatar_sticky_main_info` 这个 `Tag`,让人直接望文生义。
 * 如果能结合 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 来使用,那就更规范不过了。
 
@@ -124,7 +124,7 @@ BusUtils.unregister(xxx);
 
 ## 性能测试
 
-首先,我们把两者的事件定义好,因为比较的是事件达到的快慢,所以内部都是空实现即可,具体代码如下所示:
+首先,把两者的事件定义好,因为比较的是事件达到的快慢,所以内部都是空实现即可,具体代码如下所示:
 ```java
 @Subscribe
 public void eventBusFun(String param) {
@@ -135,7 +135,7 @@ public void busUtilsFun(String param) {
 }
 ```
 
-我们的 BusUtils 在编译时会根据 `@BusUtils.Bus` 注解生成一份记录 tag 和 方法签名的映射表,因为是在编译时完成的,这里我们通过反射来完成。
+`BusUtils` 在编译时会根据 `@BusUtils.Bus` 注解生成一份记录 tag 和 方法签名的映射表,因为是在编译时完成的,这里我们通过反射来完成。
 ```java
 @Before
 public void setUp() throws Exception {
@@ -145,22 +145,22 @@ public void setUp() throws Exception {
 }
 ```
 
-我们通过比较如下几点的测试来完成对比:
+通过比较如下几点的测试来完成对比:
 
 * 注册 10000 个订阅者,共执行 10 次取平均值
 * 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
 * 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
 * 注销 10000 个订阅者,共执行 10 次取平均值
 
-我们的测试机器如下所示:
+测试机器如下所示:
 ```
 macOS: 2.2GHz Intel Core i7 16GB
 一加6: Android 9 8GB
 ```
 
-在 Android 上我们加入 `EventBus` 的注解处理器来提升 `EventBus` 效率,让其在最优情况下和 `BusUtils` 比较。
+在 Android 上,我们加入 `EventBus` 的注解处理器来提升 `EventBus` 效率,让其在最优情况下和 `BusUtils` 比较。
 
-接下来,我们把测试的模板代码写好,方便我们后续可以直接把两者比较的代码往回调中塞入即可,具体代码如下所示:
+接下来,我们把测试的模板代码写好,方便后续可以直接把两者比较的代码往回调中塞入即可,具体代码如下所示:
 ```java
 /**
  * @param name       传入的测试函数名
@@ -378,6 +378,42 @@ public void compareUnregister10000Times() {
 
 基于以上说的这么多,如果你项目中事件总线用得比较频繁,那么可以试着用我的 `BusUtils` 来替代 `EventBus` 来提升性能,或者在新的项目中,你也可以使用性能更好的 `BusUtils`。
 
+下面我来总结下 `BusUtils` 的优点:
+
+* `BusUtils` 是通过事件 `Tag` 来确定唯一事件的,所以接收函数支持无参或者一个参数,而 `EventBus` 只能通过 MessageEvent 来确定具体的接收者,只能接收一个参数,即便仅仅是通知,也需要定义一个 MessageEvent,所以,`BusUtils` 传参更灵活。
+* `BusUtils` 在应用到项目中后,编译后便会在 application 中生成 `__bus__.json` 事件列表,如上生成的事件列表如下所示:
+
+```json
+{
+  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
+  "rightBus": {
+    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
+    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param), threadMode: POSTING }"
+  },
+  "wrongBus": {}
+}
+```
+
+修改 `oneParamFun` 为两个参数的话,为了确保项目不会因为 `BusUtils` 在运行时崩溃,`api` 插件会使其在编译时就不过,此时 `__bus__.json` 文件如下所示,提示你参数个数不对:
+
+```json
+{
+  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
+  "rightBus": {
+    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
+  },
+  "wrongBus": {
+    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param, java.lang.String param1), threadMode: POSTING, paramSize: 2 }"
+  }
+```
+
+同理,如果两个 bus 的 `Tag` 相同了,也会编译不过,提示你项目中存在 `Tag` 相同的 bus。
+
+所以,`BusUtils` 比 `EventBus` 更友好。
+
+* `BusUtils` 比 `EventBus` 代码少得太多,`BusUtils` 的源码只有区区 300 行,而 `EventBus` 3000 行肯定是不止的哈。
+* `BusUtils` 比 `EventBus` 性能更好,下面我会来对其进行性能对比。
+
 
 ## 原理
 
@@ -479,7 +515,7 @@ private void init() {
 }
 ```
 
-我们来看下 `registerBus` 的实现:
+来看下 `registerBus` 的实现:
 
 ```java
 private void registerBus(String tag,
@@ -489,7 +525,7 @@ private void registerBus(String tag,
 }
 ```
 
-很简单,就是往 `mTag_BusInfoMap` 中插入了 key 为 `tag`,value 为 `BusInfo` 的一个实例,这样我们便把一个事件保留了下来。
+很简单,就是往 `mTag_BusInfoMap` 中插入了 key 为 `tag`,value 为 `BusInfo` 的一个实例,这样便把一个事件保留了下来。
 
 接下来就是使用了,一开始我们都是先 register,源码如下所示:
 
@@ -515,7 +551,7 @@ private void registerInner(final Object bus) {
 
 我们获取 bus 的类名,然后对 `mClassName_BusesMap` 加锁来把它插入到 `mClassName_BusesMap` 的 value 的集合中,可以看到我们用了线程安全的 `CopyOnWriteArraySet` 集合,然后还需要处理下之前是否订阅过粘性事件 `processSticky`,到这里 register 便结束了。
 
-然后就是 `post` 来发送事件了,我们分析下源码:
+然后就是 `post` 来发送事件了,源码如下:
 
 ```java
 public static void post(final String tag) {
@@ -617,7 +653,7 @@ private void realInvokeMethod(final String tag, Object arg, BusInfo busInfo, boo
 }
 ```
 
-可以看到代码还是比较多的,不过别急,我们一步步来还是很简单的,首先去我们注入的 `mTag_BusInfoMap` 中查找是否有该 `tag` 的 `BusInfo`,没有的话就输出错误日志直接返回。
+可以看到代码还是比较多的,不过别急,我们一步步来还是很简单的,首先在我们之前注入的 `mTag_BusInfoMap` 中查找是否有该 `tag` 的 `BusInfo`,没有的话就输出错误日志直接返回。
 
 然后我们根据获取到的 `BusInfo` 来找到 `method` 实例,`BusInfo` 第一次会把 `method` 保存在实例中,之后调用的话直接从实例中取出 `method` 即可。
 
@@ -644,43 +680,4 @@ private void unregisterInner(final Object bus) {
 }
 ```
 
-`unregister` 和 `register` 相反,就是从 `mClassName_BusesMap` 的 value 集合中移除,同样需要对 `mClassName_BusesMap` 加锁哦。
-
-
-## 总结
-
-下面我来总结下 `BusUtils` 的优点:
-
-* `BusUtils` 是通过事件 `Tag` 来确定唯一事件的,所以接收函数支持无参或者一个参数,而 `EventBus` 只能通过 MessageEvent 来确定具体的接收者,只能接收一个参数,即便仅仅是通知,也需要定义一个 MessageEvent,所以,`BusUtils` 传参更灵活。
-* `BusUtils` 在应用到项目中后,编译后便会在 application 中生成 `__bus__.json` 事件列表,如上生成的事件列表如下所示:
-
-```json
-{
-  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
-  "rightBus": {
-    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
-    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param), threadMode: POSTING }"
-  },
-  "wrongBus": {}
-}
-```
-
-我们修改 `oneParamFun` 为两个参数的话,为了确保项目不会因为 `BusUtils` 在运行时崩溃,`api` 插件会使其在编译时就不过,此时 `__bus__.json` 文件如下所示,提示你参数个数不对:
-
-```json
-{
-  "BusUtilsClass": "com.blankj.utilcode.util.BusUtils",
-  "rightBus": {
-    "noParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#noParamFun(), threadMode: POSTING }",
-  },
-  "wrongBus": {
-    "oneParamFun": "{ desc: com.blankj.utilcode.pkg.feature.bus.BusActivity#oneParamFun(java.lang.String param, java.lang.String param1), threadMode: POSTING, paramSize: 2 }"
-  }
-```
-
-同理,如果两个 bus 的 `Tag` 相同了,也会编译不过,提示你项目中存在 `Tag` 相同的 bus。
-
-所以,`BusUtils` 比 `EventBus` 更友好。
-
-* `BusUtils` 比 `EventBus` 代码少得太多,`BusUtils` 的源码只有区区 300 行,而 `EventBus` 3000 行肯定是不止的哈。
-* `BusUtils` 比 `EventBus` 性能更好,下面我们会来对其进行性能对比。
\ No newline at end of file
+`unregister` 和 `register` 相反,就是从 `mClassName_BusesMap` 的 value 集合中移除,同样需要对 `mClassName_BusesMap` 加锁哦。
\ No newline at end of file

From 7d8417b3103a324c1ada1ca2d9c5172b6b4d399f Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Thu, 18 Jul 2019 23:33:11 +0800
Subject: [PATCH 008/173] see 07/18 log

---
 art/communication.png              | Bin 19441 -> 19063 bytes
 plugin/api-gradle-plugin/README.md |  56 ++++++++++++++++++---
 plugin/bus-gradle-plugin/README.md |  77 +++++++++++++++++++++++++----
 3 files changed, 116 insertions(+), 17 deletions(-)

diff --git a/art/communication.png b/art/communication.png
index 5c96c01f34d47740e22a543d45c5d2287086aeca..f3d68d0b10b84561f6efb2f8e448a7712e86084a 100644
GIT binary patch
literal 19063
zcmeFZRX|(s69pLDrBI4n1$XygMG6FWZ=tvpcej=zEyW#*1ugDcpg^%ga0nDD8r*{H
z<+uCaec#vJhj2q6$#>_TIdkUBmweQKC=%dO;etRQ0%aw6Ef5G51q4E2!^Q+2`D`7I
z0~~N%l?>fMAUx8?8ww~Rivk2<04dAM==fyqFM9`QZ{Bwwk1Mwtw_;7CNTSnB6yQH0
z*3^(T`$d3qM@ljkKAiu^BUPOalULotTn#p5-wUuT0~(@nf!r
z6x$hpR#=}}Y;sX|-bHUg!$FN8M)mmc;R9aCq*^vHimlNP$W+xrtLI*>TK2aTNEnFP
z7uVKID|9)dxFbC=@yK7BS)tzX`1p8AjcJORj`vG_tKCbwgXfb0?U`bRhyAuc)3l|J
zTTP#inG?89EG{B%38;mh3VZ%B;xpA|&P$)@@9*d2NmtDUg?|C%iN;_mq^TBL1FttO
z?D&aq$^|8Yr`ng|_#+#W
zn-Z1j;X(IBdAE1dafUR?i=G`z`OfJS;AQ|AHzseU)3ek?*rrwxU>u@g$B2
zxr-Km2iuD8{z-Vm^1q^
z4ljW?u&WZ*+&6>%r1TTdvB%CGD|?DT?t2(OVh~a3*|tlNMvnIlnJ3qcM_ixw!0X&9
zyFX_!84XU07s2~Ye#O?|%p#ttALaNKp6JA7|hFKbOIf_r(Vzb@KeMBjkp6YoG9gfeYWf
z8Z~WjJ7`-nQyMWV{6uQ?WjghX`D;Y%6>{EZ&ku1#0>UN465F>44n2-%ky;;Lv-ey2
z%*Da6{~n3a)6+u=%DoYjQBWA*D4aC-mXvg=VrRGWoc+$^@?YM4s^7=v^xF!Pz
zv(aX0D5am|cY^DS3gp!%d4n%H{ZK%3D4XcHsRypABcy23b_&af`VB>c*;hy;(dpUQ
zXA~B0ZZKiq>>iq&oLqHTwfpztVyPeR1_>YfqKOi)b`N;R;P5U}9i8cLDJdyQs?+wv
z$N01)ilGqf|4LmJ=`5wSo;REMCGp*xiE(RK*b?oJ=&?Wk5Zt@??3*xIKV8-WvF@gb
z!=NcddN4r3C^;#$ba*w)Z_8lTyXD1~r1C`zmLn@<_+9xv{O*4FUmyYD2x{wwVacpI
zRg}IGCHaF(q)Kji<5_dk(a{lW%FgfKzsHT5obR4WD=GcrG&D3k&ET>w5dGp1Y8(F&
z+twmwSUO`R!o`EJl3N_IEq-D20+Ew&_|pK&?5_Qi(!rQiR3NU(8(|4w+!mu@21r4)
zO_o)au$%q+wMa;{ccxSVYoG5G`_?gx%{8?8(m6eqpKmn>(2^~1-wgJF>w1-%>xrN0lHUo)>
zU6fwg?jhFJp1c>JI*pBuz08*IJxR{W%EGY8*s4qaUxJn`?df^8%c^|z_m@lF
z1Tx1v&AU;}`u+f~d9{eM>eWQW>6yHkx_U)zyW0)>c-vPxZ{laqgk(yluF*EOw(jwt
zZftIH5)cy7Roi7K%FF*GproWk=rjcbmp^Ii1`YJ@+%LDLrpE66{+=8$UsuAdF?W<(
z5EKy=1=*X(?_&;WU@)$pjYdaDKjUU$p;)bw3HgsiJy9b>&@3%2X9_|pDk^e8wRLsD
z^~S+!ymN~&UM^HSSq}U5i&V&Bpk;l91
z9`WQrve0aS@=8l>9qjFQ!v_=SgI|h^`{zvBR&-_9%EtJ;5Ji#AVlp>}dp!ma1s}6-
zC@d_j0W?29k0WVC=skbJLQ0tx(wK)~D7GKJLVxW$*(eSLfkklm6&w^wxlwZ-o1=~r%XMcBH1
zC1v<&hf7G6xq&lCuwhQ_Y<7GeUI)-P-ueB5gI)L%gy?{v!)Z9sAO%7l^cYOj`I(WC@<3_n?pI?oJ04L+bEIJmeVp07qrSoeN?c`%x3_;=y$)Ivqu7IJQ0h@~{!NvPI}vygG8()=#4Qy!qf@P%arp7RB`cs%(
zsBX&a%Rp;^LGlKNs`O4HKtzuKB3g3~RZZNB39BAKomW%iT2~~SeOC^Et;9NWVnU;Y
z3>_#S%nK#_&!4}|urAKa%bT&Ey}rHt}H1{7Y)+Jw|p4Zz<=$h;Fyj$*@oW*&=0$J*t%QeX3SJnfo4F`)wAme
zgu0oT*?~XoH~Y(%8-63I@854RZ)MyOp80h=rq&{ek&$s0K+~C7-gHoAOiWDhjz?==
zK|w*bjEsyvCMITleZ|PHUp`%p5mr`K?c`6Md`K;}Tk-3Vs!>d!+k4DP>bLhGHOSvup@+1A{bYFdQHXbs!BMlvPyxp^fhPGi~08jisd}I4&MulYNHX3RJgz
zEya^5X-LD!C_{7V-iA#;;9Ern$0!YUO(62ZkG89a%#GHzaTZ0BUP1WTzP~Gn>bv1C+;eUS8g6MMcFf
zS_%r0h1$cPA4#iG=LPqJ2AI@ye&1cfiSh(><3miaGB!P>r={IccSC=ust=FTqQrDE
zeQfXOv2ywdvKSxfm_K!cg)XA{Z}1$o>H0*cPIzDVH7<$9K$;E*H7tJK%VEZDSrE_8+yBR7+E
zo5o;-+Phz-Ko-lbo;CriK%pN>v2#!9n5sp7{rYtSK#fySP|%01JLjR%(Ywi@%tFP4
zm1i_G0q=m5Y{)2XVB_Rm_CMJeng{d%7r6hujZLt&o?atAz>A?FAtCv6baYNAY;0_Q
zaB*>Ga)9Ew47_F~>>&5+SH3bpDAL#4!*;dQrX)TApz=Cjx`5!tbvLUBf5
zw7j6;c^yCo4*%hNhLphh#Ok~xUC=?Va2xxVXZN+#MaHTagFT~+w4}(5oZ_&%Zo1J`
zNRnd*@-0Z>mVg2mroT_RGpGLv=p-l|jFMct8dg#~!Le{|s=c!Sw9dQmuO8-m2{41I
zLY^`*fXem~s(H$i`-mp_z*gfUCT4NTdP9%0&~lNbqR9efu`9uZ%KoAne<>Z~j_Z
zT8CwJ;wr+OFjfwZ+cx0jjMNr&N}8KRHYf7s3bQNSy;gSrxb4sVz=CYwo>!KkqO=eS
zwC#nshN7d`luE#p`f}&lK9+EPd<7^gG42U|~!jZXz+TcAy~_ni0M
z@6e|uH|6Ua{%<+7!Dqk=!>Y^
z@O2mp20ZPojHRgcDeDswl;jjh#3TUyoX`J(_P@n{0T%zS8!5>;(g?#8N-3w;EwMu$
zIoLS$jsnm$F7eD!;JSyu>BTDM4>)ik92Dm(p?+++ln|<1H;!?At($1o#RYSHemync
zgj2H4tWWEEes&bHB^lRZl)LvAU+)KRo0O1+0i4+_pB$^DR_k3F|2JUqX-m60+82;mg}{D?
zC?}sdSP6zobO@m0faJ;I$N+Tb&6{A!(<&3YMxnND{V6j=!CFDsna)@btgtP%XfY0G
ztPYjMeF?F*|JK2owI2KKW3Y|nJ?#m~gui~CFNNrtCXvML2=7zBztpBmZF@wdq9Spy
zLItgFB;8Pz>}SVfx?c}ffOaL?dVnvxuXcEklQ4KPZr^Fm2QzsM5Z=DdHh&%*`+%06
zIY7E~Dv&A!9aLZx_vCS9h9+1)?GhPQ@gvX0m8BI2=^u8)#HvYwz5|F&38HQ98kz0`
zsfgJ^*!->R^Yp9Nns;X+l_ylwrgaA$xQL)zR9+kBAch8p1(En(ij^;KG3)GP_2l*FCxgStZpPu<*&hN6{
zqr-okGUx@D=pJgw0^9Y+o7subM|QmxV}K+9xMQhlb1?m(&y~4%{*zD^xv)S;PJ6nY
z*uv?u?-@Obq!f85;{10<;L+mFy}3o#Au$RLdbq$K1P6r_x{Di^jQno+!2U_%mjGB7
z^pwUi(pv|o#ebS80Kf%^I8cpG+1&FLH!nq3nruKJp7M1*sZ;eE#?sW&t>w^Vw+V^Q
zXFfjUmE8IrlNW&x+>gzn@5i2>@n9`(@_wo;FOUUa`pw18l#QYs6GVVeZR)1A)>IA?
z6)2N`_CiF^fM)dTu#*e>C&%URlx^SIyB-vsr@pJSnzALvu+lm)^%p>643h4Vfd!Tn
zi9$9e)+0F$Vjj@ZfucV=JKB-uE^7NQC4JhS-;a(JO#iAf@
z`wTA|xmOSYb+!2f&@WGE0r2B8cZX3`AXi^pA3!HW=mk4!Sr5I>01^fmrO=mZ(qG?#
z&o;~82|`D=__dv0KGrg7lHMi9Aq82p|lBR5#9!@
zPF1S;BCyZuwV}@5Et1g
z>Pqqo%zu*m^=Ki082GT-jq-V5m)-hfow~F%2n`dzG*B)J3pMU_6Yo|C1
zyismSdfQY+dhqt9g2H1)7xn3AY9PbJx1Gej5ZgCeDwHvRmxLl8bn(-UzVNDf
zS8b%Jva%3ANwe-^Y?Iu0)dQ>@sbCoIolH;11Y3(KMjP#GsBlne%Hb@-ue$w*Q=5y#
zwX;vcmK0ne`ywoggWW9k$J9Ej)8R$XzrWtI`1a9A^L0+TPC%mFjx|%s~l1gqB5(X(au=0shfDK4q_x
zQgh7k&_ViO8qnw<-or<=q{WxBD3f#FA=3OBDLbQEcHw}Kz&CFAwLoof`~fTkq5Pz;
z#F|=Vus=68gZ_x-!$ab~D+|))&Mg&mg0(a5=Rtv_uUYRO%iHZ+T*{*ZHm`eR0b6$3
z9Cf>^p}XyRCi>6c>HLFe7F)m5Z8N4F$ZW<)Kouq}B%`yLtI~y5YV{#yxcwk5R-W(ep*t|Lc(BV5(nm$n
zG~Y)9Nn?O$7lo9KHpCb*!k%IYFuqHF^o;9Hf8e2rG%$X8yk9@=!}jKkCbN0~2mGUe
zlbwt5U7%qtp7@FzF<=PkJoVRb>rJS-+?PSvbZe|C545rrM3oVOfwioWnJ6q7Q)AO7
z#@m#;ja|>e(LII>&tu-<-&kVErE>i!cG$ScZFxHtrf@H0-vl%uxvET41R<7VS)y73
z3}Z^0Adu}>5P*>aR%PG{t&!>BmU761oFz}rH1-ehb;$YV72zaqS$^N{^8Wio19IeR
z_>`&P`Flsc*Q_X36;7i!%21Q3E;*?VI(VpeL?w<^CcCz+OWmj1|#1MvCI
z)HbHt)YfP^zao+6_!AzgI1-6^o{ZxBsg`?HZC21Pj4&!TCr`#loB&Q5Q&gqKK~m}k
zB~f=z!Z^xm`@>6ONhZn=vhV>5mNR*qS-Y4!gXLsJmO2(y`~EF)E)aM!u8AjbP
z3Dv7v)4}f!Ww3X@7I{nIH6C_EBpJn@9>2a-$`VQ*%Sj_;_N%4XDM6Q^2S@`p8!Nayd2F
zY?mNp@^*bz;&TL%s?F5`97;0?luNm1oYubzia=NWPx-7SwE`A(4#u8NCoBSglG5xa
z96ZA1tZW*eNrVV1N;jw0F@iuXgfRomGSd8yemdd1I0rf=KMANGr}z&E1;GPe6r)j1
z-wzq|<%)6jjbvP6TjRT$FUp;6*4JDte*G;vdpJ?wt7VK$HFChoR2>BqX#nYz^ae%R
z%$?vrv>q!HPkfF%8~T1wT6lJiP}l>#Y&B9KIgMrA_@stcq2_PzHR@A7baqzMP4F9z?mptIw09WfdW_C@ypfg|TCGg8F
zX0g7gaEQ4oN{hd&5+GzU#x^v}=1iR6op*}vU{rVYCVG?)7vjcf|6L4VqQt*Ose`$y
z!O8+?cfh*owruOBgO+I+#*Fb=nzIQoD
zI))#Z-@4*?g@#0;qi{w*O6q0`l7NR>zc5HQ$2~qPgtuEZyr-tUY-&on-D0|QYEh5{
zJtqLSG=J{9lSlxsVn^0T><|ZL*>N*L`jXl*ZOhx{48WMg6i`E=8kE`@1>=AsN~z08
z8J32D^*=+!Glj2T!t>SXDTMIv@7wORb*`^cR^p1`gt@SWzXh1ov$9>WtGhprE+Har
z-!GP{+MWenJ<+QSX%=DO3VXPpy>2u^;qm;G(dlUqJ0I`BaTvkWU4OL!cgCIS9H_D!`XEQbX
zKL71ohL`AJVbkrKX;a1e%Z^?jYbNu
zXq$BIg6~^0WJ!y|V<~_W~PMy{+d2
z?g9SQ?KoJ3fU>Ut7+I1N5r#@;W#U`JsU-3cAmaIElY-;HloR<^Wv-1}OM9)|Y|Lfl
zLKH8>IuA8BK}v5517o+W^Msv!q|v2iH#TLyj*(YW&3nJJ_~DMi<6mA1t=RWs_HlDh
z-MavD*=Au@LSoK|>9XCx(q7OqqhfRqX;CvUS_w2X+Qt9CHr#gCFoF&@-
zy{s9X;{x{bSm?M^bd{-&X=o*meO(}OHHR|s>-(naCj%w~(O((o%$*8n)R?)&bsiDZxmegKlw%BnOgu269;#n@hI`vk5F0@b)wL#Z`d
zYAr4gYu+Xs5kY&G%e3vgwCxg;(8eFI0s>Y$=3U1`cLje}+4k2u!h_E5O!*19{t*~A
zcB2t>9~U02t0!ims)I4+=Uwm4U6BVNqRbXc25F9CWy)$8qx3>9x~Gcq(wB7c-1@sB
z*o-DX;@MgjFBjyPk&^1ZZnGYlJ~1v4f!|+0bi?%f?$LImgfFNJj;POPB3wu9=epn@
zf=2CUFLNL8R5QNUUXqf4NImur0~UD;on#_k#nLitmL4$SHfA~uYc2}qtU%kBPf$g^
zU^*@KR(M;yA$ZM(_#K9al-p9K_<%v9j9RFPVNN@{4ZX9xi{e)wPt4zCg@2{yv9evh03#&M?-%xteoxtpvHZMl+}wns
zT5J|X&v`X62h}W_9E@h-od)S7Uvuc)ql`;oJ@`U&xm4#+Fnp6CP?^7G#wnezgQPf2
z(AiVVm%=p*bwE7bRc;$dgj^5`euvIzYO)Nxv&Q2`2H1xt>rxp(C$T>mpAz
z-}BA~vkvezI)^FlEF9D#I@V;`iXRqU&ZQ2~6Al{DKKs&VFDBZu+n6l*@ci}~OX7@S
ze`V7OEy;e^=O6KJb5H^pMJ`I(f0O@r0APMC`sj=wdXHL4
z^9hO2Zo$fPz9^%N=YC{M^+$Xs4rx10Ib=;Y=JHXR1@wF{jGPpr-LT2zDtkY1M#`+y
zcrGeQn|fL6PXbZ%WNqPUITtc$SL#Th$TxeT*j?Gw8ua<%fOh1MxEEAz-VejX@0A6i
z;~3bygZiMeX%?P}&y|XFuejJREAXVUel5%n<7Y&8qXS$S|d!MSspCT{%
z3e0KQ#aA4Jx7=e|g2K!}pDCP;SIU`hPuvge$YrPH!$6a=Cg7PAGO0kZ3Ij`Hatd5Z
zJ1EY=G;6#}_tBc`Ro?K|&Q;Wg{nPQa8q*?C|8c2mHWEyX9_}t3(}#aup|XS4ZQhH;
z!cMvkN1W=@4f9R
z%|3JQrN#kz`4Ca!o0s$bC9J(htZB*Qu60q=Z
zQefmToh$xcTI_OhQoGs&*Xi%ts|puKG*$W^ziRejz^6jDv*X!T@wqMA9e2M1opoX7
z_$hdvQ`1#tJabkF5r&7oj)fl9S>s6@zm#wV%fBvTw%5PApguzoEw`4v4^v4g9rMWg
z82`ibcB)hI_6n{27Wbv&YYcQI*lSk^-OmA89~KT1d>`qO_@g9KjXDpUC3oT58tj>h
z$X|MimhyrJb>$KlI=O}Ew*|$=xa#tr
zOfZs7sFqF(hfS8U2~oxEO87~(-%thIHMD++jx00zG_8}&e$quh9b|1CkKFNCUCTEs
zDw+@?soggs&7l73$crZHx~|)=ez4a*J_n0BCTVD1yV}H3`^herC&r4|9O}9zioJ&
z8ch%$50-jQErsO+nt$`<7w_=t_C+%C`nyp=#?y;yHvR80&fPAAT@^ZA7&F4qQ3^0J
zys&PMu}lO?cU$B3EC(+#E)zb7!OGW;o(y(giF<^2?yYTT(hT4d>q=fn_+c~?qyM_(
zl-GV#iIi&Y`GIJhL-WoW13^9GjR`XCtVSUI3*%i(+ptd2to0#suT
z^&3!7(5`~e+X$-YP8H$vZ|N!T>B>8!7=w+Qyl5;D=_N4aw=$@b%+z$A9H__|Mqi?>
ze+7SFU{{HwtO*ofa_w-s3nyC03BtnH8S%T&T0YBAZFJ&XT=E77oP7~9lR>%V>)K8F
z5I}Q#Q@&7Kfq!wpPvmH&U*#;iLaGk!@xix_-+PoQjSV>XSfkn<9Ddmj#_wAu#kI}h
zO~eIUKomJYClIw?Kr`rs$9{lAW-RTcgn@x&HV=x_J+{|DJ?B)W3)F0L>~d$tlt4M)
zpkX&ED-FBDzwgq0&F{2k&}A&F(im26?HH!k(XSRcYc=v9nuc
z#&a62<)WZL$b;=@e9wEzJ(a)!xNJ--u*bFDm6vz77~aDFvr&7by#v-BC>c83+dDn-
z_g|2RmntnHiD;T{MC~K6!agotg!hu=h}J__G_00R(s9uVj#J&0U(DHp(xeu?v=1G;
zy`ZizMSG~9Xl!>UKVKQA!M{BMcV{`>FON4K{6&hKv*lY*`WB#Zo{L
z%9{eaYK>~JgmJ-_kc*#08h@My(9gj?b`Vps_5fvr~&(q_{gNj`IM6nuwa9!#)4
z*yrs2M0PW?se@L0+FuqGpYr{P9=#jc=eC7L(}$p=pX*RqFV>km++AA9E1g%Uhe05Pc%9L8scXES<
z8r*|nKfj&Zw^nF>Q&wWJ`G!IQJ)SO%bcfi5@YDOzS||O?
zlc1K2vGJlelVJ^S8F+Ttj*i06{7qEQrVsuD{04f=vkiI7+p8D9{jhF`LI&x=%d6@!
zK;Ce)krZfF2%<}0?axe=Zo@IV`wRyc8_C!X=7D%`gtEP1P|*2~VJ*6X8A`dHj5G+J
z0_0>=KI|O*y8&U-g}K}+^MP05?x_Z50=Rf4u47>4Q}^HgR2_OONx#zKcXb5sdq1vyrEy{nfsj)~
zMLTqFcm4lf{gz*w&{d&A8MULA(2^JR?_3vSVLPgbD5w-VZfrRnGrxAnqP|{R4gKv!
z`MTF)BP=UtlO0wr#%}{n?PxiL3K7&RL4>gI1m|kZ&O7x<^`o?cc3vC5?vK*@f5>ZY
zYP_r<)DR&%@bL|MtmTF-&*uB9KW=@3^TU;#w6g}8mFX7ee&_W@n)zb8^C=*rB{(+y
z_oA-|;~1vLj(G^*{$-mzrLJ$gZrQtPPtclI;p%4U!Y*}8M$6YJ27n~h)PgMj&kgKZ
zAjUCVE=fZ?M)_=j;Qv=33uMj^SeHwM3TNe`9sHJm)O1tLeHcGe5?tw+ZmXI|v|lqV
z2^L;BaXv>~UHE9fA&b<+j3hpk{)84$3PW_sL%}p&G_S*ml|Tphy{f?tN?MS3z=d63jtce~E+7_4bye{rBBV7EPtR3Sb-ECx
z<}&dak9`oGd2!U^3&d!nFxYks9+j20(gPWk$<#vA8ack4vO<|NOXh7@5sO
zG5sqFH07*~0xE?>stS4x`Oo5C{p;JE#bX>(0JgtrmIK}c8TJlyIh=`;V8E<0XG!sM
z#JfSub+Lb*Ic!u0bqdSBP=wOkScBFHJo_*OzglXMNSt7|pFgX2D)*ymcYFHzG_+8W
zk&7_sj)032O*08@2&aT3f5|-%j$(V
z0|(7Qlm6h*k;YVHBpV2%dwVn?w`#`MJB2+Y8^8Pv-Ik-=n)#2WK@-#cE%uKrP3+pAtJ$z>3rIJ>WLrj6G~;G-@IAP_I4aWo@;X>-n5`1FUrULMn#(Qny8ppL$Ow`G_Q`Cl^~j?q&7C?
z9`GP>4LL|iIsBdVRPo|PHs5?>z?Exq@mG>$alW16g$GR8m?_47peFAUVM+CUHSg_znbz3BrqI_&w}nS6YE
zv%Pypn@X*J9IRgUA8joj{XJ#ddl(1HxI{pH5L4pN2catx%0Zsp-o`E9}-&aB@WrrfgvgtDfcgBP@G
zobEjQNK@nSxNyue6C5HUSdps&W`JnP#rVqz5n7-jea0qiygbLzhwih9TNE!OL~XSA5PU84>*LJ!}Kg0
z^W9_!hWzKPcX52iXp&zXt*+ba^mGPVF8TOuTF2OxGIfNUSa~%KjR8Z9vOlq{k7AMmPBFC{^<;
zm#yC}D;a2i0fQVL9ak694Rm(FW{f{~fSCZLsOZ6KiMF4_9^>-3TU;fMmzJuVn2!&*
zE?fKjRDcD5NH>CxNQ-bjUYYY#Jd|^5#>T3!rgdffsr;CR`)NW^k=XUX8u-YP+I7!6
z`5-;*%Nv{Wec2d9xigz-Ybmoexm6X15RXikAS>p2li{S6GODVb}Lmytf_n2k#uECy`#pN2|dA@2utj35^d
z=IfJ8G+pdi8eei=10T(@>beokS67##r_?&=!~j?12{1l^TLwCzgye_q3wQP>ev7)q
zFg@ONBjU-*o!G^zfDKt`b@)9**TIM>_mGpI?UOX48}vHD8FGOKsy_{d?E^
z_hh%JV~fh?L9QFyd$}xyGA^-Z{`~Y6Q!h^2$rWR2soVW$eAqN0O)T2*2m>o+V<1Y`
zoxQOX!k9wRNca8z41pd;IM=c+sOG~94&ElzJp5uvC}$=k`{22U*t^`SVP~&DNtT`f
z(o^rM!qO@Er{UX(Y}cbiBX7Vv@A|Opc{JmgM{}4o93m?~jDwm%Y03`1jWXY;`EApE
z{q(lx(}|>F)}i*rCF4n#ag_deJUXOnV9m0|
z_Sv6!xk1R$zB`X)!MhLA)_u`^YvGBhC1Rr}SGVpW0n_KF%l_OE=w(!w-b?wYA%V#0
zI9^^&C+!xIJa=*tkBJZS!tl^kVToh(3Ue%#l+c6(`!JCmOd7ViyUwNaGuU^x)_vG3
z?9!1-pUXbielloqgfCe7Ryq%TB@j#MN`nmVJB=P0Nt;L2)Zi1@W>o;A3iOnyt#4Xj
zRR8+IS=AxswSlkS)3wmwepcLb4SNrfKXu)|UrzMG4cy}?F??v%3*r>PPLsfpx{}rn
zIX%(JKB+L>3s@vK*HSyjB+wFG6gBT%S8wskftaq%u<~4yP>5*g+Ox9)nyK4eT~1n%
z_C^{80_jBd-+gplK8J?Wsc=UY6}e7X8PriVKA>Hv>t0HFzRB*Y4M)<%KIf3cGzu_P
z-#qZVp~Hh+UTjn8`W~%&>l~e}DXy-UXK*yyp)spNA!&MdWnTQ>VCqJh+-1}+seqkb
zqiTXL1~T4^Oh}a9w|I1#rAeIYWDWNux{-`?@x~*QDWT|?dJ5!5UD*xyH!8{Hi{;KD
zD;riYu1>KAf_3E2b^FZkFRxBid>+u!++yDe1*YIl>M14eT9m4g3z}=8x^xj}YC=2i
zf!1>bd@aAs!;VL&SNW6;55MBN-P3oWTG_N~uwgH&rC
z25kPEz*<1_%a>(_+@1~^DNvJo^ntjgahTI}@hEi2TX
z*?ETxu`2aU022Zxa35Esu-S(tZhmdgG3{jobQmj(MkTI2^h{qv!}D`k)O3gV71mtm
z$dR7CmApnJlU|ied%XbdV?1Mlc&hdfIlgIn^_SK=-qUccw~L38?PzCqWJl_zR3q%Y
znaUV7{Ojq~WrTzjSzxK()u~t$X}^P)Mmrk{e64Zp!b^T49r)}tfnh{@V;P*pu{sXDC~6eXRIMx&p4JE#1Hl!aS(
zJLsE`vtLHkGyzH6>;LderL;mGdvuK?zWJpwOhi}cF&HEv{(9ZtE}#MF>lIf7b9(m+
zX(c84a2KCA$W(}T)aP=>@TQUJE7)6fQ+e<>=3{}xj!4vt!DCzM`26B8c9FIogYi(p
z9KVYQNVd-2ry`ZLWPMt9BO{^zh2k@pKw`H8ccI0h+nbq(xGh91;s_6iLLB`}km!7M
zs+ydPQuOKl33H3f_=~Hx%!z1>Cns}OxLcLq1uW@{#0ghnbuW4nAWVq6+=+mt7Kxh1
z+Mu@tEaTo!pMo9QNR4$5^kM4nQ-rg#j@7Me;bVBcWXzj5~
zAJPb2lV`e_frzD%$_lXlx4h5K=X%rMjL;ZIr;~9SMVB={&Fz%TV9<@T-qoQ1S8Z93
zHSWwP69`SuD5v{2x#yLf4pYKT^^{Q6U=*Qd(s$Oe(464Mjy=g4AE@<#=Y#wq)~=C2O<~
z|B!#Zi-|LYW4ks?lEixTp4DvITZaBgSXo6@ZHFQYJhxz%a!&V|qi^SxtmoY6DYyMm
z_J4y<-4Ti2fWn5{aWM?=E%wx*#tY(jYOK?3aXR;PKV8GIa>7j(+UFLBm-c=uOBqeH
zfi1f-N1vXsb-)8E7Z%}Sx|O*+3IxBkwF(v{x90@q96yayPg1S;tLv`p%{{?9iyqCC
zE~)M`k9wj%CnnbV9o&8#wX2~#1toOUN%w!crnJm3Y4DOcFY+`duD8yCqez@c>u8GY
zQ;Ku9j#m7`RX#d6pl<4&I`nk=kg0e@5|%PWkCVIaECunQHw~
zuC(<~zDVj$F>TTF)uC6=t@!Bjag|9~2KvQerSs2Z!QpM#>Z!U82n3~GZ(0faqA#<6
zbM@CfnIJivAUEj!p6HKX&K#k<`sJ7A2MV6;4pDxgxCVzA`76uO00>u+)q{y{TAo|(
z8zP;3+%K9r$=hSUDev4g(JH&fEs)3Q%-vl#@!ee(Fd0C>AQ0=!RvS*qj~qbCt<
znEP+T{p9UzWz~wC2z&E^w+|jvPrr*@mO<3^CZ?yZj@MlUV2wVzPtP+%Gzo<9?MvaB
zh0|v#oQ;H`RHvs>5A9Uj7I%Kl_5z=23&q~tTu{TP|DKSsOq48%u~as#EYTeelAVuFm%@de1fqhewo$Kl&9cVgp{JKn1?DnygamTJ&`D7
zK1I@NOu>W7YZsG}U~#93zKPU@nrhVhQQZyAr(7}4B{w+D4pFU^Ui-Gj)pmJ1YbCjs
zHwW=3Kgs%FF(KF2HO|>oW)wQxGJ7*UD%@q)UH4&4He~|je{G0Lta41OA*d+vq6N$bh7^}
z0g2$_G(mcOpm$@)UQCcoAQ(o=-TmdoL`U@cUW_S%y{BjOptAVxb~@=U<_VM?&b2(9
zEWoKYT2lO1=MrKM$|72cc3{>seYh~@v6N8FjgoU-qV=9H#sX@uR!G0f>NWXvX;_}Z
z8gljpTZodfrtn(vReQ<}8oOS%H#~i+QMH5H=)3dP>2^6UMyrSBU<)Fs+vNN%9}CtN
zcnm6~?%XU6-l)lta+{kM<}}exNmJc=Q8)D9hx1xRSnF!fsMh@MQ?L1KtIRTkCMgc;
zzUaqquc!WK5DjM(!;TZ&GezkI#i$x98j~}Pb2tvnFVxeeq@X7BIy3EeNq&1gg1MQ-
zr!5Z#mBWYH+Khe5apmiS(@E#Bb%f?%JTO54KP7mALdZw4Xut?x?gyQnnT
z0iZx%1pB_ih!K4D4B&l--Fj^CVpIoB*V;Y*a|D(gx9*g+^+XdlhiSzY5nTi$8cmaV
zM~{%Ly0!Z@^bVz60_MLxwkt9@+4#6_>
zmfDru6q@s^M~`{66Sq+
zLoVO<^@l@q{BJx2okPyW4GKD|cbdf29Y$VyhReSLyxnW87)}+{l-eKfiyd>%S00-7
z{3Y)`Q%y9e4x9%$;>$XgQ3N50@hRg+={bsdf{dAK3!DV;0TD21h0<=8qNE2?Briw?2w=1j7jd`sa;Cc!gxVTeW4*g-^xAN#EL
zrU8m=`RC>0hipOC&mT2=Li#%c1@-MEoYJM!%Dz7x9c)7(P9#q&zf^KmH
z^zv{EoBRJ7*FuF(U>}`IoOQx6QK(+NoOAx;G9DHzx!N2EiGSzi7fpDyojcLlvF-)F
z1|4c7n9N$)3R71D9L=?-VGlU`PEToWe(iw+X
z<#OguUXF$sa~!2kom_g!94hxMDT--cwsGWOH9~1K+lpjZF8f+G?5w}yJb%ISygomC
zetAFd&po1pvDuRaW!2ZwU=|&e+XOdq1b)ww@BAjc(Dx%~
z9+=a{sJ15XsjJKP9M^;-ZKp|%xrkA?t!00w2Q*#~sw7ZcgP>p#a~)EG7RXTGIr<71-Au)Zdj2xq
z?7*{g(UX<%Yd)8`kq(y!Y-%C})&r}D!G^2L%e?V_`eTYjQC)A})~$60;WcmS(mrZvYZDcg
zW0pg*nB>`7iDs9}J;UOG7&T~sk4zDPQWtnRz2KL0Iz69NiYu}(xHByb94S0{|8$Z%
zQQXMkhH15%#ML!zejGd>ElIs@|6-s&-(v)XAx<3_lUX0##d~qyzmm%Yoy{iSf|NP=
z18MRN`B0;xCN1?dk5pDK{9uvItewa4;>L
zp1PMqscw-~Wg?z*7<{yWSW)X3aY20bzh3=Gbq!sqriL+-58g5oI#gZFS<@tqz`jI3
zG5;%0s$qe`LbpD!+NyQnvBGbh^x!iy%q^Gdn{Kt|b}j4K&x=6rUDL6v!?b~mFPNqO3F-+_Yk
z`Y>sYgA}*K46k1c)?LiRvM%oQkE;le7pUK@kbS^3mav{c-}7k2G2KP!}DGdufec`hLDlqGjk;iuu~*3;FpreQti
zRB~0por2$7kQO|ik2SUd1p*bno=T4DszXoq$b8i*r~i3i+2A94t=Vyj*K@va;_c~o
J>WTX$@_*nY;cWl_

literal 19441
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
bLR1 apiImplEntry : mApiImplMap.entrySet()) {
+                mv.visitVarInsn(Opcodes.ALOAD, 0);
+                mv.visitLdcInsn(Type.getType("L" + apiImplEntry.getValue().implApiClass + ";"));
+                mv.visitMethodInsn(Opcodes.INVOKESPECIAL, mApiUtilsClass, "registerImpl", "(Ljava/lang/Class;)V", false);
+            }
+        }
+    };
+    return mv;
+}
+```
+
+### ApiUtils 原理分析
+
+接下来看下 `ApiUtils.registerImpl` 的实现:
 
 ```java
 private void registerImpl(Class implClass) {
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index d72f8ab332..73b6a2b2ae 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -109,7 +109,7 @@ BusUtils.unregister(xxx);
 线程切换使用的是 ThreadUtils 中的线程池,它具有安全的 Cached 线程池,以及 MAIN, IO, CPU, CACHED, SINGLE 线程池,默认不设置的话就是在提交的线程 POSTING,使用的话就是在 `@BusUtils.Bus` 注解中设置 `threadMode = BusUtils.ThreadMode.xx` 即可。
 
 
-### 规范
+## 规范
 
 要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
 
@@ -125,6 +125,7 @@ BusUtils.unregister(xxx);
 ## 性能测试
 
 首先,把两者的事件定义好,因为比较的是事件达到的快慢,所以内部都是空实现即可,具体代码如下所示:
+
 ```java
 @Subscribe
 public void eventBusFun(String param) {
@@ -136,6 +137,7 @@ public void busUtilsFun(String param) {
 ```
 
 `BusUtils` 在编译时会根据 `@BusUtils.Bus` 注解生成一份记录 tag 和 方法签名的映射表,因为是在编译时完成的,这里我们通过反射来完成。
+
 ```java
 @Before
 public void setUp() throws Exception {
@@ -153,6 +155,7 @@ public void setUp() throws Exception {
 * 注销 10000 个订阅者,共执行 10 次取平均值
 
 测试机器如下所示:
+
 ```
 macOS: 2.2GHz Intel Core i7 16GB
 一加6: Android 9 8GB
@@ -161,6 +164,7 @@ macOS: 2.2GHz Intel Core i7 16GB
 在 Android 上,我们加入 `EventBus` 的注解处理器来提升 `EventBus` 效率,让其在最优情况下和 `BusUtils` 比较。
 
 接下来,我们把测试的模板代码写好,方便后续可以直接把两者比较的代码往回调中塞入即可,具体代码如下所示:
+
 ```java
 /**
  * @param name       传入的测试函数名
@@ -202,9 +206,11 @@ public interface CompareCallback {
     void restState();
 }
 ```
+
 下面就让我们来一一对比测试。
 
 ### 注册 10000 个订阅者,共执行 10 次取平均值
+
 ```java
 /**
  * 注册 10000 个订阅者,共执行 10 次取平均值
@@ -251,6 +257,7 @@ public void compareRegister10000Times() {
 ```
 
 ### 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
+
 ``` java
 /**
  * 向 1 个订阅者发送 * 1000000 次,共执行 10 次取平均值
@@ -298,6 +305,7 @@ private void comparePostTemplate(String name, int subscribeNum, int postTimes) {
 ```
 
 ### 向 100 个订阅者发送 * 10000 次,共执行 10 次取平均值
+
 ```java
 /**
  * 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
@@ -368,7 +376,7 @@ public void compareUnregister10000Times() {
 // BusUtilsCostTime: 199
 ```
 
-### 结论
+## 结论
 
 为了方便观察,我们生成一份图表来比较两者之间的性能:
 
@@ -376,9 +384,9 @@ public void compareUnregister10000Times() {
 
 图表中分别对四个函数在 MacOS 和 OnePlus6 中的表现进行统计,每个函数中从左向右分别是 「MacOS 的 BusUtils」、「MacOS 的 EventBus」、「OnePlus6 的 BusUtils」、「OnePlus6 的 EventBus」,可以发现,BusUtils 在注册和注销上基本比 `EventBus` 要快上好几倍,BusUtils 在向少量订阅者发送多次事件比 `EventBus` 也快上好多,在向多个订阅者发送多次事件也比 `EventBus` 快上些许。
 
-基于以上说的这么多,如果你项目中事件总线用得比较频繁,那么可以试着用我的 `BusUtils` 来替代 `EventBus` 来提升性能,或者在新的项目中,你也可以使用性能更好的 `BusUtils`。
+基于以上说的这么多,如果你项目中事件总线用得比较频繁,那么可以试着用我的 `BusUtils` 来替代 `EventBus` 来提升性能,或者在新的项目中,你也可以直接使用性能更好的 `BusUtils`。
 
-下面我来总结下 `BusUtils` 的优点:
+下面来总结下 `BusUtils` 的优点:
 
 * `BusUtils` 是通过事件 `Tag` 来确定唯一事件的,所以接收函数支持无参或者一个参数,而 `EventBus` 只能通过 MessageEvent 来确定具体的接收者,只能接收一个参数,即便仅仅是通知,也需要定义一个 MessageEvent,所以,`BusUtils` 传参更灵活。
 * `BusUtils` 在应用到项目中后,编译后便会在 application 中生成 `__bus__.json` 事件列表,如上生成的事件列表如下所示:
@@ -412,14 +420,14 @@ public void compareUnregister10000Times() {
 所以,`BusUtils` 比 `EventBus` 更友好。
 
 * `BusUtils` 比 `EventBus` 代码少得太多,`BusUtils` 的源码只有区区 300 行,而 `EventBus` 3000 行肯定是不止的哈。
-* `BusUtils` 比 `EventBus` 性能更好,下面我会来对其进行性能对比。
+* `BusUtils` 比 `EventBus` 性能更好。
 
 
 ## 原理
 
-### bus 插件的作用
+### bus 插件原理分析
 
-可以参考下[源码传送门](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/bus-gradle-plugin),插件通过 Gradle 的 transform 来完成对 `BusUtils.init()` 做注入,下面来一步步分析:
+bus 插件的源码在这里:[bus 插件源码传送门](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/bus-gradle-plugin),该插件通过 Gradle 的 transform 来完成对 `BusUtils.init()` 做注入,下面来一步步分析:
 
 不明白 transform 的可以先去了解下,简单来说 transform 就是专门用来做字节码插入操作的,最常见的就是 AOP(面向切面编程),这部分我就不科普了,有兴趣的可以自己搜索了解。
 
@@ -506,7 +514,7 @@ public MethodVisitor visitMethod(int access, String funName, String desc, String
 }
 ```
 
-然后往 `BusUtils.init()` 插入扫描出来的内容,比如上面提到的 `oneParamFun` 这个函数,那么其插入的代码如下所示:
+然后往 `BusUtils.init()` 插入扫描出来的内容,比如上面提到的 `oneParamFun` 这个函数,那么其最终插入的代码如下所示:
 
 ```java
 
@@ -515,7 +523,58 @@ private void init() {
 }
 ```
 
-来看下 `registerBus` 的实现:
+其 ASM 插入的代码如下所示:
+
+```java
+@Override
+public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) {
+    if (!"init".equals(name)) {
+        return super.visitMethod(access, name, descriptor, signature, exceptions);
+    }
+    // 往 init() 函数中写入
+    if (cv == null) return null;
+    MethodVisitor mv = cv.visitMethod(access, name, descriptor, signature, exceptions);
+    mv = new AdviceAdapter(Opcodes.ASM5, mv, access, name, descriptor) {
+        @Override
+        public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
+            return super.visitAnnotation(desc, visible);
+        }
+        @Override
+        protected void onMethodEnter() {
+            super.onMethodEnter();
+        }
+        @Override
+        protected void onMethodExit(int opcode) {
+            super.onMethodExit(opcode);
+            for (Map.Entry> busEntry : mBusMap.entrySet()) {
+                List infoList = busEntry.getValue();
+                if (infoList.size() != 1) continue;
+                BusInfo busInfo = infoList.get(0);
+                if (!busInfo.isParamSizeNoMoreThanOne) continue;
+                mv.visitVarInsn(ALOAD, 0);
+                mv.visitLdcInsn(busEntry.getKey());
+                mv.visitLdcInsn(busInfo.className);
+                mv.visitLdcInsn(busInfo.funName);
+                if (busInfo.paramsInfo.size() == 1) {
+                    mv.visitLdcInsn(busInfo.paramsInfo.get(0).className);
+                    mv.visitLdcInsn(busInfo.paramsInfo.get(0).name);
+                } else {
+                    mv.visitLdcInsn("");
+                    mv.visitLdcInsn("");
+                }
+                mv.visitInsn(busInfo.sticky ? ICONST_1 : ICONST_0);
+                mv.visitLdcInsn(busInfo.threadMode);
+                mv.visitMethodInsn(INVOKESPECIAL, mBusUtilsClass, "registerBus", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/lang/String;)V", false);
+            }
+        }
+    };
+    return mv;
+}
+```
+
+### BusUtils 原理分析
+
+接下来看下 `BusUtils.registerBus` 的实现:
 
 ```java
 private void registerBus(String tag,

From 9be9945e7adad3a8fb7b1a2df723c8262a6ca05e Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 19 Jul 2019 14:54:34 +0800
Subject: [PATCH 009/173] see 07/19 log

---
 plugin/api-gradle-plugin/README.md |  2 +-
 plugin/bus-gradle-plugin/README.md | 10 ++++++++++
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index bd2cef551f..92fa016a98 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -156,7 +156,7 @@ MainResult result = ApiUtils.getApi(MainApi.class)
 }
 ```
 
-如果项目中并没有实现 `MainApi` 的话,为了确保项目不会因为 `ApiUtils` 在运行时崩溃,`api` 插件会使其在编译时就不过,此时 `__api__.json` 文件如下所示,提示你需要实现 `MainApi`:
+如果项目中并没有实现 `MainApi` 的话,为了确保项目不会因为 `ApiUtils` 在运行时崩溃,`api` 插件会使其在编译时就不通过,此时 `__api__.json` 文件如下所示,提示你需要实现 `MainApi`:
 
 ```json
 {
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index 73b6a2b2ae..a0a1e9b613 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -50,6 +50,15 @@ android {
 
 可以猜测到默认的 busUtilsClass 为 `com.blankj.utilcode.util.BusUtils` 哈。
 
+如果开启混淆的话还需要配置你的 `BusUtils` 中注解方法的防混淆,如果直接用 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 的话是不需要你配置的,我已经帮你做完了,配置你自己的 `BusUtils` 防混淆应该如下所示:
+
+```java
+-keepattributes *Annotation*
+-keepclassmembers class * {
+    @com.xxx.xxx.BusUtils$Bus ;
+}
+```
+
 当然,如果你项目是开启混淆的话,全量引入 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 也是可以的,混淆会帮你去除未使用到的类和方法。
 
 好了,插件和依赖都配置完毕,下面介绍基本使用。
@@ -117,6 +126,7 @@ BusUtils.unregister(xxx);
 * 由于 `BusUtils` 是用于模块内调用,所以可以写一个 `BusConfig` 的类来保存一个模块内所有 bus 的 `Tag`,方便查找到使用方及调用方。
 * `Tag` 中最好还能带有业务模块后缀名防止重复,是 sticky 类型的话也带上 sticky,指定具体线程的话也带上线程名,例如:`update_avatar_sticky_main_info` 这个 `Tag`,让人直接望文生义。
 * 如果能结合 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 来使用,那就更规范不过了。
+* 对 `BusUtils` 中事件传输的的 `bean` 都需要 `keep` 下来,否则开启混淆后会找不到该实体对象而报错。
 
 
 使用已经介绍完毕,下面我们来和 `EventBus` 对比下性能。

From 4332ec919bd53397fa27b62e662b735e7ccb74db Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sat, 20 Jul 2019 14:21:04 +0800
Subject: [PATCH 010/173] see 07/20 log

---
 buildSrc/src/main/groovy/Config.groovy                 |  4 ++--
 .../SubUtilApiMock.java}                               |  4 ++--
 .../UtilCodeApiMock.java}                              |  4 ++--
 plugin/api-gradle-plugin/README.md                     |  9 +++++++--
 .../src/main/java/com/blankj/api/ApiClassVisitor.java  | 10 ++++++++--
 .../src/main/java/com/blankj/api/ApiScan.groovy        |  4 +++-
 .../src/main/java/com/blankj/bus/BusScan.groovy        |  2 --
 7 files changed, 24 insertions(+), 13 deletions(-)
 rename feature/mock/src/main/java/com/blankj/mock/{api/SubUtilMockApi.java => subutil/SubUtilApiMock.java} (84%)
 rename feature/mock/src/main/java/com/blankj/mock/{api/UtilCodeMockApi.java => utilcode/UtilCodeApiMock.java} (87%)

diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index db56f272a0..e60ed7b621 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -38,11 +38,11 @@ class Config {
                     // 本地第一次上传插件新的版本需设置 useLocal = true, isApply = false
                     // 本地上传成功之后 isApply = true 即可应用插件来调试,后续版本更新无需设置 isApply = false
                     // 发布版本的话把 useLocal = false, isApply = false,发布成功后 isApply = true 即可使用远程库版本
-                    api    : new DepConfig(true/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.0", true/*是否使用插件*/),
+                    api    : new DepConfig(false/*是否本地调试*/, "com.blankj:api-gradle-plugin:1.0", true/*是否使用插件*/),
                     bus    : new DepConfig(false/*是否本地调试*/, "com.blankj:bus-gradle-plugin:2.0", true/*是否使用插件*/),
             ],
 
-            api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", true),
+            api_gradle_plugin: new DepConfig(":plugin:api-gradle-plugin", false),
             bus_gradle_plugin: new DepConfig(":plugin:bus-gradle-plugin", false),
 
             feature          : [
diff --git a/feature/mock/src/main/java/com/blankj/mock/api/SubUtilMockApi.java b/feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
similarity index 84%
rename from feature/mock/src/main/java/com/blankj/mock/api/SubUtilMockApi.java
rename to feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
index 1ab98933a9..6c5af69924 100644
--- a/feature/mock/src/main/java/com/blankj/mock/api/SubUtilMockApi.java
+++ b/feature/mock/src/main/java/com/blankj/mock/subutil/SubUtilApiMock.java
@@ -1,4 +1,4 @@
-package com.blankj.mock.api;
+package com.blankj.mock.subutil;
 
 import android.content.Context;
 
@@ -15,7 +15,7 @@
  * 
  */
 @ApiUtils.Api(isMock = true)
-public class SubUtilMockApi extends SubUtilApi {
+public class SubUtilApiMock extends SubUtilApi {
 
     @Override
     public void startSubUtilActivity(Context context) {
diff --git a/feature/mock/src/main/java/com/blankj/mock/api/UtilCodeMockApi.java b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
similarity index 87%
rename from feature/mock/src/main/java/com/blankj/mock/api/UtilCodeMockApi.java
rename to feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
index 3cc1cc2386..df22cbf92a 100644
--- a/feature/mock/src/main/java/com/blankj/mock/api/UtilCodeMockApi.java
+++ b/feature/mock/src/main/java/com/blankj/mock/utilcode/UtilCodeApiMock.java
@@ -1,4 +1,4 @@
-package com.blankj.mock.api;
+package com.blankj.mock.utilcode;
 
 import android.content.Context;
 
@@ -15,7 +15,7 @@
  * 
  */
 @ApiUtils.Api(isMock = true)
-public class UtilCodeMockApi extends UtilCodeApi {
+public class UtilCodeApiMock extends UtilCodeApi {
 
     @Override
     public void startUtilCodeActivity(Context context) {
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 92fa016a98..52f25c6aa0 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -243,8 +243,13 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
 public void visitEnd() {
     super.visitEnd();
     if (hasAnnotation) {
-        if (!isMock) {// 如果不是 mock 的话,那么直接写入
-            mApiImplMap.put(superClassName, new ApiInfo(className, false));
+        if (!isMock) {// 如果不是 mock 的话
+            ApiInfo apiInfo = mApiImplMap.get(superClassName);
+            if (apiInfo == null) {
+                mApiImplMap.put(superClassName, new ApiInfo(className, false));
+            } else {// 存在一个 api 多个实现就报错
+                errorStr = "<" + className + "> and <" + apiInfo.implApiClass + "> impl same api of <" + superClassName + ">";
+            }
         } else {// mock 的话,如果 map 中已存在就不覆盖了
             if (!mApiImplMap.containsKey(superClassName)) {
                 mApiImplMap.put(superClassName, new ApiInfo(className, true));
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiClassVisitor.java b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiClassVisitor.java
index 975a86aa05..443f0a846d 100644
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiClassVisitor.java
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiClassVisitor.java
@@ -25,6 +25,7 @@ public class ApiClassVisitor extends ClassVisitor {
     private boolean              hasAnnotation;
     private boolean              isMock;
     private String               mApiUtilsClass;
+    public  String               errorStr;
 
     public ApiClassVisitor(ClassVisitor classVisitor, Map apiImplMap, List apiClasses, String apiUtilsClass) {
         super(Opcodes.ASM5, classVisitor);
@@ -62,8 +63,13 @@ public void visit(String name, Object value) {// 可获取注解的值
     public void visitEnd() {
         super.visitEnd();
         if (hasAnnotation) {
-            if (!isMock) {// 如果不是 mock 的话,那么直接写入
-                mApiImplMap.put(superClassName, new ApiInfo(className, false));
+            if (!isMock) {// 如果不是 mock 的话
+                ApiInfo apiInfo = mApiImplMap.get(superClassName);
+                if (apiInfo == null) {
+                    mApiImplMap.put(superClassName, new ApiInfo(className, false));
+                } else {// 存在一个 api 多个实现就报错
+                    errorStr = "<" + className + "> and <" + apiInfo.implApiClass + "> impl same api of <" + superClassName + ">";
+                }
             } else {// mock 的话,如果 map 中已存在就不覆盖了
                 if (!mApiImplMap.containsKey(superClassName)) {
                     mApiImplMap.put(superClassName, new ApiInfo(className, true));
diff --git a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
index b94f183615..36b679ff99 100755
--- a/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
+++ b/plugin/api-gradle-plugin/src/main/java/com/blankj/api/ApiScan.groovy
@@ -64,7 +64,9 @@ class ApiScan {
             ClassVisitor cv = new ApiClassVisitor(cw, apiImplMap, apiClasses, apiUtilsClass);
             cr.accept(cv, ClassReader.SKIP_FRAMES);
 
-            FileUtils.writeByteArrayToFile(file, cw.toByteArray());
+            if (cv.errorStr != null) {
+                throw new Exception(cv.errorStr)
+            }
         }
     }
 }
diff --git a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
index 5bbc5df996..5050938d0d 100755
--- a/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
+++ b/plugin/bus-gradle-plugin/src/main/java/com/blankj/bus/BusScan.groovy
@@ -61,8 +61,6 @@ class BusScan {
             ClassWriter cw = new ClassWriter(cr, 0);
             ClassVisitor cv = new BusClassVisitor(cw, busMap, busUtilsClass);
             cr.accept(cv, ClassReader.SKIP_FRAMES);
-
-            FileUtils.writeByteArrayToFile(file, cw.toByteArray());
         }
     }
 }

From 5abf89f6457a9b18e10ccd7c81a76151e4430439 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sun, 21 Jul 2019 18:58:21 +0800
Subject: [PATCH 011/173] see 07/21 log

---
 art/auc_frame_general.png                       | Bin 0 -> 80794 bytes
 buildSrc/src/main/groovy/Config.groovy          |   2 +-
 buildSrc/src/main/groovy/ConfigUtils.groovy     |   2 +-
 .../utilcode/pkg/feature/api/ApiActivity.kt     |   9 +++------
 .../api/other/export/OtherModuleApi.java        |   2 +-
 .../feature/api/other/pkg/OtherPkgApiImpl.java  |   2 +-
 6 files changed, 7 insertions(+), 10 deletions(-)
 create mode 100644 art/auc_frame_general.png

diff --git a/art/auc_frame_general.png b/art/auc_frame_general.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f6b86638877613b1a00311ff85c7e397a01b9f0
GIT binary patch
literal 80794
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%0A_5P$Ju4)2YIee>Fz1
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 {
                 api.invokeWithParams(OtherModuleApi.ApiBean("params"))
@@ -58,8 +59,4 @@ class ApiActivity : CommonTitleActivity() {
             }
         }
     }
-
-    override fun onDestroy() {
-        super.onDestroy()
-    }
 }
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
index 1d6dd82ded..5879724b01 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/export/OtherModuleApi.java
@@ -7,7 +7,7 @@
  *     author: Blankj
  *     blog  : http://blankj.com
  *     time  : 2019/07/10
- *     desc  :
+ *     desc  : demo about ApiUtils
  * 
  */
 public abstract class OtherModuleApi extends ApiUtils.BaseApi {
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
index c25c3b4ee3..b3efb7af7a 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/api/other/pkg/OtherPkgApiImpl.java
@@ -9,7 +9,7 @@
  *     author: Blankj
  *     blog  : http://blankj.com
  *     time  : 2019/07/10
- *     desc  :
+ *     desc  : demo about ApiUtils
  * 
  */
 @ApiUtils.Api

From 71fc2cee06235e0375ecbff0b24aea69323555d9 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sun, 21 Jul 2019 19:22:03 +0800
Subject: [PATCH 012/173] see 07/21 log

---
 README-CN.md | 6 +++++-
 README.md    | 6 +++++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/README-CN.md b/README-CN.md
index 30861643a9..033797e9ce 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -1,4 +1,6 @@
-![logo][logo]
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
+
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
 
 [![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
 
@@ -41,6 +43,8 @@
 
 [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
 
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
+
 [aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.0-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
diff --git a/README.md b/README.md
index ac5b617a83..efb684a8d9 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,6 @@
-![logo][logo]
+[![logo][logo]](https://github.com/Blankj/AndroidUtilCode)
+
+[![frame][frame]](https://github.com/Blankj/AucFrameTemplate)
 
 [![auc][aucSvg]][auc] [![result][apiSvg]][result] [![build][buildSvg]][build] [![License][licenseSvg]][license]
 
@@ -41,6 +43,8 @@ If this project helps you a lot and you want to support the project's developmen
 
 [logo]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/logo.png
 
+[frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
+
 [aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.0-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 

From 834a980de28c17f571f06172104f7e00a43075d0 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Tue, 23 Jul 2019 09:03:47 +0800
Subject: [PATCH 013/173] see 07/23 log

---
 buildSrc/src/main/groovy/Config.groovy                    | 2 +-
 .../utilcode/pkg/feature/language/LanguageActivity.kt     | 2 +-
 plugin/api-gradle-plugin/README.md                        | 3 +--
 plugin/bus-gradle-plugin/README.md                        | 8 ++++----
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 63464a859b..e60ed7b621 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -25,7 +25,7 @@ class Config {
     // appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher
     static appConfig = ['launcher']
     // pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空
-    static pkgConfig = ['utilcode']
+    static pkgConfig = []
 
     static depConfig = [
             plugin           : [
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
index 4fffc361fb..12f06b9d53 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
@@ -54,7 +54,7 @@ class LanguageActivity : CommonTitleActivity() {
         when (view.id) {
             R.id.languageApp -> ToastUtils.showLong(R.string.language)
             R.id.languageActivity -> ToastUtils.showLong(getString(R.string.language))
-            R.id.applySimpleChineseLanguage -> LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, "com.blankj.launcher.pkg.MainActivity")
+            R.id.applySimpleChineseLanguage -> LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, "com.blankj.main.pkg.MainActivity")
             R.id.applyAmericanLanguage -> LanguageUtils.applyLanguage(Locale.US, "")
             R.id.applySystemLanguage -> LanguageUtils.applySystemLanguage("")
         }
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 52f25c6aa0..1e2dfb9255 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -176,7 +176,7 @@ MainResult result = ApiUtils.getApi(MainApi.class)
 要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
 
 * `impl` 和 `api` 应该都是 `public` 的,而且 `impl` 中应该只存在一个无参的 `public` 构造函数(默认不写即可)。
-* `api` 中修改接口不要在老的接口上动手脚,更不要删除老的接口,而应该建立新的接口后,通知业务方来调用新的接口,还是上面的跳转 `main` 的例子,由于我们前期接口设计有问题,需要新增一个 `UserInfo` 的参数,具体如下所示:
+* `api` 中接口的修改我们遵循类似于官方 Android SDK 的升级,大部分情况是新接口的出现需要兼容老接口,如果老接口并不影响功能的正常使用,也就无需通知业务方更新为新接口,新的接口一般都是新的业务方来调用;除非老的接口存有问题或漏洞,我们明确需要删除它,那在删除它的同时,我们还需要把业务中调用老接口的地方统一替换为新的接口,类似于我们升级 Android SDK 的时候,某些 `api` 明确被官方删除了,那我们就需要强行替换为新的接口。还是上面的跳转 `main` 的例子,由于新的业务在跳转的时候需新增一个 `UserInfo` 的参数,具体如下所示:
 ```java
 // old
 public abstract class MainApi extends ApiUtils.BaseApi {
@@ -185,7 +185,6 @@ public abstract class MainApi extends ApiUtils.BaseApi {
 
 // good
 public abstract class MainApi extends ApiUtils.BaseApi {
-    @Deprecated
     public abstract MainResult startMainActivity(Context context, MainParam param);
 
     public abstract MainResult startMainActivity(Context context, MainParam param, UserInfo info);
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index a0a1e9b613..be003da3e5 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -1,10 +1,10 @@
-## 比 EventBus 更高效的事件总线(BusUtils)
+# 比 EventBus 更高效的事件总线(BusUtils)
 
 ## 背景
 
 设计这个 `BusUtils` 其实是在做 [ApiUtils](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/api-gradle-plugin) 时顺手做的,因为两者实现方式基本一致,设计前我也没想着要和 greenrobot 的 `EventBus` 一较高低,但设计完总需要一个对比,所以就拿业界最优秀的事件总线 `EventBus` 比较一下吧,然后就发现我这区区 300 行不到的 `BusUtils` 性能比 `EventBus` 要高出好多,当然,这一切的前提都是在 `BusUtils` 是切实可用并且有效的,它也是一款线程安全的事件总线,这些我都在单测中有做过实际测试的,不吹不擂,后面我们拿数据说话,有小伙伴不相信的话也可以通过下载我的源码来比较即可,单测地址:[BusUtilsVsEventBusTest](https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsVsEventBusTest.java),Android 测试地址:[BusCompareActivity](https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt),`BusUtils` 在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中的作用就是模块内传值,其扮演的角色如下所示:
 
-![BusUtilsPlayer](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
+![BusUtilsRole](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
 
 下面介绍其使用:
 
@@ -314,7 +314,7 @@ private void comparePostTemplate(String name, int subscribeNum, int postTimes) {
 }
 ```
 
-### 向 100 个订阅者发送 * 10000 次,共执行 10 次取平均值
+### 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
 
 ```java
 /**
@@ -390,7 +390,7 @@ public void compareUnregister10000Times() {
 
 为了方便观察,我们生成一份图表来比较两者之间的性能:
 
-![BusUtilsVsEventBusChart](https://github.com/Blankj/AndroidUtilCode/blob/master/art/busutil_vs_eventbus.png)
+![BusUtilsVsEventBusChart](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/busutil_vs_eventbus.png)
 
 图表中分别对四个函数在 MacOS 和 OnePlus6 中的表现进行统计,每个函数中从左向右分别是 「MacOS 的 BusUtils」、「MacOS 的 EventBus」、「OnePlus6 的 BusUtils」、「OnePlus6 的 EventBus」,可以发现,BusUtils 在注册和注销上基本比 `EventBus` 要快上好几倍,BusUtils 在向少量订阅者发送多次事件比 `EventBus` 也快上好多,在向多个订阅者发送多次事件也比 `EventBus` 快上些许。
 

From 7f247e7ec66ca55dfbd9a7490e7031234ae95a3c Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Tue, 23 Jul 2019 09:03:47 +0800
Subject: [PATCH 014/173] see 07/23 log

---
 buildSrc/src/main/groovy/Config.groovy                    | 2 +-
 .../utilcode/pkg/feature/language/LanguageActivity.kt     | 2 +-
 plugin/api-gradle-plugin/README.md                        | 3 +--
 plugin/bus-gradle-plugin/README.md                        | 8 ++++----
 4 files changed, 7 insertions(+), 8 deletions(-)

diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 63464a859b..e60ed7b621 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -25,7 +25,7 @@ class Config {
     // appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher
     static appConfig = ['launcher']
     // pkgConfig 配置的是要依赖的功能包,为空则依赖全部,git 提交务必为空
-    static pkgConfig = ['utilcode']
+    static pkgConfig = []
 
     static depConfig = [
             plugin           : [
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
index 4fffc361fb..12f06b9d53 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/language/LanguageActivity.kt
@@ -54,7 +54,7 @@ class LanguageActivity : CommonTitleActivity() {
         when (view.id) {
             R.id.languageApp -> ToastUtils.showLong(R.string.language)
             R.id.languageActivity -> ToastUtils.showLong(getString(R.string.language))
-            R.id.applySimpleChineseLanguage -> LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, "com.blankj.launcher.pkg.MainActivity")
+            R.id.applySimpleChineseLanguage -> LanguageUtils.applyLanguage(Locale.SIMPLIFIED_CHINESE, "com.blankj.main.pkg.MainActivity")
             R.id.applyAmericanLanguage -> LanguageUtils.applyLanguage(Locale.US, "")
             R.id.applySystemLanguage -> LanguageUtils.applySystemLanguage("")
         }
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 52f25c6aa0..1e2dfb9255 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -176,7 +176,7 @@ MainResult result = ApiUtils.getApi(MainApi.class)
 要想工具用得舒服,规范肯定要遵守的,所谓无规矩不成方圆,不然五花八门的问题肯定一堆堆,这里推荐如下规范:
 
 * `impl` 和 `api` 应该都是 `public` 的,而且 `impl` 中应该只存在一个无参的 `public` 构造函数(默认不写即可)。
-* `api` 中修改接口不要在老的接口上动手脚,更不要删除老的接口,而应该建立新的接口后,通知业务方来调用新的接口,还是上面的跳转 `main` 的例子,由于我们前期接口设计有问题,需要新增一个 `UserInfo` 的参数,具体如下所示:
+* `api` 中接口的修改我们遵循类似于官方 Android SDK 的升级,大部分情况是新接口的出现需要兼容老接口,如果老接口并不影响功能的正常使用,也就无需通知业务方更新为新接口,新的接口一般都是新的业务方来调用;除非老的接口存有问题或漏洞,我们明确需要删除它,那在删除它的同时,我们还需要把业务中调用老接口的地方统一替换为新的接口,类似于我们升级 Android SDK 的时候,某些 `api` 明确被官方删除了,那我们就需要强行替换为新的接口。还是上面的跳转 `main` 的例子,由于新的业务在跳转的时候需新增一个 `UserInfo` 的参数,具体如下所示:
 ```java
 // old
 public abstract class MainApi extends ApiUtils.BaseApi {
@@ -185,7 +185,6 @@ public abstract class MainApi extends ApiUtils.BaseApi {
 
 // good
 public abstract class MainApi extends ApiUtils.BaseApi {
-    @Deprecated
     public abstract MainResult startMainActivity(Context context, MainParam param);
 
     public abstract MainResult startMainActivity(Context context, MainParam param, UserInfo info);
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index a0a1e9b613..be003da3e5 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -1,10 +1,10 @@
-## 比 EventBus 更高效的事件总线(BusUtils)
+# 比 EventBus 更高效的事件总线(BusUtils)
 
 ## 背景
 
 设计这个 `BusUtils` 其实是在做 [ApiUtils](https://github.com/Blankj/AndroidUtilCode/tree/master/plugin/api-gradle-plugin) 时顺手做的,因为两者实现方式基本一致,设计前我也没想着要和 greenrobot 的 `EventBus` 一较高低,但设计完总需要一个对比,所以就拿业界最优秀的事件总线 `EventBus` 比较一下吧,然后就发现我这区区 300 行不到的 `BusUtils` 性能比 `EventBus` 要高出好多,当然,这一切的前提都是在 `BusUtils` 是切实可用并且有效的,它也是一款线程安全的事件总线,这些我都在单测中有做过实际测试的,不吹不擂,后面我们拿数据说话,有小伙伴不相信的话也可以通过下载我的源码来比较即可,单测地址:[BusUtilsVsEventBusTest](https://github.com/Blankj/AndroidUtilCode/blob/master/lib/utilcode/src/test/java/com/blankj/utilcode/util/BusUtilsVsEventBusTest.java),Android 测试地址:[BusCompareActivity](https://github.com/Blankj/AndroidUtilCode/blob/master/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusCompareActivity.kt),`BusUtils` 在 **[AucFrame](https://github.com/Blankj/AucFrameTemplate)** 中的作用就是模块内传值,其扮演的角色如下所示:
 
-![BusUtilsPlayer](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
+![BusUtilsRole](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/communication.png)
 
 下面介绍其使用:
 
@@ -314,7 +314,7 @@ private void comparePostTemplate(String name, int subscribeNum, int postTimes) {
 }
 ```
 
-### 向 100 个订阅者发送 * 10000 次,共执行 10 次取平均值
+### 向 100 个订阅者发送 * 100000 次,共执行 10 次取平均值
 
 ```java
 /**
@@ -390,7 +390,7 @@ public void compareUnregister10000Times() {
 
 为了方便观察,我们生成一份图表来比较两者之间的性能:
 
-![BusUtilsVsEventBusChart](https://github.com/Blankj/AndroidUtilCode/blob/master/art/busutil_vs_eventbus.png)
+![BusUtilsVsEventBusChart](https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/busutil_vs_eventbus.png)
 
 图表中分别对四个函数在 MacOS 和 OnePlus6 中的表现进行统计,每个函数中从左向右分别是 「MacOS 的 BusUtils」、「MacOS 的 EventBus」、「OnePlus6 的 BusUtils」、「OnePlus6 的 EventBus」,可以发现,BusUtils 在注册和注销上基本比 `EventBus` 要快上好几倍,BusUtils 在向少量订阅者发送多次事件比 `EventBus` 也快上好多,在向多个订阅者发送多次事件也比 `EventBus` 快上些许。
 

From e5144fa4e23975e594f631e6e17ec20cc454e710 Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Tue, 23 Jul 2019 18:19:51 +0800
Subject: [PATCH 015/173] see 07/23 log

---
 CHANGELOG.md                                  |  3 ++-
 README-CN.md                                  |  2 +-
 README.md                                     |  2 +-
 buildSrc/src/main/groovy/Config.groovy        |  4 ++--
 lib/utilcode/README-CN.md                     |  4 ++--
 lib/utilcode/README.md                        |  4 ++--
 .../com/blankj/utilcode/util/ThreadUtils.java | 14 +++++------
 .../com/blankj/utilcode/util/BaseTest.java    | 23 ++++++++++++++++++-
 plugin/api-gradle-plugin/README.md            |  2 +-
 plugin/bus-gradle-plugin/README.md            |  2 +-
 10 files changed, 41 insertions(+), 19 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4f439d24c7..85a3fe045e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,4 @@
+* `19/07/23` [fix] ThreadUtils of cache pool. Publish v1.25.1.
 * `19/07/18` [add] README of ApiUtils and BusUtils.
 * `19/07/15` [add] Publish v1.25.0.
 * `19/07/14` [upd] Bus plugin for use BusUtils. Publish bus plugin v2.0.
@@ -5,7 +6,7 @@
 * `19/07/09` [upd] The frame of project.
 * `19/07/06` [upd] BusUtils which behave same as EventBus.
 * `19/07/03` [add] ApiUtils which decoupling modules.
-* `19/06/30` [add] LanguageUtils support activity's class name. Publish v1.25.0.
+* `19/06/30` [add] LanguageUtils support activity's class name.
 * `19/06/29` [add] ClickUtils#OnMultiClickListener, and remove dangerous function. Publish v1.24.6.
 * `19/06/28` [add] LanguageUtils. Publish v1.24.5.
 * `19/06/20` [fix] BusUtils' permission. Publish v1.24.4.
diff --git a/README-CN.md b/README-CN.md
index 033797e9ce..a89513fc4f 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -45,7 +45,7 @@
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.0-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.1-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/README.md b/README.md
index efb684a8d9..6c96d845dc 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ If this project helps you a lot and you want to support the project's developmen
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.0-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.1-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index e60ed7b621..c3ff6c373f 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -14,8 +14,8 @@ class Config {
     static compileSdkVersion = 27
     static minSdkVersion = 14
     static targetSdkVersion = 27
-    static versionCode = 1_025_000
-    static versionName = '1.25.0'// E.g. 1.9.72 => 1,009,072
+    static versionCode = 1_025_001
+    static versionName = '1.25.1'// E.g. 1.9.72 => 1,009,072
 
     // lib version
     static kotlin_version = '1.3.10'
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index a07b9a3201..cfd73581f1 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.0'
+implementation 'com.blankj:utilcode:1.25.1'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.0'
+implementation 'com.blankj:utilcodex:1.25.1'
 ```
 
 
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 95b421d258..27c9e10ec0 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.0'
+implementation 'com.blankj:utilcode:1.25.1'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.0'
+implementation 'com.blankj:utilcodex:1.25.1'
 ```
 
 
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
index 2a9fd7f180..2782d7f7cd 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java
@@ -976,17 +976,17 @@ private static ExecutorService createPool(final int type, final int priority) {
                 case TYPE_CACHED:
                     return new ThreadPoolExecutor4Util(0, 128,
                             60L, TimeUnit.SECONDS,
-                            new LinkedBlockingQueue4Util(),
+                            new LinkedBlockingQueue4Util(true),
                             new UtilsThreadFactory("cached", priority)
                     );
                 case TYPE_IO:
-                    return new ThreadPoolExecutor4Util(0, 2 * CPU_COUNT + 1,
+                    return new ThreadPoolExecutor4Util(2 * CPU_COUNT + 1, 2 * CPU_COUNT + 1,
                             30, TimeUnit.SECONDS,
                             new LinkedBlockingQueue4Util(),
                             new UtilsThreadFactory("io", priority)
                     );
                 case TYPE_CPU:
-                    return new ThreadPoolExecutor4Util(CPU_COUNT + 1, 2 * CPU_COUNT + 1,
+                    return new ThreadPoolExecutor4Util(CPU_COUNT + 1, CPU_COUNT + 1,
                             30, TimeUnit.SECONDS,
                             new LinkedBlockingQueue4Util(),
                             new UtilsThreadFactory("cpu", priority)
@@ -1046,20 +1046,20 @@ private static final class LinkedBlockingQueue4Util extends LinkedBlockingQueue<
 
         private volatile ThreadPoolExecutor4Util mPool;
 
-        private int mCapacity = Integer.MAX_VALUE;
+        private boolean mIsAddSubThreadFirstThenAddQueue = false;
 
         LinkedBlockingQueue4Util() {
             super();
         }
 
-        LinkedBlockingQueue4Util(int capacity) {
+        LinkedBlockingQueue4Util(boolean isAddSubThreadFirstThenAddQueue) {
             super();
-            mCapacity = capacity;
+            mIsAddSubThreadFirstThenAddQueue = isAddSubThreadFirstThenAddQueue;
         }
 
         @Override
         public boolean offer(@NonNull Runnable runnable) {
-            if (mCapacity <= size() &&
+            if (mIsAddSubThreadFirstThenAddQueue &&
                     mPool != null && mPool.getPoolSize() < mPool.getMaximumPoolSize()) {
                 // create a non-core thread
                 return false;
diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
index 06c360cffc..f30ee7cca4 100644
--- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
+++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java
@@ -10,7 +10,9 @@
 import org.robolectric.annotation.Config;
 import org.robolectric.shadows.ShadowLog;
 
+import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 
@@ -37,6 +39,25 @@ public void execute(@NonNull Runnable command) {
 
     @Test
     public void test() throws Exception {
-
+        CountDownLatch latch = new CountDownLatch(1);
+
+        for (int i = 0; i < 100; i++) {
+            final int finalI = i;
+            ThreadUtils.executeByCpu(new ThreadUtils.SimpleTask() {
+                @Override
+                public Void doInBackground() throws Throwable {
+                    System.out.println("" + Thread.currentThread() + finalI);
+                    Thread.sleep(100);
+                    return null;
+                }
+
+                @Override
+                public void onSuccess(Void result) {
+
+                }
+            });
+        }
+
+        latch.await(1, TimeUnit.SECONDS);
     }
 }
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 1e2dfb9255..57b9cfdb85 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -42,7 +42,7 @@ apply plugin: "com.blankj.api"
 给你的项目添加 **[AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode)** 依赖:
 
 ```groovy
-api "com.blankj:utilcode:1.25.0"
+api "com.blankj:utilcode:latest_version"
 ```
 
 如果你单纯只想引入 `ApiUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,然后在 app 下的 `build.gradle` 中 配置 api 的 SDL 域如下所示:
diff --git a/plugin/bus-gradle-plugin/README.md b/plugin/bus-gradle-plugin/README.md
index be003da3e5..2843f3fb21 100644
--- a/plugin/bus-gradle-plugin/README.md
+++ b/plugin/bus-gradle-plugin/README.md
@@ -33,7 +33,7 @@ apply plugin: "com.blankj.bus"
 给你的项目添加 [AndroidUtilCode](https://github.com/Blankj/AndroidUtilCode) 依赖:
 
 ```groovy
-api "com.blankj:utilcode:1.25.0"
+api "com.blankj:utilcode:latest_version
 ```
 
 如果你单纯只想引入 `BusUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,记得还要拷贝 `ThreadUtils` 哦,然后在 app 下的 `build.gradle` 中 配置 bus 的 SDL 域如下所示:

From 6a836a06ad3ea7d5dd6562b52b2a9ac59e36793f Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Fri, 26 Jul 2019 16:58:16 +0800
Subject: [PATCH 016/173] see 07/26 log

---
 CHANGELOG.md                                  |   3 +
 README-CN.md                                  |   2 +-
 README.md                                     |   2 +-
 buildApp.gradle                               |   5 +-
 buildSrc/src/main/groovy/Config.groovy        |  13 +-
 buildSrc/src/main/groovy/ConfigUtils.groovy   |   1 -
 lib/base/build.gradle                         |   1 +
 .../java/com/blankj/base/BaseApplication.java |   2 +
 lib/utilcode/README-CN.md                     |   4 +-
 lib/utilcode/README.md                        |   4 +-
 .../blankj/utilcode/util/ContainerUtils.java  | 172 ++++++++++++++++++
 .../blankj/utilcode/util/PermissionUtils.java |   4 +-
 .../com/blankj/utilcode/util/ThreadUtils.java |  48 +++--
 .../com/blankj/utilcode/util/ZipUtils.java    |   6 +-
 .../com/blankj/utilcode/util/BaseTest.java    |  23 +--
 .../blankj/utilcode/util/ZipUtilsTest.java    |   9 +-
 lib/utildebug/.gitignore                      |   1 +
 lib/utildebug/build.gradle                    |  15 ++
 lib/utildebug/proguard-rules.pro              |  21 +++
 lib/utildebug/src/main/AndroidManifest.xml    |   2 +
 lib/utildebug/src/main/res/values/strings.xml |   3 +
 .../com/blankj/utildebug/ExampleUnitTest.java |  17 ++
 plugin/api-gradle-plugin/README.md            |   2 +-
 23 files changed, 294 insertions(+), 66 deletions(-)
 create mode 100644 lib/utilcode/src/main/java/com/blankj/utilcode/util/ContainerUtils.java
 create mode 100644 lib/utildebug/.gitignore
 create mode 100644 lib/utildebug/build.gradle
 create mode 100644 lib/utildebug/proguard-rules.pro
 create mode 100644 lib/utildebug/src/main/AndroidManifest.xml
 create mode 100644 lib/utildebug/src/main/res/values/strings.xml
 create mode 100644 lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85a3fe045e..2d5b1b84f7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,6 @@
+* `19/07/26` [add] ContainerUtils. Publish v1.25.2.
+* `19/07/25` [fix] PermissionUtils' NullPointException.
+* `19/07/24` [fix] ZipUtils#unzipFile.
 * `19/07/23` [fix] ThreadUtils of cache pool. Publish v1.25.1.
 * `19/07/18` [add] README of ApiUtils and BusUtils.
 * `19/07/15` [add] Publish v1.25.0.
diff --git a/README-CN.md b/README-CN.md
index a89513fc4f..00f811aee2 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -45,7 +45,7 @@
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.1-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.2-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/README.md b/README.md
index 6c96d845dc..de338f9347 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ If this project helps you a lot and you want to support the project's developmen
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.1-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.2-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/buildApp.gradle b/buildApp.gradle
index d346b80d74..1c87fdae14 100644
--- a/buildApp.gradle
+++ b/buildApp.gradle
@@ -16,7 +16,7 @@ configApkName()
 android {
     compileSdkVersion Config.compileSdkVersion
     defaultConfig {
-        minSdkVersion Config.minSdkVersion
+        minSdkVersion 16
         versionCode Config.versionCode
         versionName Config.versionName
         applicationId Config.applicationId + suffix
@@ -55,6 +55,9 @@ dependencies {
     debugImplementation Config.depConfig.leakcanary.support_fragment.dep
     releaseImplementation Config.depConfig.leakcanary.android_no_op.dep
 
+    debugImplementation 'com.didichuxing.doraemonkit:doraemonkit:1.1.8'
+    releaseImplementation 'com.didichuxing.doraemonkit:doraemonkit-no-op:1.1.8'
+
     // 根据 Config.pkgConfig 来依赖所有 pkg
     for (def entrySet : ConfigUtils.getApplyPkgs().entrySet()) {
         api entrySet.value.dep
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index c3ff6c373f..85859adde4 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -14,8 +14,8 @@ class Config {
     static compileSdkVersion = 27
     static minSdkVersion = 14
     static targetSdkVersion = 27
-    static versionCode = 1_025_001
-    static versionName = '1.25.1'// E.g. 1.9.72 => 1,009,072
+    static versionCode = 1_025_002
+    static versionName = '1.25.2'// E.g. 1.9.72 => 1,009,072
 
     // lib version
     static kotlin_version = '1.3.10'
@@ -71,10 +71,11 @@ class Config {
             ],
 
             lib              : [
-                    base    : new DepConfig(":lib:base"),
-                    common  : new DepConfig(":lib:common"),
-                    subutil : new DepConfig(":lib:subutil"),
-                    utilcode: new DepConfig(true/*是否本地调试*/, ":lib:utilcode", "com.blankj:utilcode:$versionName"),
+                    base     : new DepConfig(":lib:base"),
+                    common   : new DepConfig(":lib:common"),
+                    subutil  : new DepConfig(":lib:subutil"),
+                    utilcode : new DepConfig(true/*是否本地调试*/, ":lib:utilcode", "com.blankj:utilcode:$versionName"),
+                    utildebug: new DepConfig(true/*是否本地调试*/, ":lib:utildebug", "com.blankj:utildebug:$versionName"),
             ],
 
             support          : [
diff --git a/buildSrc/src/main/groovy/ConfigUtils.groovy b/buildSrc/src/main/groovy/ConfigUtils.groovy
index 90b9254b2a..f202f25a35 100644
--- a/buildSrc/src/main/groovy/ConfigUtils.groovy
+++ b/buildSrc/src/main/groovy/ConfigUtils.groovy
@@ -88,7 +88,6 @@ class ConfigUtils {
                 void beforeEvaluate(Project project) {
                     if (project.subprojects.isEmpty()) {
                         if (project.path.contains(":plugin:")) {
-                            // 插件的话自己写 build.gradle
                             return
                         }
                         if (project.name == "app") {
diff --git a/lib/base/build.gradle b/lib/base/build.gradle
index 3b9c007384..9ac90bd0b2 100644
--- a/lib/base/build.gradle
+++ b/lib/base/build.gradle
@@ -12,4 +12,5 @@ dependencies {
     api Config.depConfig.swipe_panel.dep
     api Config.depConfig.eventbus.lib.dep
     compileOnly Config.depConfig.leakcanary.android_no_op.dep
+    compileOnly 'com.didichuxing.doraemonkit:doraemonkit-no-op:1.1.8'
 }
\ No newline at end of file
diff --git a/lib/base/src/main/java/com/blankj/base/BaseApplication.java b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
index 32fcff1126..d2a9a4d5d6 100644
--- a/lib/base/src/main/java/com/blankj/base/BaseApplication.java
+++ b/lib/base/src/main/java/com/blankj/base/BaseApplication.java
@@ -8,6 +8,7 @@
 import com.blankj.utilcode.util.CrashUtils;
 import com.blankj.utilcode.util.LogUtils;
 import com.blankj.utilcode.util.ProcessUtils;
+import com.didichuxing.doraemonkit.DoraemonKit;
 import com.squareup.leakcanary.LeakCanary;
 
 import java.util.ArrayList;
@@ -41,6 +42,7 @@ protected void attachBaseContext(Context base) {
     public void onCreate() {
         super.onCreate();
         sInstance = this;
+        DoraemonKit.install(this);
         initLeakCanary();
         initLog();
         initCrash();
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index cfd73581f1..8b27520ae3 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.1'
+implementation 'com.blankj:utilcode:1.25.2'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.1'
+implementation 'com.blankj:utilcodex:1.25.2'
 ```
 
 
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 27c9e10ec0..408cbba37b 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.1'
+implementation 'com.blankj:utilcode:1.25.2'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.1'
+implementation 'com.blankj:utilcodex:1.25.2'
 ```
 
 
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ContainerUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ContainerUtils.java
new file mode 100644
index 0000000000..747ecabbf7
--- /dev/null
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ContainerUtils.java
@@ -0,0 +1,172 @@
+package com.blankj.utilcode.util;
+
+import android.os.Build;
+import android.support.annotation.RequiresApi;
+import android.support.v4.util.SimpleArrayMap;
+import android.util.SparseArray;
+import android.util.SparseBooleanArray;
+import android.util.SparseIntArray;
+import android.util.SparseLongArray;
+
+import java.util.Collection;
+import java.util.Collections;
+
+/**
+ * 
+ *     author: blankj
+ *     blog  : http://blankj.com
+ *     time  : 2019/07/26
+ *     desc  : utils about container
+ * 
+ */ +public final class ContainerUtils { + + private ContainerUtils() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + public static boolean isEmpty(T[] arr) { + return arr == null || arr.length == 0; + } + + public static boolean isEmpty(final Collection obj) { + return obj == null || obj.isEmpty(); + } + + public static boolean isEmpty(final java.util.Map obj) { + return obj == null || obj.isEmpty(); + } + + public static boolean isEmpty(final SimpleArrayMap obj) { + return obj == null || obj.isEmpty(); + } + + public static boolean isEmpty(final SparseArray obj) { + return obj == null || obj.size() == 0; + } + + public static boolean isEmpty(final SparseBooleanArray obj) { + return obj == null || obj.size() == 0; + } + + public static boolean isEmpty(final SparseIntArray obj) { + return obj == null || obj.size() == 0; + } + + public static boolean isEmpty(final android.support.v4.util.LongSparseArray obj) { + return obj == null || obj.size() == 0; + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public static boolean isEmpty(final android.util.LongSparseArray obj) { + return obj == null || obj.size() == 0; + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public static boolean isEmpty(final SparseLongArray obj) { + return obj == null || obj.size() == 0; + } + + public static boolean isNotEmpty(V[] obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final Collection obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final java.util.Map obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final SimpleArrayMap obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final SparseArray obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final SparseBooleanArray obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final SparseIntArray obj) { + return !isEmpty(obj); + } + + public static boolean isNotEmpty(final android.support.v4.util.LongSparseArray obj) { + return !isEmpty(obj); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN) + public static boolean isNotEmpty(final android.util.LongSparseArray obj) { + return !isEmpty(obj); + } + + @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) + public static boolean isNotEmpty(final SparseLongArray obj) { + return !isEmpty(obj); + } + + + public static final class Array { + + private Array() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + public static int getSize(final T[] arr) { + if (isEmpty(arr)) return 0; + return arr.length; + } + + public static void reverse(final T[] arr) { + int size = getSize(arr); + if (size <= 1) return; + int mid = size >> 1; + T tmp; + for (int i = 0; i < mid; i++) { + tmp = arr[i]; + arr[i] = arr[size - i - 1]; + arr[size - i - 1] = tmp; + } + } + } + + + public static final class List { + + private List() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + public static int getSize(java.util.List list) { + if (isEmpty(list)) return 0; + return list.size(); + } + + public static void reverse(java.util.List list) { + if (getSize(list) <= 1) return; + Collections.reverse(list); + } + + } + + + public static final class Map { + + private Map() { + throw new UnsupportedOperationException("u can't instantiate me..."); + } + + public static int getSize(java.util.Map map) { + if (isEmpty(map)) return 0; + return map.size(); + } + + + } + + +} diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java index d35cbcc620..4f20f3f31d 100755 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/PermissionUtils.java @@ -410,7 +410,9 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { - sInstance.onRequestPermissionsResult(this); + if (sInstance != null && sInstance.mPermissionsRequest != null) { + sInstance.onRequestPermissionsResult(this); + } finish(); } diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java index 2782d7f7cd..c5785c5910 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java @@ -1,12 +1,12 @@ package com.blankj.utilcode.util; -import android.annotation.SuppressLint; import android.os.Handler; import android.os.Looper; import android.support.annotation.IntRange; import android.support.annotation.NonNull; import android.util.Log; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Timer; @@ -33,7 +33,7 @@ */ public final class ThreadUtils { - private static final Map> TYPE_PRIORITY_POOLS = new ConcurrentHashMap<>(); + private static final Map> TYPE_PRIORITY_POOLS = new HashMap<>(); private static final Map TASK_TIMERTASK_MAP = new ConcurrentHashMap<>(); @@ -944,23 +944,24 @@ private static ExecutorService getPoolByTypeAndPriority(final int type) { return getPoolByTypeAndPriority(type, Thread.NORM_PRIORITY); } - @SuppressLint("UseSparseArrays") - private synchronized static ExecutorService getPoolByTypeAndPriority(final int type, final int priority) { - ExecutorService pool; - Map priorityPools = TYPE_PRIORITY_POOLS.get(type); - if (priorityPools == null) { - priorityPools = new ConcurrentHashMap<>(); - pool = ThreadPoolExecutor4Util.createPool(type, priority); - priorityPools.put(priority, pool); - TYPE_PRIORITY_POOLS.put(type, priorityPools); - } else { - pool = priorityPools.get(priority); - if (pool == null) { + private static ExecutorService getPoolByTypeAndPriority(final int type, final int priority) { + synchronized (TYPE_PRIORITY_POOLS) { + ExecutorService pool; + Map priorityPools = TYPE_PRIORITY_POOLS.get(type); + if (priorityPools == null) { + priorityPools = new ConcurrentHashMap<>(); pool = ThreadPoolExecutor4Util.createPool(type, priority); priorityPools.put(priority, pool); + TYPE_PRIORITY_POOLS.put(type, priorityPools); + } else { + pool = priorityPools.get(priority); + if (pool == null) { + pool = ThreadPoolExecutor4Util.createPool(type, priority); + priorityPools.put(priority, pool); + } } + return pool; } - return pool; } static final class ThreadPoolExecutor4Util extends ThreadPoolExecutor { @@ -986,9 +987,9 @@ private static ExecutorService createPool(final int type, final int priority) { new UtilsThreadFactory("io", priority) ); case TYPE_CPU: - return new ThreadPoolExecutor4Util(CPU_COUNT + 1, CPU_COUNT + 1, + return new ThreadPoolExecutor4Util(CPU_COUNT + 1, 2 * CPU_COUNT + 1, 30, TimeUnit.SECONDS, - new LinkedBlockingQueue4Util(), + new LinkedBlockingQueue4Util(true), new UtilsThreadFactory("cpu", priority) ); default: @@ -1046,7 +1047,7 @@ private static final class LinkedBlockingQueue4Util extends LinkedBlockingQueue< private volatile ThreadPoolExecutor4Util mPool; - private boolean mIsAddSubThreadFirstThenAddQueue = false; + private int mCapacity = Integer.MAX_VALUE; LinkedBlockingQueue4Util() { super(); @@ -1054,12 +1055,19 @@ private static final class LinkedBlockingQueue4Util extends LinkedBlockingQueue< LinkedBlockingQueue4Util(boolean isAddSubThreadFirstThenAddQueue) { super(); - mIsAddSubThreadFirstThenAddQueue = isAddSubThreadFirstThenAddQueue; + if (isAddSubThreadFirstThenAddQueue) { + mCapacity = 0; + } + } + + LinkedBlockingQueue4Util(int capacity) { + super(); + mCapacity = capacity; } @Override public boolean offer(@NonNull Runnable runnable) { - if (mIsAddSubThreadFirstThenAddQueue && + if (mCapacity <= size() && mPool != null && mPool.getPoolSize() < mPool.getMaximumPoolSize()) { // create a non-core thread return false; diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java index 9cdc0d54be..d2a301c63b 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ZipUtils.java @@ -293,7 +293,7 @@ public static List unzipFileByKeyword(final File zipFile, if (isSpace(keyword)) { while (entries.hasMoreElements()) { ZipEntry entry = ((ZipEntry) entries.nextElement()); - String entryName = entry.getName(); + String entryName = entry.getName().replace("\\", "/"); if (entryName.contains("../")) { Log.e("ZipUtils", "entryName: " + entryName + " is dangerous!"); continue; @@ -303,7 +303,7 @@ public static List unzipFileByKeyword(final File zipFile, } else { while (entries.hasMoreElements()) { ZipEntry entry = ((ZipEntry) entries.nextElement()); - String entryName = entry.getName(); + String entryName = entry.getName().replace("\\", "/"); if (entryName.contains("../")) { Log.e("ZipUtils", "entryName: " + entryName + " is dangerous!"); continue; @@ -378,7 +378,7 @@ public static List getFilesPath(final File zipFile) ZipFile zip = new ZipFile(zipFile); Enumeration entries = zip.entries(); while (entries.hasMoreElements()) { - String entryName = ((ZipEntry) entries.nextElement()).getName(); + String entryName = ((ZipEntry) entries.nextElement()).getName().replace("\\", "/");; if (entryName.contains("../")) { Log.e("ZipUtils", "entryName: " + entryName + " is dangerous!"); paths.add(entryName); diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java index f30ee7cca4..06c360cffc 100644 --- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java +++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/BaseTest.java @@ -10,9 +10,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowLog; -import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executor; -import java.util.concurrent.TimeUnit; /** *
@@ -39,25 +37,6 @@ public void execute(@NonNull Runnable command) {
 
     @Test
     public void test() throws Exception {
-        CountDownLatch latch = new CountDownLatch(1);
-
-        for (int i = 0; i < 100; i++) {
-            final int finalI = i;
-            ThreadUtils.executeByCpu(new ThreadUtils.SimpleTask() {
-                @Override
-                public Void doInBackground() throws Throwable {
-                    System.out.println("" + Thread.currentThread() + finalI);
-                    Thread.sleep(100);
-                    return null;
-                }
-
-                @Override
-                public void onSuccess(Void result) {
-
-                }
-            });
-        }
-
-        latch.await(1, TimeUnit.SECONDS);
+
     }
 }
diff --git a/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java b/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
index 558d1062c0..aad1ef6789 100644
--- a/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
+++ b/lib/utilcode/src/test/java/com/blankj/utilcode/util/ZipUtilsTest.java
@@ -1,6 +1,5 @@
 package com.blankj.utilcode.util;
 
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -59,8 +58,8 @@ public void getComments() throws Exception {
         System.out.println(ZipUtils.getComments(zipFile));
     }
 
-    @After
-    public void tearDown() {
-        FileUtils.deleteAllInDir(PATH_TEMP);
-    }
+//    @After
+//    public void tearDown() {
+//        FileUtils.deleteAllInDir(PATH_TEMP);
+//    }
 }
\ No newline at end of file
diff --git a/lib/utildebug/.gitignore b/lib/utildebug/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/lib/utildebug/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/lib/utildebug/build.gradle b/lib/utildebug/build.gradle
new file mode 100644
index 0000000000..5a5bb7e07f
--- /dev/null
+++ b/lib/utildebug/build.gradle
@@ -0,0 +1,15 @@
+apply {
+    plugin "com.github.dcendents.android-maven"
+    plugin "com.jfrog.bintray"
+    from "${rootDir.path}/gradle/upload/bintrayUploadAndroid.gradle"
+}
+
+dependencies {
+    implementation Config.depConfig.lib.utilcode.dep
+    compileOnly Config.depConfig.support.appcompat_v7.dep
+    compileOnly Config.depConfig.support.design.dep
+
+    testImplementation Config.depConfig.test.junit.dep
+    testImplementation Config.depConfig.test.robolectric.dep
+    testImplementation Config.depConfig.support.appcompat_v7.dep
+}
\ No newline at end of file
diff --git a/lib/utildebug/proguard-rules.pro b/lib/utildebug/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/lib/utildebug/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/lib/utildebug/src/main/AndroidManifest.xml b/lib/utildebug/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..11a29aa41f
--- /dev/null
+++ b/lib/utildebug/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
diff --git a/lib/utildebug/src/main/res/values/strings.xml b/lib/utildebug/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..f11f7450a8
--- /dev/null
+++ b/lib/utildebug/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+
+
diff --git a/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java b/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
new file mode 100644
index 0000000000..ea1f901d70
--- /dev/null
+++ b/lib/utildebug/src/test/java/com/blankj/utildebug/ExampleUnitTest.java
@@ -0,0 +1,17 @@
+package com.blankj.utildebug;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * @see Testing documentation
+ */
+public class ExampleUnitTest {
+    @Test
+    public void addition_isCorrect() {
+        assertEquals(4, 2 + 2);
+    }
+}
\ No newline at end of file
diff --git a/plugin/api-gradle-plugin/README.md b/plugin/api-gradle-plugin/README.md
index 57b9cfdb85..80ab54dc90 100644
--- a/plugin/api-gradle-plugin/README.md
+++ b/plugin/api-gradle-plugin/README.md
@@ -45,7 +45,7 @@ apply plugin: "com.blankj.api"
 api "com.blankj:utilcode:latest_version"
 ```
 
-如果你单纯只想引入 `ApiUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,然后在 app 下的 `build.gradle` 中 配置 api 的 SDL 域如下所示:
+如果你单纯只想引入 `ApiUtils` 也是可以的,需要你自己拷贝一份这个类放到你工程里,然后在 app 下的 `build.gradle` 中 配置 api 的 DSL 域如下所示:
 
 ```groovy
 api {

From 58513446334ad7059c1636c35448cd1f77a9278e Mon Sep 17 00:00:00 2001
From: Blankj <625783482@qq.com>
Date: Sun, 28 Jul 2019 12:19:42 +0800
Subject: [PATCH 017/173] see 07/28 log

---
 CHANGELOG.md                                  |   2 +
 README-CN.md                                  |   2 +-
 README.md                                     |   2 +-
 buildSrc/src/main/groovy/Config.groovy        |   4 +-
 .../pkg/feature/network/NetworkActivity.kt    | 122 +++++++-----------
 lib/utilcode/README-CN.md                     |   4 +-
 lib/utilcode/README.md                        |   4 +-
 .../com/blankj/utilcode/util/BarUtils.java    |   4 +-
 .../blankj/utilcode/util/KeyboardUtils.java   |   4 +-
 .../blankj/utilcode/util/NetworkUtils.java    | 109 +++++++++++++++-
 .../com/blankj/utilcode/util/ThreadUtils.java |  46 ++++---
 11 files changed, 194 insertions(+), 109 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d5b1b84f7..6227eca50f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,5 @@
+* `19/07/28` [add] NetworkUtils#(un)registerNetworkStatusChangedListener. Publish v1.25.3.
+* `19/07/27` [fix] ThreadUtils memory leak.
 * `19/07/26` [add] ContainerUtils. Publish v1.25.2.
 * `19/07/25` [fix] PermissionUtils' NullPointException.
 * `19/07/24` [fix] ZipUtils#unzipFile.
diff --git a/README-CN.md b/README-CN.md
index 00f811aee2..d9a991369f 100644
--- a/README-CN.md
+++ b/README-CN.md
@@ -45,7 +45,7 @@
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.2-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.3-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/README.md b/README.md
index de338f9347..c44d4cec62 100644
--- a/README.md
+++ b/README.md
@@ -45,7 +45,7 @@ If this project helps you a lot and you want to support the project's developmen
 
 [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png
 
-[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.2-brightgreen.svg
+[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.3-brightgreen.svg
 [auc]: https://github.com/Blankj/AndroidUtilCode
 
 [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg
diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy
index 85859adde4..b4d0d64ef6 100644
--- a/buildSrc/src/main/groovy/Config.groovy
+++ b/buildSrc/src/main/groovy/Config.groovy
@@ -14,8 +14,8 @@ class Config {
     static compileSdkVersion = 27
     static minSdkVersion = 14
     static targetSdkVersion = 27
-    static versionCode = 1_025_002
-    static versionName = '1.25.2'// E.g. 1.9.72 => 1,009,072
+    static versionCode = 1_025_003
+    static versionName = '1.25.3'// E.g. 1.9.72 => 1,009,072
 
     // lib version
     static kotlin_version = '1.3.10'
diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
index d1617f15b4..f0ed896a1c 100644
--- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
+++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/network/NetworkActivity.kt
@@ -9,9 +9,9 @@ import com.blankj.common.CommonTitleActivity
 import com.blankj.utilcode.pkg.R
 import com.blankj.utilcode.util.NetworkUtils
 import com.blankj.utilcode.util.SpanUtils
-import com.blankj.utilcode.util.Utils
+import com.blankj.utilcode.util.ThreadUtils
+import com.blankj.utilcode.util.ToastUtils
 import kotlinx.android.synthetic.main.activity_network.*
-import java.util.concurrent.atomic.AtomicInteger
 
 /**
  * ```
@@ -21,10 +21,7 @@ import java.util.concurrent.atomic.AtomicInteger
  * desc  : demo about NetworkUtils
  * ```
  */
-class NetworkActivity : CommonTitleActivity() {
-
-    var cur: Int = 0
-    var count: AtomicInteger = AtomicInteger();
+class NetworkActivity : CommonTitleActivity(), NetworkUtils.OnNetworkStatusChangedListener {
 
     companion object {
         fun start(context: Context) {
@@ -33,8 +30,6 @@ class NetworkActivity : CommonTitleActivity() {
         }
     }
 
-    private lateinit var spanSb: SpannableStringBuilder
-
     override fun bindTitle(): CharSequence {
         return getString(R.string.demo_network)
     }
@@ -52,6 +47,7 @@ class NetworkActivity : CommonTitleActivity() {
             NetworkUtils.setWifiEnabled(isChecked)
             updateAboutNetwork()
         }
+        NetworkUtils.registerNetworkStatusChangedListener(this)
     }
 
     override fun onResume() {
@@ -66,18 +62,45 @@ class NetworkActivity : CommonTitleActivity() {
         when (view.id) {
             R.id.networkOpenWirelessSettingsBtn -> NetworkUtils.openWirelessSettings()
         }
-        updateAboutNetwork()
     }
 
-    private lateinit var ipV4AddressAsyncTask: Utils.Task
-    private lateinit var ipV6AddressAsyncTask: Utils.Task
-    private lateinit var wifiAvailableAsyncTask: Utils.Task
-    private lateinit var availableAsyncTask: Utils.Task
-    private lateinit var domainAddressAsyncTask: Utils.Task
+    private lateinit var task: ThreadUtils.SimpleTask
 
     private fun updateAboutNetwork() {
-        spanSb = SpanUtils.with(networkAboutTv)
-                .appendLine("isConnected: " + NetworkUtils.isConnected())
+
+        SpanUtils.with(networkAboutTv)
+                .append(getSpan())
+                .appendLine("")
+                .appendLine("")
+                .appendLine("")
+                .appendLine("")
+                .appendLine("Loading...")
+                .create()
+
+        task = object : ThreadUtils.SimpleTask() {
+
+            override fun doInBackground(): String {
+                val sb: StringBuilder = StringBuilder();
+                sb.appendln("getIPv4Address: ${NetworkUtils.getIPAddress(true)}")
+                sb.appendln("getIPv6Address: ${NetworkUtils.getIPAddress(false)}")
+                sb.appendln("isWifiAvailable: ${NetworkUtils.isWifiAvailable()}")
+                sb.appendln("isAvailable: ${NetworkUtils.isAvailable()}")
+                sb.appendln("getBaiduDomainAddress: ${NetworkUtils.getDomainAddress("baidu.com")}")
+                return sb.toString()
+            }
+
+            override fun onSuccess(result: String) {
+                SpanUtils.with(networkAboutTv)
+                        .append(getSpan())
+                        .append(result)
+                        .create()
+            }
+        }
+        ThreadUtils.executeByCached(task)
+    }
+
+    private fun getSpan(): SpannableStringBuilder {
+        return SpanUtils().appendLine("isConnected: " + NetworkUtils.isConnected())
                 .appendLine("getMobileDataEnabled: " + NetworkUtils.getMobileDataEnabled())
                 .appendLine("isMobileData: " + NetworkUtils.isMobileData())
                 .appendLine("is4G: " + NetworkUtils.is4G())
@@ -89,72 +112,23 @@ class NetworkActivity : CommonTitleActivity() {
                 .appendLine("getIpAddressByWifi: " + NetworkUtils.getIpAddressByWifi())
                 .appendLine("getGatewayByWifi: " + NetworkUtils.getGatewayByWifi())
                 .appendLine("getNetMaskByWifi: " + NetworkUtils.getNetMaskByWifi())
-                .append("getServerAddressByWifi: " + NetworkUtils.getServerAddressByWifi())
+                .appendLine("getServerAddressByWifi: " + NetworkUtils.getServerAddressByWifi())
                 .create()
-        cur += 5
-
-        ipV4AddressAsyncTask = NetworkUtils.getIPAddressAsync(true) { data ->
-            val num = count.get()
-            if (num >= cur - 5) {
-                spanSb = SpanUtils().appendLine(spanSb)
-                        .append("getIPv4Address: $data")
-                        .create()
-                networkAboutTv.text = spanSb
-            }
-            count.addAndGet(1)
-        }
+    }
 
-        ipV6AddressAsyncTask = NetworkUtils.getIPAddressAsync(false) { data ->
-            val num = count.get()
-            if (num >= cur - 5) {
-                spanSb = SpanUtils().appendLine(spanSb)
-                        .append("getIPv6Address: $data")
-                        .create()
-                networkAboutTv.text = spanSb
-            }
-            count.addAndGet(1)
-        }
+    override fun onDisconnected() {
+        ToastUtils.showLong("onDisconnected")
+    }
 
-        wifiAvailableAsyncTask = NetworkUtils.isWifiAvailableAsync { data ->
-            val num = count.get()
-            if (num >= cur - 5) {
-                spanSb = SpanUtils().appendLine(spanSb)
-                        .append("isWifiAvailable: $data")
-                        .create()
-                networkAboutTv.text = spanSb
-            }
-            count.addAndGet(1)
-        }
+    override fun onConnected(networkType: NetworkUtils.NetworkType) {
 
-        availableAsyncTask = NetworkUtils.isAvailableAsync { data ->
-            val num = count.get()
-            if (num >= cur - 5) {
-                spanSb = SpanUtils().appendLine(spanSb)
-                        .append("isAvailable: $data")
-                        .create()
-                networkAboutTv.text = spanSb
-            }
-            count.addAndGet(1)
-        }
 
-        domainAddressAsyncTask = NetworkUtils.getDomainAddressAsync("baidu.com") { data ->
-            val num = count.get()
-            if (num >= cur - 5) {
-                spanSb = SpanUtils().appendLine(spanSb)
-                        .append("getBaiduDomainAddress: $data")
-                        .create()
-                networkAboutTv.text = spanSb
-            }
-            count.addAndGet(1)
-        }
+        ToastUtils.showLong("onConnected: ${networkType.name}")
     }
 
     override fun onDestroy() {
-        ipV4AddressAsyncTask.cancel()
-        ipV6AddressAsyncTask.cancel()
-        wifiAvailableAsyncTask.cancel()
-        availableAsyncTask.cancel()
-        domainAddressAsyncTask.cancel()
+        task.cancel()
+        NetworkUtils.unregisterOnNetworkChangedListener(this)
         super.onDestroy()
     }
 }
diff --git a/lib/utilcode/README-CN.md b/lib/utilcode/README-CN.md
index 8b27520ae3..63444bb5e3 100644
--- a/lib/utilcode/README-CN.md
+++ b/lib/utilcode/README-CN.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.2'
+implementation 'com.blankj:utilcode:1.25.3'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.2'
+implementation 'com.blankj:utilcodex:1.25.3'
 ```
 
 
diff --git a/lib/utilcode/README.md b/lib/utilcode/README.md
index 408cbba37b..322488a692 100644
--- a/lib/utilcode/README.md
+++ b/lib/utilcode/README.md
@@ -2,10 +2,10 @@
 
 Gradle:
 ```groovy
-implementation 'com.blankj:utilcode:1.25.2'
+implementation 'com.blankj:utilcode:1.25.3'
 
 // if u use AndroidX, use the following
-implementation 'com.blankj:utilcodex:1.25.2'
+implementation 'com.blankj:utilcodex:1.25.3'
 ```
 
 
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
index 7b5509b2b5..5137124495 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/BarUtils.java
@@ -57,7 +57,7 @@ private BarUtils() {
      * @return the status bar's height
      */
     public static int getStatusBarHeight() {
-        Resources resources = Resources.getSystem();
+        Resources resources = Utils.getApp().getResources();
         int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
         return resources.getDimensionPixelSize(resourceId);
     }
@@ -453,7 +453,7 @@ private static void invokePanels(final String methodName) {
      * @return the navigation bar's height
      */
     public static int getNavBarHeight() {
-        Resources res = Resources.getSystem();
+        Resources res = Utils.getApp().getResources();
         int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
         if (resourceId != 0) {
             return res.getDimensionPixelSize(resourceId);
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
index f875ced39b..73fa19bba2 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/KeyboardUtils.java
@@ -306,13 +306,13 @@ private boolean isShouldHideKeyboard(View v, MotionEvent event) {
     }
 
     private static int getStatusBarHeight() {
-        Resources resources = Resources.getSystem();
+        Resources resources = Utils.getApp().getResources();
         int resourceId = resources.getIdentifier("status_bar_height", "dimen", "android");
         return resources.getDimensionPixelSize(resourceId);
     }
 
     private static int getNavBarHeight() {
-        Resources res = Resources.getSystem();
+        Resources res = Utils.getApp().getResources();
         int resourceId = res.getIdentifier("navigation_bar_height", "dimen", "android");
         if (resourceId != 0) {
             return res.getDimensionPixelSize(resourceId);
diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
index e0828aba66..dc23ae8fe4 100644
--- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
+++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/NetworkUtils.java
@@ -1,8 +1,10 @@
 package com.blankj.utilcode.util;
 
 import android.annotation.SuppressLint;
+import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
+import android.content.IntentFilter;
 import android.net.ConnectivityManager;
 import android.net.NetworkInfo;
 import android.net.wifi.WifiManager;
@@ -21,8 +23,10 @@
 import java.net.SocketException;
 import java.net.UnknownHostException;
 import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 import static android.Manifest.permission.ACCESS_NETWORK_STATE;
 import static android.Manifest.permission.ACCESS_WIFI_STATE;
@@ -50,7 +54,8 @@ public enum NetworkType {
         NETWORK_4G,
         NETWORK_3G,
         NETWORK_2G,
-        NETWORK_UNKNOWN
+        NETWORK_UNKNOWN,
+        NETWORK_NO
     }
 
     /**
@@ -376,6 +381,7 @@ public static String getNetworkOperatorName() {
      * 
  • {@link NetworkUtils.NetworkType#NETWORK_3G }
  • *
  • {@link NetworkUtils.NetworkType#NETWORK_2G }
  • *
  • {@link NetworkUtils.NetworkType#NETWORK_UNKNOWN }
  • + *
  • {@link NetworkUtils.NetworkType#NETWORK_NO }
  • * */ @RequiresPermission(ACCESS_NETWORK_STATE) @@ -419,11 +425,15 @@ public static NetworkType getNetworkType() { || subtypeName.equalsIgnoreCase("WCDMA") || subtypeName.equalsIgnoreCase("CDMA2000")) { return NetworkType.NETWORK_3G; + } else { + return NetworkType.NETWORK_UNKNOWN; } } + } else { + return NetworkType.NETWORK_UNKNOWN; } } - return NetworkType.NETWORK_UNKNOWN; + return NetworkType.NETWORK_NO; } /** @@ -632,4 +642,99 @@ public static String getServerAddressByWifi() { if (wm == null) return ""; return Formatter.formatIpAddress(wm.getDhcpInfo().serverAddress); } + + /** + * Register the status of network changed listener. + * + * @param listener The status of network changed listener + */ + public static void registerNetworkStatusChangedListener(OnNetworkStatusChangedListener listener) { + NetworkChangedReceiver.getInstance().registerListener(listener); + } + + /** + * unregister the status of network changed listener. + * + * @param listener The status of network changed listener + */ + public static void unregisterOnNetworkChangedListener(OnNetworkStatusChangedListener listener) { + NetworkChangedReceiver.getInstance().unregisterListener(listener); + } + + public static final class NetworkChangedReceiver extends BroadcastReceiver { + + private static NetworkChangedReceiver getInstance() { + return LazyHolder.INSTANCE; + } + + private NetworkType mType; + private Set mListeners = new HashSet<>(); + + void registerListener(final OnNetworkStatusChangedListener listener) { + if (listener == null) return; + Utils.runOnUiThread(new Runnable() { + @SuppressLint("MissingPermission") + @Override + public void run() { + int preSize = mListeners.size(); + mListeners.add(listener); + if (preSize == 0 && mListeners.size() == 1) { + mType = getNetworkType(); + IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); + Utils.getApp().registerReceiver(NetworkChangedReceiver.getInstance(), intentFilter); + } + } + }); + } + + void unregisterListener(final OnNetworkStatusChangedListener listener) { + if (listener == null) return; + Utils.runOnUiThread(new Runnable() { + @Override + public void run() { + int preSize = mListeners.size(); + mListeners.remove(listener); + if (preSize == 1 && mListeners.size() == 0) { + Utils.getApp().unregisterReceiver(NetworkChangedReceiver.getInstance()); + } + } + }); + } + + @SuppressLint("MissingPermission") + @Override + public void onReceive(Context context, Intent intent) { + if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) { + // debouncing + Utils.runOnUiThreadDelayed(new Runnable() { + @Override + public void run() { + NetworkType networkType = NetworkUtils.getNetworkType(); + if (mType == networkType) return; + LogUtils.e(networkType); + mType = networkType; + if (networkType == NetworkType.NETWORK_NO) { + for (OnNetworkStatusChangedListener listener : mListeners) { + listener.onDisconnected(); + } + } else { + for (OnNetworkStatusChangedListener listener : mListeners) { + listener.onConnected(networkType); + } + } + } + }, 1000); + } + } + + private static class LazyHolder { + private static final NetworkChangedReceiver INSTANCE = new NetworkChangedReceiver(); + } + } + + public interface OnNetworkStatusChangedListener { + void onDisconnected(); + + void onConnected(NetworkType networkType); + } } diff --git a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java index c5785c5910..b54633d94a 100644 --- a/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java +++ b/lib/utilcode/src/main/java/com/blankj/utilcode/util/ThreadUtils.java @@ -12,7 +12,6 @@ import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; @@ -35,9 +34,7 @@ public final class ThreadUtils { private static final Map> TYPE_PRIORITY_POOLS = new HashMap<>(); - private static final Map TASK_TIMERTASK_MAP = new ConcurrentHashMap<>(); - - private static final Map> POOL_TASK_MAP = new ConcurrentHashMap<>(); + private static final Map TASK_TASKINFO_MAP = new ConcurrentHashMap<>(); private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors(); private static final Timer TIMER = new Timer(); @@ -881,8 +878,11 @@ public static void cancel(final List tasks) { */ public static void cancel(ExecutorService executorService) { if (executorService instanceof ThreadPoolExecutor4Util) { - List tasks = POOL_TASK_MAP.get(executorService); - cancel(tasks); + for (Map.Entry taskTaskInfoEntry : TASK_TASKINFO_MAP.entrySet()) { + if (taskTaskInfoEntry.getValue().mService == executorService) { + cancel(taskTaskInfoEntry.getKey()); + } + } } else { Log.e("LogUtils", "The executorService is not ThreadUtils's pool."); } @@ -904,11 +904,10 @@ private static void executeWithDelay(final ExecutorService pool, TimerTask timerTask = new TimerTask() { @Override public void run() { - execute(pool, task); + execute(pool, task, this); } }; TIMER.schedule(timerTask, unit.toMillis(delay)); - TASK_TIMERTASK_MAP.put(task, timerTask); } private static void executeAtFixedRate(final ExecutorService pool, @@ -920,24 +919,20 @@ private static void executeAtFixedRate(final ExecutorService pool, TimerTask timerTask = new TimerTask() { @Override public void run() { - execute(pool, task); + execute(pool, task, this); } }; TIMER.scheduleAtFixedRate(timerTask, unit.toMillis(initialDelay), unit.toMillis(period)); } private static void execute(final ExecutorService pool, final Task task) { - pool.execute(task); - recordTask(pool, task); + execute(pool, task, null); } - private static void recordTask(ExecutorService pool, Task task) { - List tasks = POOL_TASK_MAP.get(pool); - if (tasks == null) { - tasks = new CopyOnWriteArrayList<>(); - POOL_TASK_MAP.put(pool, tasks); - } - tasks.add(task); + private static void execute(final ExecutorService pool, final Task task, + final TimerTask timerTask) { + pool.execute(task); + TASK_TASKINFO_MAP.put(task, new TaskInfo(timerTask, pool)); } private static ExecutorService getPoolByTypeAndPriority(final int type) { @@ -1268,10 +1263,19 @@ public void execute(@NonNull Runnable command) { } private static void cancelTimerTask(final Task task) { - TimerTask timerTask = TASK_TIMERTASK_MAP.get(task); + TaskInfo timerTask = TASK_TASKINFO_MAP.get(task); if (timerTask != null) { - TASK_TIMERTASK_MAP.remove(task); - timerTask.cancel(); + TASK_TASKINFO_MAP.remove(task); + } + } + + private static class TaskInfo { + private TimerTask mTimerTask; + private ExecutorService mService; + + private TaskInfo(TimerTask timerTask, ExecutorService service) { + mTimerTask = timerTask; + mService = service; } } } From 253bebfa4df3c61434aabda102b0ba6a961aed59 Mon Sep 17 00:00:00 2001 From: Blankj <625783482@qq.com> Date: Tue, 30 Jul 2019 10:03:26 +0800 Subject: [PATCH 018/173] see 07/29 log --- CHANGELOG.md | 1 + README-CN.md | 2 +- README.md | 2 +- buildSrc/src/main/groovy/Config.groovy | 10 +- .../utilcode/pkg/feature/bus/BusActivity.kt | 11 + .../pkg/feature/image/ImageActivity.kt | 55 ++-- .../pkg/src/main/res/layout/activity_bus.xml | 7 + .../pkg/src/main/res/values/strings.xml | 1 + .../java/com/blankj/base/rv/BaseAdapter.java | 89 ------- .../java/com/blankj/base/rv/BaseCell.java | 59 ----- .../java/com/blankj/base/rv/BaseItem.java | 81 ++++++ .../com/blankj/base/rv/BaseItemAdapter.java | 249 ++++++++++++++++++ ...aseViewHolder.java => ItemViewHolder.java} | 14 +- lib/utilcode/README-CN.md | 4 +- lib/utilcode/README.md | 4 +- .../com/blankj/utilcode/util/BusUtils.java | 83 +++++- .../blankj/utilcode/util/KeyboardUtils.java | 5 +- .../com/blankj/utilcode/util/ThreadUtils.java | 13 +- .../com/blankj/utilcode/util/ToastUtils.java | 17 +- .../com/blankj/utilcode/util/BaseTest.java | 9 +- .../blankj/utilcode/util/BusUtilsTest.java | 8 + .../java/com/blankj/bus/BusClassVisitor.java | 1 + 22 files changed, 513 insertions(+), 212 deletions(-) delete mode 100644 lib/base/src/main/java/com/blankj/base/rv/BaseAdapter.java delete mode 100644 lib/base/src/main/java/com/blankj/base/rv/BaseCell.java create mode 100644 lib/base/src/main/java/com/blankj/base/rv/BaseItem.java create mode 100644 lib/base/src/main/java/com/blankj/base/rv/BaseItemAdapter.java rename lib/base/src/main/java/com/blankj/base/rv/{BaseViewHolder.java => ItemViewHolder.java} (60%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6227eca50f..0dce0b5e8f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +* `19/07/29` [fix] BusUtils post father class useless. KeyboardUtils#hideSoft bug. Publish v1.25.4. * `19/07/28` [add] NetworkUtils#(un)registerNetworkStatusChangedListener. Publish v1.25.3. * `19/07/27` [fix] ThreadUtils memory leak. * `19/07/26` [add] ContainerUtils. Publish v1.25.2. diff --git a/README-CN.md b/README-CN.md index d9a991369f..8ba626723c 100644 --- a/README-CN.md +++ b/README-CN.md @@ -45,7 +45,7 @@ [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.3-brightgreen.svg +[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.4-brightgreen.svg [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/README.md b/README.md index c44d4cec62..19b0d51537 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ If this project helps you a lot and you want to support the project's developmen [frame]: https://raw.githubusercontent.com/Blankj/AndroidUtilCode/master/art/auc_frame.png -[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.3-brightgreen.svg +[aucSvg]: https://img.shields.io/badge/AndroidUtilCode-v1.25.4-brightgreen.svg [auc]: https://github.com/Blankj/AndroidUtilCode [apiSvg]: https://img.shields.io/badge/API-14+-brightgreen.svg diff --git a/buildSrc/src/main/groovy/Config.groovy b/buildSrc/src/main/groovy/Config.groovy index b4d0d64ef6..a5f6560979 100644 --- a/buildSrc/src/main/groovy/Config.groovy +++ b/buildSrc/src/main/groovy/Config.groovy @@ -11,15 +11,15 @@ class Config { static applicationId = 'com.blankj.androidutilcode' static appName = 'Util' - static compileSdkVersion = 27 + static compileSdkVersion = 28 static minSdkVersion = 14 - static targetSdkVersion = 27 - static versionCode = 1_025_003 - static versionName = '1.25.3'// E.g. 1.9.72 => 1,009,072 + static targetSdkVersion = 28 + static versionCode = 1_025_004 + static versionName = '1.25.4'// E.g. 1.9.72 => 1,009,072 // lib version static kotlin_version = '1.3.10' - static support_version = '27.1.1' + static support_version = '28.0.0' static leakcanary_version = '1.6.3' // appConfig 配置的是可以跑 app 的模块,git 提交务必只包含 launcher diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt index 57f73ae3b8..313389cc08 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/bus/BusActivity.kt @@ -10,6 +10,7 @@ import com.blankj.utilcode.pkg.R import com.blankj.utilcode.util.BusUtils import com.blankj.utilcode.util.Utils import kotlinx.android.synthetic.main.activity_bus.* +import kotlin.random.Random /** * ``` @@ -21,6 +22,11 @@ import kotlinx.android.synthetic.main.activity_bus.* */ class BusActivity : CommonTitleActivity() { + @BusUtils.Bus(tag = TAG_BASIC_TYPE) + fun test(param: Int) { + busAboutTv.text = param.toString() + } + @BusUtils.Bus(tag = TAG_BUS) fun test(param: String) { busAboutTv.text = param @@ -40,6 +46,7 @@ class BusActivity : CommonTitleActivity() { } companion object { + const val TAG_BASIC_TYPE = "tag_basic_type" const val TAG_BUS = "tag_bus" const val TAG_STICKY_BUS = "tag_sticky_bus" const val TAG_IO = "tag_io" @@ -65,6 +72,7 @@ class BusActivity : CommonTitleActivity() { busRegister, busUnregister, busPost, + busPostBasicType, busPostSticky, busPost2IoThread, busRemoveSticky, @@ -88,6 +96,9 @@ class BusActivity : CommonTitleActivity() { R.id.busPost -> { BusUtils.post(TAG_BUS, TAG_BUS) } + R.id.busPostBasicType -> { + BusUtils.post(TAG_BASIC_TYPE, Random(System.currentTimeMillis()).nextInt()) + } R.id.busPostSticky -> { BusUtils.postSticky(TAG_STICKY_BUS, object : Callback { override fun call(): String { diff --git a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt index 544af5d321..2f2abef58e 100644 --- a/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt +++ b/feature/utilcode/pkg/src/main/java/com/blankj/utilcode/pkg/feature/image/ImageActivity.kt @@ -9,12 +9,11 @@ import android.os.Bundle import android.support.annotation.StringRes import android.support.v7.widget.LinearLayoutManager import android.view.View -import android.widget.Button import android.widget.ImageView import android.widget.TextView -import com.blankj.base.rv.BaseAdapter -import com.blankj.base.rv.BaseCell -import com.blankj.base.rv.BaseViewHolder +import com.blankj.base.rv.BaseItem +import com.blankj.base.rv.BaseItemAdapter +import com.blankj.base.rv.ItemViewHolder import com.blankj.common.CommonTaskActivity import com.blankj.utilcode.pkg.Config import com.blankj.utilcode.pkg.R @@ -31,7 +30,7 @@ import kotlinx.android.synthetic.main.activity_image.* * desc : demo about ImageUtils * ``` */ -class ImageActivity : CommonTaskActivity>() { +class ImageActivity : CommonTaskActivity>() { companion object { fun start(context: Context) { @@ -42,7 +41,7 @@ class ImageActivity : CommonTaskActivity>() { private lateinit var src: Bitmap - override fun doInBackground(): List { + override fun doInBackground(): List { src = ImageUtils.getBitmap(R.drawable.image_lena) val round = ImageUtils.getBitmap(R.drawable.main_avatar_round) val watermark = ImageUtils.getBitmap(R.mipmap.ic_launcher) @@ -50,8 +49,8 @@ class ImageActivity : CommonTaskActivity>() { val width = src.width val height = src.height - return ArrayList().apply { - add(HeaderCell(src)) + return ArrayList().apply { + add(ImageCell(src)) add(ImageCell(R.string.image_src, src)) add(ImageCell(R.string.image_add_color, ImageUtils.drawColor(src, Color.parseColor("#8000FF00")))) add(ImageCell(R.string.image_scale, ImageUtils.scale(src, width / 2, height / 2))) @@ -80,9 +79,10 @@ class ImageActivity : CommonTaskActivity>() { } } - override fun runOnUiThread(data: List) { - val imageAdapter = BaseAdapter() - imageAdapter.data = data + override fun runOnUiThread(data: List) { + val imageAdapter = BaseItemAdapter() + imageAdapter.setHasStableIds(true) + imageAdapter.items = data imageRv.adapter = imageAdapter imageRv.layoutManager = LinearLayoutManager(this@ImageActivity) } @@ -105,20 +105,33 @@ class ImageActivity : CommonTaskActivity>() { override fun onDebouncingClick(view: View) {} } -class ImageCell(@StringRes val resId: Int, private val image: Bitmap) : BaseCell(R.layout.item_image) { +class ImageCell : BaseItem { - override fun bind(holder: BaseViewHolder, position: Int) { - holder.findViewById(R.id.imageItemNameTv).text = StringUtils.getString(resId) - holder.findViewById(R.id.imageItemIv).setImageBitmap(image) + private lateinit var mSrc: Bitmap + private var mResId: Int = 0 + private lateinit var mImage: Bitmap + + constructor(src: Bitmap) : super(R.layout.item_image_header) { + mSrc = src } -} -class HeaderCell(private val src: Bitmap) : BaseCell(R.layout.item_image_header) { + constructor(@StringRes resId: Int, image: Bitmap) : super(R.layout.item_image) { + mResId = resId + mImage = image + } - override fun bind(holder: BaseViewHolder, position: Int) { - holder.findViewById