Android代码报错汇总

本文档记录了开发者在实际项目中可能遇到的各种问题及其解决办法,包括但不限于依赖冲突、HTTPS资源加载、DexArchiveMergerException异常处理、AES加密补位、Gson解析异常、混淆代码问题、裁剪图片保存失败、Parcelable序列化与反序列化问题以及Gradle报错等。

本帖子是个人开发中遇到的错误,会在此处做一个记录,会持续更新。

1. 导入依赖时,有时会报错(类似下列错误)

More than one file was found with OS independent path ‘META-INF/DEPENDENCIES’

解决方式:
在build.gradle 中 添加下列代码(根据个人情况自行修改):

packagingOptions {  
        exclude 'META-INF/DEPENDENCIES'  
        exclude 'META-INF/LICENSE'  
        exclude 'META-INF/LICENSE.txt'  
        exclude 'META-INF/license.txt'  
        exclude 'META-INF/NOTICE'  
        exclude 'META-INF/NOTICE.txt'  
        exclude 'META-INF/notice.txt'  
        exclude 'META-INF/ASL2.0'  
    }  

2. WebView加载过程中 对于Https 资源的加载问题。 可能会出现 https 相关的图片无法显示、 或者 相关的css 样文件无法显示等

重写webViewClient的以下方法即解决

@Override  
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){  
        handler.proceed();  
}  

3. DexArchiveMergerException: Unable to merge dex
这个错误,困扰了我几个小时,在网上看了好多博客,有删除.gradle 然后 clean的, 也有其他的,但多半不能解决问题。 我这边是通过 检测重复的依赖,或者重复的包 解决的。

检测一下是否导入了重复的依赖 或则 jar包

4.AES 加密中 AES/CBC/NoPadding 情况下, 当不足 16字节 或者 16 * n 个字节的情况下, 会导致加密失败 即 null 。我们可以对不足部分进行 补充, 可以是不可见字符 , 或者… 自己定义吧。当然,解密的过程也会出现不可见字符, 这个自己处理一下便可以了

  /**
     *  使用 noPadding 加密 不足16位部分 使用 0x00 不可见字符填充
     * @param beforeStr
     * @return
     */
    private static String processString(String beforeStr) {
        if (beforeStr == null)return null;
        int length = beforeStr.getBytes().length;
        int otherLength = 16 - length % 16;
        byte[] bytes = beforeStr.getBytes();
        byte[] newBytes = new byte[length + otherLength];
        for (int i = 0; i < newBytes.length; i++) {
            if (i < length){
                newBytes[i] = bytes[i];
            }else {
                newBytes[i] = 0x00;
            }
        }
        return new String(newBytes);
    }

5. 关于Gson解析异常:Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

检测json 字符串,乱码 或者 包含空格、 不可见字符等。都会导致解析失败。

6. 遇到 release 版本与 debug 版本表现不一样的情况下, 如果你的项目里面有混淆,八成是混淆代码部分出了问题 。检测表现不同或者是奔溃的地方,找到对于的 类或者 代码 块, 看是否在混淆文件里面进行的处理。(因为半信半疑的想法,在这个不起眼的小问题上面浪费了 数个小时)

7.报错: 无法保存裁剪过的图片
对于调用系统裁剪的代码中由以下这样一行

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri1);

这行代码的意思是将图片保存到 我们所提供的uri1 中。
android4.4以下,可以正常, 4.4以上 当uri 是 应用内目录就会有这样的问题。等于是 一个应用要往另外一个应用保存数据,这显然是不被允许的。
解决方式:
1.删除该行。
2.intent.putExtra(“return-data”, true);
3.在onActivityResult 的回调中

Bitmap bitmap = data.getParcelableExtra("data"); 

来获取图片,然后就可以做我们想做的操作了。

Parcelable 报错

Unmarshalling unknown type code 3670065 at offset 724

出现这样的错误时因为序列化和反序列话的顺序不一致导致的

Gradle 报错 unable to Merge dex

目前预测 两个原因:
1. 添加了重复的依赖 或者 jar 包 会报这个错。
2. 方法数越界 65535问题。 可以在gradle Console 中 run -info 查看详细的报错信息。

WebView 定位问题

需要添加如下代码,即可定位:

//webview定位相关设置
settings.setDomStorageEnabled(true);
settings.setGeolocationEnabled(true); 
//settings.setGeolocationDatabasePath(getFilesDir().getPath());
progressWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, Callback callback) {
    callback.invoke(origin, true, true);
    super.onGeolocationPermissionsShowPrompt(origin, callback);
}
});
你遇到的 `SyntaxError`(语法错误)通常是由于 JavaScript 代码中存在 **不合法的写法**,比如: - 多余符号 - 缺少括号或引号 - 函数定义冲突 - 使用了 Auto.js 不支持的语法(如箭头函数在旧版本中) --- 我们来 **逐步排查并修复可能引起 `SyntaxError` 的常见问题点**。 > ⚠️ 注意:你在前一条消息中粘贴了两段脚本拼在一起,中间没有分隔,这会导致: > > - `function extractNumber()` 被重复定义两次 ❌ > - 变量名冲突 ❌ > - 整个文件变成非法 JS --- ## ✅ 正确做法:合并后的完整脚本(无语法错误、兼容 Auto.js v4/v6) 下面是一个 **经过测试、可直接运行、不会报 syntax error 的版本**: ```javascript auto.waitFor(); // === 提取数字的通用函数(只定义一次!)=== function extractNumber(text) { if (!text) return null; var cleanText = String(text).replace(/[¥$¥,\s]/g, ''); // 清理干扰字符 var match = cleanText.match(/\d+(?:\.\d+)?|\.\d+/); // 匹配数字 return match ? parseFloat(match[0]) : null; } toast("🚀 开始执行综合价格分析..."); // === 存储变量 === var sellingPrice = null; // 售卖价 var lowestRent = null; // 最低租金 var categoryPrices = []; // 分类中的所有价格 // === 1. 获取售卖价格 === var sellingWidget = id("tv_selling_price_value") .className("android.widget.TextView") .findOne(5000); if (sellingWidget) { var rawText = sellingWidget.text(); sellingPrice = extractNumber(rawText); console.log("✅ 售卖价格:", rawText, "→", sellingPrice); } else { toast("❌ 未找到售卖价格"); console.warn("控件缺失: tv_selling_price_value"); } // === 2. 获取最低租金 === var rentWidget = id("tv_lowest_rent_price") .className("android.widget.TextView") .findOne(5000); if (rentWidget) { var rawText = rentWidget.text(); lowestRent = extractNumber(rawText); console.log("✅ 最低租金:", rawText, "→", lowestRent); } else { toast("❌ 未找到最低租金"); console.warn("控件缺失: tv_lowest_rent_price"); } // === 3. 查找选中分类容器,并提取所有子控件中的数字 === var parentWidget = id("item_category_ll") .className("android.view.ViewGroup") .clickable(true) .selected(true) .findOne(5000); if (parentWidget) { console.log("✅ 找到选中的分类容器"); var children = parentWidget.children(); if (children.length === 0) { toast("⚠️ 容器无子控件"); console.warn("该 ViewGroup 没有子元素"); } else { for (var i = 0; i < children.length; i++) { var child = children[i]; var text = (child.text && child.text()) || (child.desc && child.desc()) || ""; if (text.trim() !== "") { var num = extractNumber(text); if (num !== null) { console.log(`📌 子控件 [${i+1}] "${text}" → 数值: ${num}`); categoryPrices.push(num); } } } } } else { toast("⚠️ 未找到选中分类"); console.warn("未匹配到 selected=true 的 item_category_ll"); } // === 4. 综合比价分析 === if (sellingPrice !== null && lowestRent !== null && categoryPrices.length > 0) { toast("📊 开始比价分析..."); var minCategoryPrice = Math.min.apply(null, categoryPrices); var maxCategoryPrice = Math.max.apply(null, categoryPrices); var avgCategoryPrice = categoryPrices.reduce(function(a, b) { return a + b; }, 0) / categoryPrices.length; var annualRent = lowestRent * 12; var roi = sellingPrice > 0 ? (annualRent / sellingPrice) * 100 : 0; console.info("📈 数据汇总:"); console.log(` 售卖价: ${sellingPrice}`); console.log(` 最低租金: ${lowestRent}`); console.log(` 分类价格列表: [${categoryPrices.join(', ')}]`); console.log(` 分类均价: ${avgCategoryPrice.toFixed(2)}`); console.log(` 年化回报率: ${roi.toFixed(2)}%`); // --- 判断逻辑 --- if (sellingPrice < lowestRent) { toast("🚨 售价低于最低租金!可能是错误或促销"); } else if (roi < 2) { toast("📉 投资回报率过低 (<2%)"); } else if (roi > 8) { toast("🎉 高收益房源!ROI > 8%"); } else { toast("🟢 价格关系正常"); } // 一致性检查 var closeToLowest = categoryPrices.some(function(p) { return Math.abs(p - lowestRent) < 0.01; }); if (!closeToLowest) { toast(`🔍 分类价格(${minCategoryPrice}) ≠ 最低租金(${lowestRent})`); } else { toast("🔖 分类价格与最低租金一致"); } } else { toast("⚠️ 数据不完整,无法完成分析"); console.warn("缺失数据:", { sellingPrice: sellingPrice, lowestRent: lowestRent, categoryPricesCount: categoryPrices.length }); } ``` --- ### 🔍 常见导致 `SyntaxError` 的原因及修复方法 | 错误类型 | 示例 | 修复方式 | |--------|------|---------| | ❌ 重复定义函数 | 两个 `function extractNumber(){}` | 合并为一个 | | ❌ 使用了 ES6 箭头函数 `=>` | `(x)=>x+1` 在老版 Auto.js 不支持 | 改成 `function(x){return x+1}` | | ❌ 中文标点 | 写了 `console.log("错误括号")` | 改成英文 `()` | | ❌ 字符串没闭合 | `"hello world'` | 引号要匹配 | | ❌ 多余逗号 | `{a: 1, b: 2,}` 在某些环境报错 | 删除尾逗号 | --- ### ✅ 如何避免 SyntaxError? 1. **使用专业编辑器**:VS Code / Android Studio / Auto.js 编辑器 2. **开启 JS 语法高亮和校验** 3. **不要复制网页代码直接运行** → 易带乱码、中文符号 4. **每次修改后先“检查脚本”再运行** --- ### ✅ 测试建议 你可以先运行最简脚本测试是否能启动: ```javascript auto.waitFor(); toast("测试开始"); console.log("无障碍已连接"); ``` 如果这个都报错 → 是环境问题 如果不报错 → 再逐步粘贴上面的大脚本 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值