eclipse编译android的apk发生VFY错误

本文介绍了在Android开发中遇到的VFY错误,并提供了详细的解决步骤。包括检查JNI和jar包的编译、验证方法是否遗漏及如何正确配置Eclipse。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.编译jni和jar包,生成的my.jar放到项目的libs下,成功编译apk

2.运行时出现错误:
  ...
  01-01 23:03:34.803 W/dalvikvm(24777): VFY: unable to resolve static method 6025: Lcom/...Manager;.startService ()V

  ...


3.反编译这个apk (unzip, dex2jar, jar),发现这个方法未被编进去


4.对比引用的my.jar,说明这个包是没有问题的,只是eclipse编译时这个方法未被编进去 


5.Properties -> Libraries -> Add JARs


6.Properties -> BuildPath -> Order and Export -> Select All


0.Enjoy


参考:
eclipse引用第三方jar包,编译后发现第三方jar有个方法未被编译进classes.dex [ http://www.oschina.net/question/587911_88748]

android一个纠结的VFY错误 [http://www.cnblogs.com/poe-blog/p/3261386.html]



<think>嗯,用户现在遇到的问题是,在修改PackageParser.java文件时找不到verifySignatures方法。首先,我需要理解用户的背景。用户可能是在做Android系统开发或者定制ROM,需要修改PackageParser.java,但发现缺少verifySignatures方法。接下来,我需要分析可能的原因和解决方案。根据提供的引用内容,引用[1]提到了PackageParser.parseMonolithicPackage方法,引用[2]说明PackageParser用于解析APKAndroidManifest.xml。引用[3]展示了validateName方法,属于较早版本的Android(1.6),而引用[4]则是ReactNative的代码,可能无关。这里的关键是verifySignatures方法可能在不同Android版本中存在差异。用户的问题主要集中在verifySignatures方法的缺失。这可能是因为:1.**版本差异**:Android版本不同,PackageParser的结构也不同。比如,早期版本可能没有这个方法,或者方法名有变更。例如,引用[3]的Android1.6代码中没有verifySignatures,而更高版本如Android9之后可能有重构。2.**代码位置变化**:在较新的Android版本中,签名验证的逻辑可能被移到其他类中,比如PackageManagerService或SigningDetails类。比如引用[1]中的parseBaseApk可能涉及签名处理,但具体方法可能不在PackageParser中。3.**用户使用的代码版本**:用户可能参考了错误版本的源码,或者正在修改的代码库基于旧版本Android。接下来需要给用户建议如何处理:-确认Android版本:用户应检查当前使用的Android版本号,并找到对应版本的AOSP源码进行参考。-查找替代方法:在较新版本中,签名验证可能由collectCertificates方法或PackageManagerService中的方法处理。-排查依赖库:如果用户进行ROM定制,可能需要检查是否缺少必要的签名库。-交叉参考官方文档:避免直接修改,应先查阅该Android版本的开发者文档。用户可能尝试在旧版本中添加新功能,但遇到了方法缺失的问题,需要引导用户到正确版本查找相应方法。同时,用户可能误以为verifySignatures应在PackageParser中,而实际上已被重构到其他类。因此,需要建议用户在新版本源码中搜索verifySignatures的位置,并确认是否需要调用其他相关类的方法。</think> 您在 PackageParser.java 中找不到 `verifySignatures` 方法的问题通常与 **Android 版本变更**和**职责分离重构**有关。以下是系统性的解决方案: ### 🔍 问题分析与解决方案 1. **确认 Android 版本(最核心因素)** - 在 **Android 9 (Pie) 及更高版本**中,签名验证逻辑被重构: - `verifySignatures()` 的职责转移到了 `PackageManagerService.java` - 新增 `SigningDetails.java` 类专⻔处理签名验证 ```java // Android 10+ 中的典型调用路径 // PackageManagerService.java private void verifySignatures(PackageSetting pkgSetting, PackageParser.Package pkg) { SigningDetails existing = pkgSetting.signatures; SigningDetails scanned = pkg.mSigningDetails; if (!existing.checkCapability(scanned, CERT_INPUT_SHA256) { throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE); } } ``` 2. **早期版本的替代方案** - **Android 7.0-8.1**:签名验证通常在 `collectCertificates()` 方法中完成 ```java // PackageParser.java (Android 7.0) private static void collectCertificates(Package pkg, File apkFile, int flags) { // 实际签名校验发生在此处 if (!verifyJarSignature(apkFile)) { throw new PackageParserException(INSTALL_PARSE_FAILED_NO_CERTIFICATES); } } ``` 3. **需要新增方法的场景** ```mermaid graph TD A[需求场景] --> B{ROM定制开发} A --> C{新增安全特性} B --> D[需继承SigningDetails类] C --> E[实现自定义verify方法] D --> F[覆写checkCapability] E --> F ``` ### 🛠️ 实施建议 1. **版本适配方案** - ✅ **Android 9+**:在 `PackageManagerService` 中修改以下方法: - `scanPackageNewLI()` - `verifySignatures()` - ✅ **Android 8.x**:修改 `PackageParser.collectCertificates()` - ✅ **Android 4.4-7.0**:查找 `verifySignatures()` 可能在 `PackageManagerService.installPackageLI()` 路径中 2. **关键检查点(适用于所有版本)** ```java // 签名验证的触发点通常包含: if (pkg.applicationInfo.targetSdkVersion > Build.VERSION_CODES.Q) { enforceSignatureSchemeV2(); // 不同Android版本的强制要求 } ``` 3. **依赖库检查** ```gradle // 若您进行系统级编译,确保包含: dependencies { compileOnly 'com.android.tools.build:apksig:4.2.0' // 签名库 } ``` ### 🔗 验证方案 1. **测试用例示例** ```bash adb install --bypass-low-target-sdk-block MyApp.apk # 绕过最低SDK限制 adb logcat | grep -E 'PackageManager|Signature' ``` 2. **日志关键词监控**: - `VFY` (Verification) - `CERT` - `Signature|Scheme` ### ⚠️ 重要提示 1. **系统签名要求**: ```xml <!-- AndroidManifest.xml 需声明 --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="android.uid.system"> ``` 2. **签名密钥保护**: ```bash # 使用硬件密钥库更安全 keytool -genkey -keystore myrelease.keystore -storetype PKCS12 ``` 📚 **推荐参考资料**: - [AOSP PackageManagerService 源码](https://cs.android.com/android/platform/superproject/+/master:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java) (最新版) - [签名验证演进史](https://source.android.com/security/apksigning) (官方文档)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值