配置:
1)添加依赖

 implementation 'com.github.bumptech.glide:glide:4.11.0'
 annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'

2)自定义类继承AppGlideModule,添加类注解@GlideModule,实现方法isManifestParsingEnabled(),并返回false如:

@GlideModule
public class CustomGlideModule extends AppGlideModule {
@Override
    public boolean isManifestParsingEnabled() {
        return false;
    }

`
3)之后可以通过重写其中的方法applyOptions(…)以及registerComponents(…)实现自己需要的配置,如:


```java
@Override
    public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
        File externalFilesDir = context.getExternalFilesDir(null);
        if (externalFilesDir != null) {
            String diskCacheFolder = externalFilesDir.getAbsolutePath();
            Log.e("TAG", "diskCacheFolder->" + diskCacheFolder);
            builder.setDiskCache(new DiskLruCacheFactory(diskCacheFolder, "imageCache", (1024 * 1024 * 50)));
        } else {
            Log.e("TAG", "null->");
        }
    }
4)在AndroidManifest.xml中<application>中添加<meta-data>项,如:

```java
<meta-data
            android:name="com.zjb.glide.CustomGlideModule"
            android:value="AppGlideModule"/>

5)混淆配置

-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$**{
  **[] $VALUES;
  public *;
}
-keep class com.bumptech.glide.GeneratedAppGlideModuleImpl {*;}

至此配置完成,初始化Glide时,会引用自定义的CustomGlideModule.

简单记下通过注解和实现自动引用CustomGlideModule的流程:
1)Glide初始化时首先调用Glide中的

@VisibleForTesting
  public static void init(@NonNull Context context, @NonNull GlideBuilder builder) {
    GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules(context);
    synchronized (Glide.class) {
      if (Glide.glide != null) {
        tearDown();
      }
      initializeGlide(context, builder, annotationGeneratedModule);
    }
  }

2)其中代码:

GeneratedAppGlideModule annotationGeneratedModule = getAnnotationGeneratedGlideModules(context);

生成的GeneratedAppGlideModule对象为其实现类GeneratedAppGlideModuleImpl,这个类为编译后自动生成的(注意,如果配置混淆,此类也不应该被混淆),可以看看这个类的内容:

final class GeneratedAppGlideModuleImpl extends GeneratedAppGlideModule {
  private final CustomGlideModule appGlideModule;

  public GeneratedAppGlideModuleImpl(Context context) {
    appGlideModule = new CustomGlideModule();
    if (Log.isLoggable("Glide", Log.DEBUG)) {
      Log.d("Glide", "Discovered AppGlideModule from annotation: com.zjb.CustomGlideModule");
    }
  }

  @Override
  public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
    appGlideModule.applyOptions(context, builder);
  }

  @Override
  public void registerComponents(@NonNull Context context, @NonNull Glide glide,
      @NonNull Registry registry) {
    appGlideModule.registerComponents(context, glide, registry);
  }

  @Override
  public boolean isManifestParsingEnabled() {
    return appGlideModule.isManifestParsingEnabled();
  }

  @Override
  @NonNull
  public Set<Class<?>> getExcludedModuleClasses() {
    return Collections.emptySet();
  }

  @Override
  @NonNull
  GeneratedRequestManagerFactory getRequestManagerFactory() {
    return new GeneratedRequestManagerFactory();
  }
}

可以看到它持有一个我们定义的CustomAppModule对象,实现的接口方法也是通过调用CustomAppModule对象的方法实现。
3)之后我们继续看Glide的初始化过程会调用方法initializeGlide(…),其代码如下:

 .......................
 if (annotationGeneratedModule != null) {
      annotationGeneratedModule.applyOptions(applicationContext, builder);
    }
.........................
if (annotationGeneratedModule != null) {
      annotationGeneratedModule.registerComponents(applicationContext, glide, glide.registry);
    }    

也就是上面提到的实现类GeneratedAppGlideModuleImpl中方法的调用,GeneratedAppGlideModuleImpl中的方法是调用他持有的CustomAppGlideModule对象的方法。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐