话不多少,上错误堆栈:

Process: com.mci.smagazine, PID: 25065java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mci.smagazine/com.zhangyue.iReader.idea.ActivityImageIdea}: android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class xat android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3003)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3064)at android.app.ActivityThread.-wrap14(ActivityThread.java)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1659)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:154)at android.app.ActivityThread.main(ActivityThread.java:6823)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)Caused by: android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class xCaused by: android.view.InflateException: Binary XML file line #1: Error inflating class xCaused by: java.lang.ClassNotFoundException: android.view.x in loader com.zhangyue.iReader.plugin.d[DexPathList[[zip file "/data/app/com.mci.smagazine-1/base.apk"],nativeLibraryDirectories=[/system/lib, /vendor/lib]]]at com.zhangyue.iReader.plugin.d.loadClass(SourceFile:90)at java.lang.ClassLoader.loadClass(ClassLoader.java:312)at android.view.LayoutInflater.createView(LayoutInflater.java:616)at android.view.LayoutInflater.onCreateView(LayoutInflater.java:707)at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:68)at android.view.LayoutInflater.onCreateView(LayoutInflater.java:724)at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:792)at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)at android.view.LayoutInflater.inflate(LayoutInflater.java:496)at android.view.LayoutInflater.inflate(LayoutInflater.java:398)at com.samsung.android.sdk.pen.util.SpenUtilLayout.getLayout(SourceFile:43)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.totalLayout(SourceFile:1633)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.initView(SourceFile:1983)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.construct(SourceFile:1617)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.<init>(SourceFile:1572)at com.zhangyue.iReader.idea.ActivityImageIdea.initPenSettingView(SourceFile:276)at com.zhangyue.iReader.idea.ActivityImageIdea.initSpen(SourceFile:270)at com.zhangyue.iReader.idea.ActivityImageIdea.initWidget(SourceFile:140)at com.zhangyue.iReader.idea.ActivityImageIdea.onCreate(SourceFile:113)at android.app.Activity.performCreate(Activity.java:6977)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1126)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2946)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3064)at android.app.ActivityThread.-wrap14(ActivityThread.java)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1659)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:154)at android.app.ActivityThread.main(ActivityThread.java:6823)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)

问题现象:

debug 的包,没有问题,release 的包有问题。关键在于下面:

            zipAlignEnabled trueshrinkResources true

release 的包会混淆代码,删除无用资源。

分析问题:

1.最开始的时候,我只看到了上面的堆栈,没有看到下面真正的错误堆栈。正真的有用堆栈在整个log 的最下面,如下:

Caused by: android.view.InflateException: Binary XML file line #1: Binary XML file line #1: Error inflating class xCaused by: android.view.InflateException: Binary XML file line #1: Error inflating class xCaused by: java.lang.ClassNotFoundException: android.view.x in loader com.zhangyue.iReader.plugin.d[DexPathList[[zip file "/data/app/com.mci.smagazine-1/base.apk"],nativeLibraryDirectories=[/system/lib, /vendor/lib]]]at com.zhangyue.iReader.plugin.d.loadClass(SourceFile:90)at java.lang.ClassLoader.loadClass(ClassLoader.java:312)at android.view.LayoutInflater.createView(LayoutInflater.java:616)at android.view.LayoutInflater.onCreateView(LayoutInflater.java:707)at com.android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:68)at android.view.LayoutInflater.onCreateView(LayoutInflater.java:724)at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:792)at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)at android.view.LayoutInflater.inflate(LayoutInflater.java:496)at android.view.LayoutInflater.inflate(LayoutInflater.java:398)at com.samsung.android.sdk.pen.util.SpenUtilLayout.getLayout(SourceFile:43)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.totalLayout(SourceFile:1633)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.initView(SourceFile:1983)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.construct(SourceFile:1617)at com.samsung.android.sdk.pen.settingui.SpenSettingPenLayout.<init>(SourceFile:1572)at com.zhangyue.iReader.idea.ActivityImageIdea.initPenSettingView(SourceFile:276)at com.zhangyue.iReader.idea.ActivityImageIdea.initSpen(SourceFile:270)at com.zhangyue.iReader.idea.ActivityImageIdea.initWidget(SourceFile:140)at com.zhangyue.iReader.idea.ActivityImageIdea.onCreate(SourceFile:113)at android.app.Activity.performCreate(Activity.java:6977)

Error inflating class x? 这是那个类?难道被混淆了?
我们自己重写定义了classLoader,每次findclass,我都知道,那么我就看下,debug 包加载的是哪个类,release 加载的是哪个类?那么我就知道这个类x 是什么类了,然后我把这个类keep,不混淆就行了。

不混淆的log:

2019-03-18 19:31:40.199 27007-27007/com.mci.smagazine D/IreaderClassLoader2: com.zhangyue.iReader.plugin.config.PluginConfig
2019-03-18 19:31:40.264 27007-27007/com.mci.smagazine D/IreaderClassLoader2: com.zhangyue.iReader.idea.ActivityImageIdea
2019-03-18 19:31:40.277 27007-27007/com.mci.smagazine D/IreaderClassLoader2: android.widget.RelativeLayout
2019-03-18 19:31:40.373 27007-27007/com.mci.smagazine D/IreaderClassLoader2: android.widget.ImageButton
2019-03-18 19:31:40.464 27007-27007/com.mci.smagazine D/IreaderClassLoader2: android.widget.Button
2019-03-18 19:31:40.500 27007-27007/com.mci.smagazine D/IreaderClassLoader2: android.widget.SeekBar
2019-03-18 19:31:40.536 27007-27007/com.mci.smagazine D/IreaderClassLoader2: android.widget.Switch

混淆的log:

2019-03-18 19:29:09.273 26520-26520/com.mci.smagazine D/IreaderClassLoader2: com.zhangyue.iReader.plugin.config.PluginConfig
2019-03-18 19:29:09.344 26520-26520/com.mci.smagazine D/IreaderClassLoader2: com.zhangyue.iReader.idea.ActivityImageIdea
2019-03-18 19:29:09.357 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.widget.RelativeLayout
2019-03-18 19:29:09.454 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.widget.ImageButton
2019-03-18 19:29:09.543 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.widget.x
2019-03-18 19:29:09.545 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.webkit.x
2019-03-18 19:29:09.546 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.app.x
2019-03-18 19:29:09.547 26520-26520/com.mci.smagazine D/IreaderClassLoader2: android.view.x

怎么加载的是 android.widget.Button? 这个类怎么可能找不到?好吧,尝试一下keep 一下:

-keep class android.widget.*

运行之后,不行,还是报错崩溃。
殊不知,上面走了一条错误的路。不过没关系。

好了,上绝招:

资源混淆?那么我看下最终的apk 里面的这个资源,到底是什么样的!


妈的,这个xml竟然真的只是一个x、难道是被资源优化,处理掉了?
我又找了一个在apk 里面,只有一个 的xml,查下引用,妈的,果然没有地方引用。如下图:

知道了,那些被优化的资源,被删掉的资源,不是真的被删除掉了,而是被弄成一个47b 的(空文件)!

我又不可能直接把shrinkResources 直接弄成false,这样可能包会增大。查下官网,果然有方法,可以保持资源不被shrinkResources 掉。

解决方法:在你的工程的res/raw/ 下面新建一个keep.xml

 <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/setting_*"tools:shrinkMode="safe"/>

tools:keep="@layout/setting_*" keep 里面写上你需要保持的资源文件。

以下为波折的过程记录:

因为我的资源文件是在layout-xxxhdpi 下面的,layout 文件夹下没有这个文件, 那么我就用下面的keep 文件去尝试,结果不行:

 <?xml version="1.0" encoding="utf-8"?><?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"tools:keep="@layout-*/setting_color_palette_layout_v41,@layout-xxxhdpi/setting_color_palette_layout_v41,@layout-xxxhdpi/setting_pen_layout_v40,@layout*/setting_color_palette_layout_v41,@layout*/setting_pen_layout_v40,@layout-xxhdpi-v4/setting_color_palette_layout_v41,@layout-xxhdpi-v4/setting_pen_layout_v40"tools:shrinkMode="safe"/>

我以为因为是layout-xxxhdpi 文件夹里面的文件,需要 @layout-xxxhdpi/setting_color_palette_layout_v41 这样写,其实是错的。
后来反复尝试,看到项目里面有一个keep 文件,虽然是aar 里面的,但是他写的很简单,@layout/a.xml
我懂了,应该是shrinkResources 的时候,只需要写@layout/a.xml ,

不需要管你想要保持的资源文件是在layout-xxh,还是在layout-xxxh 里面,只需要写layout 就可以了。

我改了下写法,可以了。如下:原来需要这样写

 <?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"tools:keep="@layout/setting_*"tools:shrinkMode="safe"/>

知识点:

怎么知道自己的资源被干掉了呢?
看build\outputs\mapping\Samsung\debug\resources.txt 文件,里面记录了资源文件处理情况:如下,setting_color_picker_layout_v41 被视为无用的资源,并且被优化了。

Skipped unused resource res/layout/setting_color_picker_layout_v41.xml: -1 bytes (replaced with small dummy file of size 104 bytes)

总结:

1.最好不要把layout 的加载写在字符串里面。如下面这种,如非必要,不推荐。

这样shrinkResources 的时候,可能给你优化掉了。

    this.mTotalLayout = (RelativeLayout)this.mLayoutUtil.getLayout("setting_pen_layout_v40");public View getLayout(String layoutName) {if (this.mSdkResources == null) {return null;} else {Log.d("SpenUtilLayout", "getLayout : layoutName = " + layoutName);int resID = this.mSdkResources.getIdentifier(layoutName, "layout", Spen.getSpenPackageName());Log.d("SpenUtilLayout", "getLayout : " + layoutName + " : resID = " + resID);return this.mInflater.inflate(this.mSdkResources.getLayout(resID), (ViewGroup)null);}

2.分析问题,要看准log。看看有没有和你的有关的。

3.有时候,问题并不出现在源码里面,而是出现在编译成apk 之后,所以遇到奇葩问题,一定要看最终的apk 里面是什么样子的。

参考:android 官网
https://developer.android.com/studio/build/shrink-code

android Binary XML file line #1: Binary XML file line #1: Error inflating class x 问题详解相关推荐

  1. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  2. android 清理缓存动画,Android仿微信清理内存图表动画(解决surfaceView屏幕闪烁问题)demo实例详解...

    最近接了一个项目其中有功能要实现一个清理内存,要求和微信的效果一样.于是想到用surfaceView而不是继承view.下面小编给大家解析下实现思路. surfaceView是为了解决频繁绘制动画产生 ...

  3. Java I/O流(File、字节流、字符流、过滤流、对象流)详解

    File以及I/O流 一.File类的使用 java.io.File类 代表硬盘上的一个文件或者目录 java.io.File类作用: 每个File类的对象表示一个磁盘文件或目录,其对象属性中包含了文 ...

  4. webservice接口怎么将xml作为参数传递呢_Rhapsody集成引擎通讯点(接口)出入参详解web服务篇...

    Rhapsody引擎可便捷的集成不同的医疗信息系统,可提供安全的连接.可靠的消息传输和高性能的数据处理等功能.Rhapsody引擎是整个集成平台的核心部分,是可快捷提供服务的关键所在.它可实现数据的内 ...

  5. Android Studio下Terminal窗口Window下cmd黑窗口中使用adb命令调试精炼详解

    一.前期基础知识储备 (1)adb命令行的定义与作用 adb的全称为Android Debug Bridge,中文名"调试桥",顾名思义adb命令是调试手机中应用的一种方法,而且作 ...

  6. x98air2+android+升级,【转】台电x98 3G 平板刷机、升级、ROOT详解及教程

    很多x98 3G用户平板的用户询问如何刷机?如何ROOT的问题?下面就本人的经验谈谈如何做.一.刷机 刷机如果并非必要,请尽量不要刷.特别是没有相关知识的用户更是需要当心.如果其中某一步出错,可能你的 ...

  7. android wifi 共享网络,安卓手机怎么共享XP的网络 无线wifi共享教程【详解】

    安卓手机怎么共享XP的网络? Wi-Fi是一个无线网络通信技术的品牌,由Wi-Fi联盟(Wi-Fi Alliance)所持有.目的是改善基于IEEE802.11标准的无线网络产品之间的互通性.无线网络 ...

  8. android中prop配置参数名,【01-19 技术】安卓系统优化Build.prop 系统参数属性详解...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 11.debug.performance.tuning,本参数定义了系统是否针对性能做较调.可填写的值为0或1. ro.HOME_APP_ADJ ro.F ...

  9. android 8三星note8,三星note8和s8哪个好 三星note8和s8对比【详解】

    目前外界对Galaxy Note 8的预期是最高的,Note 8是一款非常有吸引力的手机.三星note8和s8哪个好呢?小编来跟大家解说一下三星note8和s8有什么区别. Note 8与Galaxy ...

最新文章

  1. 【推荐】MySQL Cluster报错及解决方法(不断更新中)
  2. 迁移 Nexus 软件仓库拾遗
  3. python Pil byteio转换
  4. js 获取最近几天的时间字符串
  5. python中文件的读取与写入以及os模块
  6. 如何查找两个列表之间的差异?
  7. 搜出来的文本:从MCMC到模拟退火
  8. 王者荣耀s12赛季服务器维护,王者荣耀S12赛季延期,这篇攻略让我段位狂涨!
  9. html根据菜单角色配置菜单代码,CSS设置列表样式和创建导航菜单实现代码
  10. 如何计算tomcat线程池大小?
  11. 为什么要Word转PDF,看完你就懂了
  12. linux更换浏览器,ubuntu 默认浏览器换Chrome 是正确的选择
  13. cd命令远程连接linux服务器,Linux常用命令(5)--SSH访问远程服务器、SCP服务器间文件拷贝...
  14. golang 实现苹果内购服务端验证
  15. 前端通过Ajax请求从后台返回数据到页面显示,实现分页功能
  16. [足式机器人]Part3机构运动微分几何学分析与综合Ch02-3 平面机构离散运动鞍点综合——【读书笔记】
  17. python员工管理系统课程设计报告_python--员工信息管理系统编译及思路
  18. 2019年电赛D题《简易电路特性测试仪》全过程
  19. python画龙猫_Python:制作动态字符图
  20. WPF和Silverlight到底有什麼不同?

热门文章

  1. c语言单链表需要头结点,一个关于C语言链表头结点的问题
  2. java中是什么意思_java中是什么意思?
  3. 2.安装Ubuntu系统时,系统时间显示不对
  4. IntelliJ IDEA Community 社区版配置 Web 开发环境(Gradle + Tomcat)
  5. 三星自动驾驶汽车路测获批,进军无人驾驶领域
  6. 阿里云云市场全新升级 瞄准需求拓生态
  7. SQLServer执行命令出现“目录无效的提示”
  8. mysql function使用
  9. 创建一个Table View
  10. 进程和程序:编写shell——《Unix/Linux编程实践教程》读书笔记(第8章)