前几天项目中对接了相芯美颜sdk, 需要自定义美颜,滤镜和sticke。开发完后提交给测试同学,debug环境没问题,release环境点击就崩溃,作为一名老司机,首先想到就是混淆的问题,去Firebase上看crash日志。
通过日志看,是ViewBinding.getRoot()空指针了,首先想到的是这次代码作为美颜工具类放在了utils包下,我可以把整个Faceunity的文件夹添加到混淆中,同时把相芯美颜sdk添加到混淆中,于是添加了一下混淆。
-keep class com.faceunity.** { *; }
-keep class com.xxxx.android.ui.utils.faceunity.** { *; }
想着这样总可以了吧,但是当满怀期待运行起来后,点击还是会crash,crash log还是上面那个,这个时候感觉很懵逼,于是就去检查代码,崩溃的地方是我自定义了一个BindingViewHolder继承自RecyclerView的ViewHold,代码如下:
public class BindingViewHolder<T extends ViewBinding> extends RecyclerView.ViewHolder {
public final T binding;
public BindingViewHolder(@NonNull T binding) {
super(binding.getRoot());
this.binding = binding;
}
public T inflate(@NonNull LayoutInflater inflater) {
try {
Class<T> c = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
if (c != null)
return (T) c.getDeclaredMethod("inflate", LayoutInflater.class).invoke(null, inflater);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
看到代码中使用了反射,这个时候就感觉应该是反射的问题,使用反射的意图本来是想走捷径,但是这个捷径反而更远了。既然定位到是ViewBinding反射的问题,那就给ViewBinding加混淆,最后chatgpt给了一个不错的混淆:
-keepclassmembers class * implements androidx.viewbinding.ViewBinding { *; }