RecyclerView 配置混淆

release打包后发现RecyclerView不显示数据, 推测是反射没有加混淆问题, 具体置如下

# When layoutManager xml attribute is used, RecyclerView inflates

#LayoutManagers' constructors using reflection.

-keep public class * extends androidx.recyclerview.widget.RecyclerView$LayoutManager {

public (android.content.Context, android.util.AttributeSet, int, int);

public ();

}

-keepclassmembers class androidx.recyclerview.widget.RecyclerView {

public void suppressLayout(boolean);

public boolean isLayoutSuppressed();

}

复制代码

源码查证

RecyclerView反射创建LayoutManager的过程 :

//androidx.recyclerview.widget.RecyclerView

/**

* Instantiate and set a LayoutManager, if specified in the attributes.

*/

private void createLayoutManager(Context context, String className, AttributeSet attrs,

int defStyleAttr, int defStyleRes){

if (className != null) {

className = className.trim();

if (!className.isEmpty()) {

className = getFullClassName(context, className);

try {

ClassLoader classLoader;

if (isInEditMode()) {

// Stupid layoutlib cannot handle simple class loaders.

classLoader = this.getClass().getClassLoader();

} else {

classLoader = context.getClassLoader();

}

Class extends LayoutManager> layoutManagerClass =

Class.forName(className, false, classLoader)

.asSubclass(LayoutManager.class);

Constructor extends LayoutManager> constructor;

Object[] constructorArgs = null;

try {

constructor = layoutManagerClass

.getConstructor(LAYOUT_MANAGER_CONSTRUCTOR_SIGNATURE);

constructorArgs = new Object[]{context, attrs, defStyleAttr, defStyleRes};

} catch (NoSuchMethodException e) {

try {

constructor = layoutManagerClass.getConstructor();

} catch (NoSuchMethodException e1) {

e1.initCause(e);

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Error creating LayoutManager " + className, e1);

}

}

constructor.setAccessible(true);

setLayoutManager(constructor.newInstance(constructorArgs));

} catch (ClassNotFoundException e) {

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Unable to find LayoutManager " + className, e);

} catch (InvocationTargetException e) {

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Could not instantiate the LayoutManager: " + className, e);

} catch (InstantiationException e) {

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Could not instantiate the LayoutManager: " + className, e);

} catch (IllegalAccessException e) {

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Cannot access non-public constructor " + className, e);

} catch (ClassCastException e) {

throw new IllegalStateException(attrs.getPositionDescription()

+ ": Class is not a LayoutManager " + className, e);

}

}

}

}

复制代码

Gson混淆配置

##---------------Begin: proguard configuration for Gson ----------

# Gson uses generic type information stored in a class file when working with fields. Proguard

# removes such information by default, so configure it to keep all of it.

-keepattributes Signature

# For using GSON @Expose annotation

-keepattributes *Annotation*

# Gson specific classes

-dontwarn sun.misc.**

#-keep class com.google.gson.stream.** { *; }

# Application classes that will be serialized/deserialized over Gson

-keep class com.google.gson.examples.android.model.** { ; }

-keep class com.xxx.client.bean.Cctv{ ; }

-keep class com.xxx.client.bean.CctvItem{ ; }

# Prevent proguard from stripping interface information from TypeAdapter, TypeAdapterFactory,

# JsonSerializer, JsonDeserializer instances (so they can be used in @JsonAdapter)

-keep class * extends com.google.gson.TypeAdapter

-keep class * implements com.google.gson.TypeAdapterFactory

-keep class * implements com.google.gson.JsonSerializer

-keep class * implements com.google.gson.JsonDeserializer

# Prevent R8 from leaving Data object members always null

-keepclassmembers,allowobfuscation class * {

@com.google.gson.annotations.SerializedName ;

}

##---------------End: proguard configuration for Gson ----------

复制代码

其中以下这两句用来防止Gson解析的实体被混淆 Gson().fromJson(jsonCCTV, Cctv::class.java) :

-keep class com.xxx.client.bean.Cctv{ ; }

-keep class com.xxx.client.bean.CctvItem{ ; }

复制代码

android 代码混淆 gson,Android RecyclerView和Gson混淆问题相关推荐

  1. android 代码签名apk,[Android]混淆代码后生成带签名的apk

    Android从2.3的SDK开始,将ProGuard混淆代码的功能加入了进来. 我们可以从android sdk的tools目录下看到有一个proguard目录.说明具有了代码混淆的功能. 至于如何 ...

  2. android代码说明文档,android:label说明

    文章目录 1. 说明 android:label 用于app 在切换activity的时候,自动更换左上角的显示 2. 代码架构 3. String.xml 字符串资源文件My Application ...

  3. android 代码加view,Android中将View添加至窗口的源码分析

    本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口 ...

  4. android代码关闭数据库,android – 我应该如何正确打开和关闭我的数据库

    我有一个应用程序,它将一些数据存储在SQLite数据库中.此外,我在我的应用程序中进行了大量查询和重新查询.我在其中有大约15个活动.并且所有人都使用数据库来查询数据. 但我正在做的是在每个活动中打开 ...

  5. android代码查找图像,Android平台上利用opencv进行图像的边沿检测

    原标题:Android平台上利用opencv进行图像的边沿检测 近开始接触opencv for Android,从网上down了图像的边沿检测的代码. 测试图片: 在Android2.3.1模拟器上跑 ...

  6. android 代码 卸载app,Android在一个app中安装并卸载另一个app的示例代码

    Android在一个app中安装并卸载另一个app 1.在app→src→main下新建文件夹asserts,将准备安装的apk文件放在asserts内 2.在app→src→main→res下新建文 ...

  7. android 代码设置圆角,Android中用Shape实现圆角和局部圆角

    本文讲解如何实现布局边框的部分圆角 大家可能都知道圆角实现其实很简单, 在drawable文件夹下新建xml文件加入以下代码 情景1: 四个角均为圆角 android:shape="rect ...

  8. android 代码打开权限,android开发权限询问的示例代码

    现在基于信息安全问题,特别是版本是23以上权限越严格. 特别是拍照,读,写权限 一般权限允许过,下次就不用询问了的,所以很多应用都喜欢在首页或者启动页直接询问,不允许的就用不了1.下面给出封装好的类, ...

  9. android 代码发adb,Android预安装软件adb命令编译源码

    Android预安装软件&adb命令&编译源码 发布时间:2020-06-02 17:28:41 来源:51CTO 阅读:895 作者:年少的风 1.预安装软件: 将eclipse下的 ...

  10. 达内android 代码,深圳达内Android网页源码查看器.pdf

    深圳达内 Android 网页源码查看器 ? 1 <?xml version="1.0" encoding="utf-8"?> 2 < Lin ...

最新文章

  1. python基础(迭代器,生成器,装饰器)
  2. 机器学习和计算机视觉的20大图像数据集
  3. Sharepoint ListTemplateId
  4. Mac版本的idea非正常关闭后,idea打开项目大面积报红
  5. java toregex_Java Regex to check Min/Max Length of Input Text
  6. android uri获取参数,android-无法从深度链接获取Uri数据
  7. 决策树python建模中的坑 :ValueError: Expected 2D array, got 1D array instead:
  8. 45道CSS基础面试题
  9. 带有下标的赋值维度不匹配_不稳定的期权时间价值
  10. C++编程--函数与委托(2)
  11. 硬件基础知识----(2)电阻1
  12. QL Server 2008新特性:FILESTREAM
  13. 看不到日志_迷之 crontab 异常:不运行、不报错、无日志?
  14. 只能用光盘启动怎么办?
  15. 数理统计基础 正态总体抽样分布
  16. pyhon编码问题之由 u'\uxxx' 转 \uxxx
  17. python电脑版怎么下载-Python
  18. 应用程序无法正常启动0xc00007b的解决(二)
  19. 在win10自带的mail中如何设置学校邮箱
  20. App陷阱防不胜防:欺骗误导用户下载App、欺骗误导用户提供个人信息

热门文章

  1. BiB: 电子科大邹权组构建基于肠道菌群平衡的疾病预测模型及微生物生物标志物发掘平台...
  2. MPB:林科院袁志林组-​内生镰刀菌基因组染色体级别组装和注释
  3. FEMS综述: 如何从微生物网络中的“毛线球”理出头绪(3万字长文带你系统学习网络)...
  4. Nature综述: 地球上细菌和古菌的生物膜丰度
  5. linux安装emc的多路径软件,linux (centos)安装EMCPower多路径软件
  6. Python使用matplotlib函数subplot可视化多个不同颜色的折线图、为多个子图添加总标题(main title)、自定义设置主标题字体类型、字体大小、字体颜色等
  7. R语言广义线性模型函数GLM、glm函数构建泊松回归模型(Poisson regression)、输出提供偏差(deviances)、回归参数和标准误差、以及系数的显著性p值
  8. R语言lm函数拟合多项式回归模型、删除数据中的异常样本outlier、之后诊断模型( diagnostics)、使用plot函数打印回归模型的QQ图、残差拟合图、标度-位置图、残差与杠杆关系图
  9. R语言使用Rtsne包进行TSNE分析:提取TSNE分析结果合并到原dataframe中、可视化tsne降维的结果、并圈定降维后不匹配的数据簇(tSNE identifying mismatch)
  10. R语言dataframe计算满足筛选条件的行的个数(筛选满足条件的数据行并计数):类似于excel的countif函数