App全局灰度化实践-GlobalGray(1)

public class ObservableArrayList extends ArrayList {

private List mListeners = new ArrayList<>();

public void addOnListChangedListener(OnListChangeListener listener) {

if (mListeners != null) {

mListeners.add(listener);

}

}

public void removeOnListChangedListener(OnListChangeListener listener) {

if (mListeners != null) {

mListeners.remove(listener);

}

}

@Override

public boolean add(T object) {

super.add(object);

notifyAdd(size() - 1, 1);

return true;

}

@Override

public void add(int index, T object) {

super.add(index, object);

notifyAdd(index, 1);

}

@Override

public boolean addAll(Collection<? extends T> collection) {

int oldSize = size();

boolean added = super.addAll(collection);

if (added) {

notifyAdd(oldSize, size() - oldSize);

}

return added;

}

@Override

public void clear() {

int oldSize = size();

super.clear();

if (oldSize != 0) {

notifyRemove(0, oldSize);

}

}

@Override

public T remove(int index) {

T val = super.remove(index);

notifyRemove(index, 1);

return val;

}

@Override

public boolean remove(Object object) {

int index = indexOf(object);

if (index >= 0) {

remove(index);

return true;

} else {

return false;

}

}

@Override

public T set(int index, T object) {

T val = super.set(index, object);

if (mListeners != null) {

for (OnListChangeListener listener : mListeners) {

listener.onChange(this, index, 1);

}

}

return val;

}

@Override

protected void removeRange(int fromIndex, int toIndex) {

super.removeRange(fromIndex, toIndex);

notifyRemove(fromIndex, toIndex - fromIndex);

}

private void notifyAdd(int start, int count) {

if (mListeners != null) {

for (OnListChangeListener listener : mListeners) {

listener.onAdd(this, start, count);

}

}

}

private void notifyRemove(int start, int count) {

if (mListeners != null) {

for (OnListChangeListener listener : mListeners) {

listener.onRemove(this, start, count);

}

}

}

public interface OnListChangeListener {

void onChange(ArrayList list, int index, int count);

void onAdd(ArrayList list, int start, int count);

void onRemove(ArrayList list, int start, int count);

}

}

接下来就是执行hook操作:

/**

  • @param enable 是否开启全局灰色调

*/

public static void enable(boolean enable) {

if (!enable) {

return;

}

try {

//灰色调Paint

final Paint mPaint = new Paint();

ColorMatrix mColorMatrix = new ColorMatrix();

mColorMatrix.setSaturation(0);

mPaint.setColorFilter(new ColorMatrixColorFilter(mColorMatrix));

//反射获取windowManagerGlobal

@SuppressLint(“PrivateApi”)

Class<?> windowManagerGlobal = Class.forName(“android.view.WindowManagerGlobal”);

@SuppressLint(“DiscouragedPrivateApi”)

java.lang.reflect.Method getInstanceMethod = windowManagerGlobal.getDeclaredMethod(“getInstance”);

getInstanceMethod.setAccessible(true);

Object windowManagerGlobalInstance = getInstanceMethod.invoke(windowManagerGlobal);

//反射获取mViews

Field mViewsField = windowManagerGlobal.getDeclaredField(“mViews”);

mViewsField.setAccessible(true);

Object mViewsObject = mViewsField.get(windowManagerGlobalInstance);

//创建具有数据感知能力的ObservableArrayList

ObservableArrayList observerArrayList = new ObservableArrayList<>();

observerArrayList.addOnListChangedListener(new ObservableArrayList.OnListChangeListener() {

@Override

public void onChange(ArrayList list, int index, int count) {

}

@Override

public void onAdd(ArrayList list, int start, int count) {

View view = (View) list.get(start);

if (view != null) {

view.setLayerType(View.LAYER_TYPE_HARDWARE, mPaint);

}

}

@Override

public void onRemove(ArrayList list, int start, int count) {

}

});

//将原有的数据添加到新创建的list

observerArrayList.addAll((ArrayList) mViewsObject);

//替换掉原有的mViews

mViewsField.set(windowManagerGlobalInstance, observerArrayList);

} catch (Exception e) {

e.printStackTrace();

}

}

最后,只需在Application的onCreate中调用上述代码进行hook即可。

已知存在的问题


  1. 开启了View的硬件加速,可能会存在兼容性问题

  2. 对于SurfaceView和Textureview以及其子类无效

对于问题1笔者在项目中暂未遇到问题,如果读者朋友们在项目中遇到兼容性问题,欢迎留言;

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

资料.png
资料图.jpg
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
未遇到问题,如果读者朋友们在项目中遇到兼容性问题,欢迎留言;

总结

作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!

[外链图片转存中…(img-cFISaala-1714654654503)]
[外链图片转存中…(img-JVqE4AnV-1714654654506)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值