日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

65535 java_Databinding引起的 java方法大于 65535 的问题

發布時間:2023/12/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 65535 java_Databinding引起的 java方法大于 65535 的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

# Databinding引起的 java方法大于 65535 的問題

## 前言

項目中開發使用的是 MVVM 開發模式,并且選擇了 Databinding 作為 ViewModel 和 View之間通信的橋梁,再加上一定的封裝,使用起來是挺方便的,但是也會遇到一些坑,比如我遇到的這個:

**Databinding 生成的 Java 文件中方法大于 65535 問題。**

如下圖所示:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305150649.png)

## 緣由

這個問題是怎么來的呢?

其實觸發條件挺小的,只有在特定的情況下才會遇到,要滿足下面的條件:

1. 使用 Databinding

2. 項目要是中大型的項目(使用 Databinding 的xml文件多)

3. gradle 插件的版本要小于 3.2.0

## 模擬發生

新建項目,然后新建一個 Module:lib2,項目結構如圖所示

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305151101.png)

然后分別在 app 和 lib2 的 build.gradle 中啟用 Databinding

```shell

dataBinding{

enabled = true

}

```

設置 gradle 插件版本為 3.1.4. gradle 版本為:4.4

```shell

classpath 'com.android.tools.build:gradle:3.1.4'

distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip

```

然后創建一個 layout 文件:tag_activity_lib_main.xml

```xml

xmlns:tools="http://schemas.android.com/tools"

tools:ignore="MissingDefaultResource">

android:id="@+id/ll"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

android:id="@+id/tv"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="test" />

```

然后利用腳本把這個 xml 文件拷貝2000份,并分別改名字:

腳本:

```shell

#!/bin/bash

for b in {1..2000}

do

cp tag_activity_lib_main.xml ./tag_activity_lib_main$b.xml

done

```

然后把生成的2000份 xml 文件拷貝到項目的 layout 目錄下(app 和 lib2 目錄各1000各)。

這個時候應該就會見到這個錯誤了:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305150649.png)

我們看下這個報錯的 DatabinderMapperImpl :

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305151909.png)

> ps:你的可能和我的不一樣,xml 文件個數可能不同。

可以看到總共就那幾個方法,卻有2萬多行代碼,其中第一個 getDataBinder 方法很長,大概有15368 行,根據錯誤提示,可以初步斷定就是就是這里的方法太大了,超過了 65535 的限制。

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305163944.png)

可以看到這個 getDataBinder 的作用就是根據傳進來的view 的 tag 和 layoutId來返回 和 layoutId 對應的 ViewDataBinding 對象。

即:在 gradle 3.1.4 版本中,會把所有 module 的帶有 ...標簽的 xml 文件都對應生成一個 ViewDataBinding對象,然后在 DataBinderMapperImpl 中的 getDataBinder 中提供對應的映射關系。

并且會把這個 DataBinderMapperImpl 類放在 app-build-generated-source-apt-android.databinding目錄下面。

可以看到:這個 DataBinderMapperImpl 類是在 apt 文件夾下面,也就是這個類是在編譯器生成的,這就涉及到了 Android 中的APT 技術,當然這里的編譯時生成代碼的過程是 google 已經寫好的,代碼地址在:

[databinding倉庫](https://android.googlesource.com/platform/frameworks/data-binding/+/refs/tags/gradle_3.1.2/compiler/src/main/java/android/databinding/annotationprocessor/ProcessDataBinding.java) ,里面是具體的 APT 實現,有興趣的可以去看看,其實是 google 在 Databinding 庫中留下的坑,屬于版本問題,好在后面的版本解決了這個問題。

## 解決

其實在 gradle 3.1.4 的下個版本 3.2.0中,google 已經解決這個問題。所以我們只用把 gradle 的版本升級到 3.2.0 以上就能避免這個問題的發生。

當然還有一個辦法就是,后面你不再使用 Databinding 來開發,來避免這個問題,但是對于習慣使用 Databinding 的團隊來說,這是很難受的,所以還是盡早升級下版本吧。

下面把 gradle 插件版本升級 3.2.0,并且同時要把 gradle 版本升級到 4.6.

執行編譯:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305165129.png)

可見這里已經執行成功了。我們再來看下剛才 app - build 下面出錯的 DataBinderMapperImpl 文件:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305165258.png)

看下 com.example.databindinganalysis 下面的 DataBinderMapperImpl:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305165411.png)

可以看到,在新版本的 DataBinderMapperImpl 的 getDataBinder 方法中,google 已經把獲取 ViewDataBinding 的操作進行了拆分,使用 internalGetViewDataBindingXX 對所有的 layout 文件進行分組,每個組建立了 50 個映射關系,比如 internalGetViewDataBinding0 的代碼如下:

![](https://markdown-1258186581.cos.ap-shanghai.myqcloud.com/20200305165557.png)

裝對 getDataBinder 的拆分很好的避免了上面遇到問題的發生。

此外,在gradle 3.1.4 版本中,app module 和 lib2 module 的 DataBinderMapperImpl 文件都是在 app module 下面的 build 文件夾下面生成的,但是在 gradle 3.2.0 版本中,會對每個 module 都生成一個 DataBinderMapperImpl 文件,這樣產生 上面代碼過長的問題的概率又小了許多,事實上,一個正常的項目不會再發生上面的編譯錯誤了。

最后再貼一下 Databinding 倉庫的地址:

https://android.googlesource.com/platform/frameworks/data-binding/

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的65535 java_Databinding引起的 java方法大于 65535 的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 午夜精品欧美 | 91久久国语露脸精品国产高跟 | 一级黄色片在线免费观看 | 中国老太婆性视频 | 国产精品探花一区二区在线观看 | 香蕉视频一区 | 女人高潮被爽到呻吟在线观看 | 尤物在线视频 | 国产成人久久婷婷精品流白浆 | 精品久久无码视频 | 久久午夜无码鲁丝片午夜精品 | 亚洲成人免费网站 | 翔田千里在线播放 | 少妇2做爰hd韩国电影 | 国产一及片 | 国产亚洲电影 | 亚洲国产毛片aaaaa无费看 | 日韩黄色一区 | 男人操女人网站 | 性色av一区二区三区 | 麻豆changesxxx国产 | 视频在线| 椎名空在线播放 | 激情五月婷婷丁香 | 亚洲免费网| 香蕉视频首页 | 一区二区激情视频 | 成人涩涩 | 国产精品丝袜一区 | 国产又粗又猛又爽又黄的网站 | 欧美在线视频一区 | jizzjizz视频 | av在线精品 | 超碰97av在线 | 28一20岁女人一级 | missav | 免费高清av在线看 | 国产黄色一级片 | 中文字幕人妻精品一区 | 波多野结衣有码 | 亚洲巨乳在线 | 黄频在线看 | 少妇一级1淫片 | 欧美福利一区二区三区 | 国产色在线观看 | 国产视频九色蝌蚪 | 在线看污片 | 97福利视频| 男同互操gay射视频在线看 | 五月天综合激情 | 高清av一区二区三区 | 狠狠干青青草 | 日韩3p| 精品无人区无码乱码毛片国产 | 天堂中文在线免费观看 | 日韩专区在线 | 国产亚洲精品久久久久久777 | 黄网站免费在线观看 | 6080毛片| 国模无码国产精品视频 | 国产精品乱 | 日韩av无码中文字幕 | 777久久久精品一区二区三区 | 国产乱淫a∨片免费观看 | 国产1区二区 | 色婷五月| 成人久久久久久 | 日韩中文字幕视频在线 | 理论片高清免费理伦片 | 久久天堂精品 | 国产老妇视频 | 亚洲国产三级 | a级黄色小说 | 婷婷在线免费观看 | 日本欧美另类 | 影音先锋中文字幕人妻 | 久久精品—区二区三区舞蹈 | 亚洲图片视频在线 | 亚洲国产精品久久久久爰色欲 | 国产人成| 欧美午夜精品理论片 | 91社区视频| 69中国xxxxxxxxx69| 久久精品黄 | 肉丝袜脚交视频一区二区 | 久久精品欧美一区二区三区不卡 | 中午字幕在线观看 | 亚洲中文字幕一区二区在线观看 | 欧美一级二级在线观看 | 亚洲操操操 | 91av视频在线免费观看 | 九色porny自拍视频在线播放 | 美女张开腿流出白浆 | 中文字幕91爱爱 | 男男成人高潮片免费网站 | av网站天堂| 在线观看日韩一区二区 | 怡红院成永久免费人全部视频 | 老妇free性videosxx| 中文字幕免费视频观看 |