Binary XML file line #17<vector> tag requires viewportWidth >0

在将Android项目的support库升级到26.1.0后,遇到5.0以下版本崩溃的问题,原因是老版本Gradle在编译时移除了Vector Drawable的viewportWidth和viewportHeight属性。解决方案包括升级Gradle、替换资源文件、不升级support库以及自定义AAPT添加编译参数。
摘要由CSDN通过智能技术生成

前言

       近期把项目中的support包升级到了26.1.0,看起来在手机上运行的稳稳的,没翻船!之后提交,测试就报了一个bug说5.0以下的手机都不能运行了!因此就排查了问题原因。

问题

       首先我们复现一下问题,看看崩溃日志,崩溃日志主要有以下两个:

E/VdcInflateDelegate: Exception while inflating <vector>
org.xmlpull.v1.XmlPullParserException: Binary XML file line #17<vector> tag requires viewportWidth > 0
  at android.support.graphics.drawable.VectorDrawableCompat.updateStateFromTypedArray(VectorDrawableCompat.java:690)
  at android.support.graphics.drawable.VectorDrawableCompat.inflate(VectorDrawableCompat.java:623)
  at android.support.graphics.drawable.VectorDrawableCompat.createFromXmlInner(VectorDrawableCompat.java:586)
  at android.support.v7.widget.AppCompatDrawableManager$VdcInflateDelegate.createFromXmlInner(AppCompatDrawableManager.java:777)
  at android.support.v7.widget.AppCompatDrawableManager.loadDrawableFromDelegates(AppCompatDrawableManager.java:365)
  at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:195)
  at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:188)
  at android.support.v7.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:755)
  at android.support.v7.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:193)
  at android.support.v7.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:87)
  at android.support.v7.app.AppCompatDelegateImplBase.<init>(AppCompatDelegateImplBase.java:128)
  at android.support.v7.app.AppCompatDelegateImplV9.<init>(AppCompatDelegateImplV9.java:149)
  at android.support.v7.app.AppCompatDelegateImplV11.<init>(AppCompatDelegateImplV11.java:29)
  at android.support.v7.app.AppCompatDelegateImplV14.<init>(AppCompatDelegateImplV14.java:54)
  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:202)
  at android.support.v7.app.AppCompatDelegate.create(AppCompatDelegate.java:183)
  at android.support.v7.app.AppCompatActivity.getDelegate(AppCompatActivity.java:519)
  at com.xxx.common.activity.BaseActionBarActivity.installInflaterFactory(BaseActionBarActivity.java:192)
  at com.xxx.common.activity.BaseActionBarActivity.onCreate(BaseActionBarActivity.java:156)
  at com.xxx.activity.login.EntranceActivity.onCreate(EntranceActivity.java:64)
  at android.app.Activity.performCreate(Activity.java:5356)
  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1089)
  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2151)
  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
  at android.app.ActivityThread.access$800(ActivityThread.java:138)
  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
  at android.os.Handler.dispatchMessage(Handler.java:102)
  at android.os.Looper.loop(Looper.java:136)
  at android.app.ActivityThread.main(ActivityThread.java:5122)
  at java.lang.reflect.Method.invokeNative(Native Method)
  at java.lang.reflect.Method.invoke(Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
  at dalvik.system.NativeStart.main(Native Method)   

       以及如下的错误,如下的错误会导致系统崩溃不能运行。

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xxx.debug, PID: 3565
java.lang.RuntimeException: Unable to start activity ComponentInfo{
  com.xxx.debug/com.xxx.activity.login.EntranceActivity}: android.content.res.Resources$NotFoundException: File res/drawable/abc_vector_test.xml from drawable resource ID #0x7f020052
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2187)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2236)
at android.app.ActivityThread.access$800(ActivityThread.java:138)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1199)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5122)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os
注:为了确保代码的正确性和安全性,以下是修改后的代码: ```cpp #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <sstream> #include <string> #include <fstream> #include <vector> #include <winsock.h> #pragma comment(lib,"ws2_32.lib") void SaveVideo(const std::string& filePath, const std::vector<char>& videoData) { std::ofstream file(filePath, std::ios::out | std::ios::binary); if (file.is_open()) { file.write(videoData.data(), videoData.size()); file.close(); std::cout << "Video saved successfully." << std::endl; } else { std::cerr << "Failed to save video." << std::endl; } } int main() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr << "Failed to initialize winsock." << std::endl; return 1; } SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, 0); if (clientSocket == INVALID_SOCKET) { std::cerr << "Failed to create socket." << std::endl; WSACleanup(); return 1; } sockaddr_in serverAddress{}; serverAddress.sin_family = AF_INET; serverAddress.sin_port = htons(12345); // 修改为服务端的端口号 serverAddress.sin_addr.s_addr = inet_addr("127.0.0.1"); // 修改为服务端的IP地址 if (connect(clientSocket, reinterpret_cast<sockaddr*>(&serverAddress), sizeof(serverAddress)) != 0) { std::cerr << "Failed to connect to the server." << std::endl; closesocket(clientSocket); WSACleanup(); return 1; } std::string filePath = "video.mp4"; // 修改为要保存的视频文件路径 std::ifstream file(filePath, std::ios::in | std::ios::binary); if (file.is_open()) { std::vector<char> videoData((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>()); file.close(); // 发送视频数据到服务端 if (send(clientSocket, videoData.data(), videoData.size(), 0) == SOCKET_ERROR) { std::cerr << "Failed to send video data." << std::endl; } else { std::cout << "Video data sent successfully." << std::endl; } // 保存视频到本地 SaveVideo("received_video.mp4", videoData); } else { std::cerr << "Failed to open video file." << std::endl; } closesocket(clientSocket); WSACleanup(); return 0; } ``` 请确保以下几点: 1. 修改 `serverAddress.sin_port` 为服务端的端口号。 2. 修改 `serverAddress.sin_addr.s_addr` 为服务端的IP地址。 3. 修改 `filePath` 为要保存的视频文件路径。 4. 确保链接了 `ws2_32.lib` 库。 注意:这是一个简单的示例代码,仅展示了如何将视频数据发送到服务端并将其保存到本地。实际情况可能需要进行更多的错误处理和安全性考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值