?https://juejin.cn/post/6844903972587716621--深入探索Android稳定性优化 ? ? ?https://mp.weixin.qq.com/s/g-WzYF3wWAljok1XjPoo7w? ?-//-Android 平台 Native 代码的崩溃捕获机制及实现 ? ?CountDownTimer.onFinish on a null() ? ?四、捕捉native crash-native crash-native ?native crash-native()-》 ?3) /proc/self/maps:检查各个模块加载在内存的地址范围 ? ? ?/proc/self/maps:检查各个模块加载在内存的地址范围() ? ? ?5.0以上:安卓系统中没有了libcorkscrew.so,使用自己编译的libunwind ? ?美团外卖Android Crash治理之路---- ?https://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651748107&idx=1&sn=55dff1b286e92cfb6aaee776df8ec89e&chksm=bd12ae468a652750a7624c30eca56f6f83347b16cdfb9153b647c6e5229a822b16724a1bbd9d&scene=38#wechat_redirect ? ? ? ?notifyDataSetChanged() notifyDataSetChanged() ? ? ?常用的如JDK里的ArrayList和Android里的SparseArray、ArrayMap ? ?ArrayList ?SparseArray ?自己维护通知, 同时也极大的避免了 ? ?The content of the adapter has changed but ListView did not receive a notification ? ?ArrayList?? ??? ??? ?通过Hook来解决,Hook分为Java Hook和Native Hook ? ?通过Hook来解决,Hook分为Java Hook和Native Hook。?? ??? ?Native Hook ? ? ?。我们在定位这个Crash的可疑点无果后决定通过Hook的方式解决 ? ?AsyncTask$SerialExecutor() ? ? ?public static void setFinalStatic(Field field, Object newValue) throws Exception { ? ? ? ? field.setAccessible(true); ? ? ? ? Field artField = Field.class.getDeclaredField("artField"); ? ? ? ? artField.setAccessible(true); ? ? ? ? Object artFieldValue = artField.get(field); ? ? ? ? Field accessFlagsFiled = artFieldValue.getClass().getDeclaredField("accessFlags"); ? ? ? ? accessFlagsFiled.setAccessible(true); ? ? ? ? accessFlagsFiled.setInt(artFieldValue, field.getModifiers() & ~Modifier.FINAL); ? ? ? ? field.set(null, newValue); ? ? } ?? ? ?? ?Java反射之如何判断类或变量、方法的修饰符(Modifier解析)--https://blog.csdn.net/xiao__gui/article/details/8141216 ?? ? ? ?int ? getModifiers()
? ? ? ? ? 返回此类或接口以整数编码的 Java语言修饰符。
? ?getModifiers? ? ?需要用到java.lang.reflect.Modifier这个类 ? ? ? ? ? ? System.out.println(Modifier.toString(field.getModifiers()));
?Java基础篇:反射机制详解---https://blog.csdn.net/a745233700/article/details/82893076 ? ? ?Class.forName("com.mysql.jdbc.Driver"); // 动态加载mysql驱动 ? ? ? ?Stude ? ?mysql ? ?通过class类的静态方法:forName(String className)(最常用)?? ??? ??? ? ? ?forName ? ?public Constructor getConstructor(Class... parameterTypes) ? ??? ?Constructor con = clazz.getConstructor(null); ? ? ? ?? ??? ?Class stuClass = Class.forName("fanshe.method.Student");
?、反射main方法: ? ?数组在Java里是比较特殊的一种类型,它可以赋值给一个Object Reference。 ? ? ? import java.lang.reflect.Method; ? ? ?10、反射方法的其他使用--通过反射越过泛型检查: ? ? ? ? Field field = Integer.class.getDeclaredField("value"); ?? ??? ? ?? ??? ? ?? ??? ? ? ? ?55 ? ?java.lang.reflect.Filed.class中setInt与set的区别 ? ?set ? ? ?设置字段的值: ?* ?? ??? ?Field --> public void set(Object obj,Object value): ?* ?? ??? ??? ??? ??? ?参数说明: ?* ?? ??? ??? ??? ??? ?1.obj:要设置的字段所在的对象; ?* ?? ??? ??? ??? ??? ?2.value:要为字段设置的值;
?要求用包装类型(wrapped type),不能传基本类型参数(primitive type)。 ? ?Java Field.get()取得对象的Field属性值--http://www.51gjie.com/java/795.html ? ?java.lang.reflect.Filed.class中setInt与set的区别---https://www.cnblogs.com/buguge/p/13914947.html ? ? ? ? ?//拿到了Field类的实例后就可以调用其中的方法了 ? ? //方法:get(Object obj) 返回指定对象obj上此 Field 表示的字段的值 ? ? System.out.println("属性值: ?" + field.get(obj));
? ? //方法: set(Object obj, Object value) ?将指定对象变量上此 Field 对象表示的字段设置为指定的新值 ? ? ?set ? ? get Object obj ? ?? ? ? ? ? 67 field=A.class.getDeclaredField("fild"); ?? ? ? ? ? Field field=A.class.getDeclaredField("fild"); ? ? ?artFieldValue.getClass().getDeclaredField("accessFlags"); ? ?accessFlags = true; ? ? ? ? ?Object artFieldValue = artField.get(field); ? ? ? ? Field accessFlagsFiled = artFieldValue.getClass().getDeclaredField("accessFlags"); ? ? ? ? accessFlagsFiled.setAccessible(true); ?? ??? ? ?? ??? ?accessFlagsFiled.setInt(artFieldValue,getModifiers() &) ?? ??? ? ? ? ? ? ? ?field.set(null, newValue); ?? ??? ? field.set(null,newValue);78 ? ?我们发现原生系统上对应系统版本的AbsListView里并没有UpdateBottomFlagTask ? ?setFinalStatic ? ?s.AsyncTask$3.done ? ? ?.AbsListView$UpdateBottomFlagTask.doInBackground ?.AbsListView$UpdateBottomFlagTask(doInBackground) ? ? ? at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) ?? ? Android ROM编译时会将framework、app、bin等目录打入system.img中 ? ?,文件格式一般为yaffs2或ext ?yaffs2 ext ? ?yaffs2 ext ? ?LeakCanary ? ?另外我们可以在debug下使用StrictMode来检查Activity的泄露、 ? ?Closeable对象没有被关闭等问题。 ? ?另外我们可以在debug下使用StrictMode来检查Activity的泄露、Closeable对象没有被关闭等问题。 ?debug StrictMode( ?) ? ?closeable ? ?另外我们可以在debug下使用StrictMode来检查Activity的泄露、Closeable对象没有被关闭等问题。 ? ? ?StrictMode Activity Closeable对象没有被关闭等问题。 ? ? ?矢。Android Studio也提供了非常好用的Memory Profiler,堆转储和分配跟踪器功能可以帮我们迅速定位问题。 ?
|