新手区 移动测试技术问答 Q&A

MQC · 2017年08月08日 · 833 次阅读

1. INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES

由于 APP 签名冲突造成。如果设备上已经安装了其他签名的相同包名 APP,再安装其他签名的就会报出此类错误。

解决方法:a. 更换签名文件,重新签名 b. 更改应用的包名,避免冲突。

2. INSTALL_FAILED_DEXOPT

方法数超标所导致。dx 打包时限制了单个 dx 文件的最大方法数为 65535。同时 Dalvik VM 限制内存中加载的方法数(方法,类定义及构造函数)不能超过 65535 个。

解决方法:a. 检查代码,删出无用 jar 包和代码,尤其是自动生成的 get/set,没用的类。b. 将部分 java 代码封装到 JNI 中。

3. INSTALL_PARSE_FAILED_NO_CERTIFICATES

应用中没有签名信息。

解决方法:使用 Eclipse 或者 Android Studio 对项目重新编译打包。

4. INSTALL_FAILED_MEDIA_UNAVAILABLE

Android 应用安装位置不可用。应用安装位置有两个:ROM、sdcard。如果严格指定安装到 sdcard,但是设备没有 sdcard 时,就会报此类错误。

解决方法:AndroidManifest.xml 中配置:

5. INSTALL_FAILED_OLDER_SDK

设备系统版本比应用的最低支持的系统版本低。

解决方法:AndoidManifest.xml 中将系统版本降低。

6. INSTALL_FAILED_VERSION_DOWNGRADE

设备中已经安装了此 APP 的更高版本,无法降级安装。

解决方法:先卸载之前的版本,再安装此版本。

7. INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION

安装 APP 时,Android 系统会对 APP 先进行解析。解析过程出错,就会报出此类错误,可能得原因很多。

解决方法:检查 AndroidManifest.xml 各项配置是否符合规范。比如 sdkVersion 不能用 string 等等。

8. INSTALL_FAILED_UID_CHANGED

应用在上次卸载时,由于应用中的 native 程序未被杀死而占用/data/data/{packageName}目录,导致/data/data/目录下的 APP 相关内容未被删除,多数情况下能在 logcat 中找到报错:Installer: rm -rf failed, directory is not empty。再次安装时无法覆盖,导致报出此类问题。

解决方法:如果设备 Root 了,则直接删除/data/data/目录下的应用包名文件夹;如果没有 root,需要将手机恢复出厂设置。此外,开发者要额外注意容易出现此类问题的手机,对此类设备的用户给出提示。用户无需操心,阿里移动测试平台会帮助解决。

9. INSTALL_FAILED_NO_MATCHING_ABIS

当安装的 APP 包含 native libraries(一般是 so 文件)的时候,如果没有对应机器 CPU 架构的库文件,就会出现这种问题。比如,你编译了一个 armv7 平台的 APP,但是想要装在 intel 架构的设备上,就会出现这个错误。

解决方法:在编译 APP 时,先用 NDK 编译出相应的 CPU 架构的库文件。

10. INSTALL_FAILED_CANCELLED_BY_USER

部分机型在使用 adb 命令安装应用时,设备会弹窗询问用户是否允许安装,假如一段时间内(一般是 30s),没有点击确认弹窗,那么此类设备会阻止安装,并提示用户:INSTALL_FAILED_CANCELLED_BY_USER

解决方法:联系 MQC 工作人员,旺旺群:335334143;QQ 群:492028798

11. INSTALL_FAILED_VERICATION_TIMEOUT

原因及解决方法同:INSTALLED_FAILED_CANCELLED_BY_USER

12. OutOfMemory 问题(OOM)解决方法

每个 Android 应用都有一个最大内存上限。超过这个上限,就会导致内存不足(OutOfMemory)。检查内存上限的方法:
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);  
Log.d("TAG", "Max memory is " + maxMemory + "KB");  

通常情况下,出现 OOM,是由于应用中加载了大量的图片导致。鉴于此,有以下几种方式来减小应用对内存的使用:

a. 合理压缩展示图片,比如一个 100x100 的控件里,如果加载一个 1024x768 的图片,不会让图片的展示效果更好,反而会增加 OOM 的风险。所以,合理的对图片进行压缩非常重要。

b. 压缩完图片,但是应用里包含了太多的图,这种情况依然可能出现 OOM。这种情况下,考虑使用内存缓存技术。根据每一屏要展示的图片数量,以及每个图片的大小,设定一个合理的缓存值,一般情况下不要超过 1/8 的最大内存值。如果图片不在显示区域,可以考虑将其进行回收,系统的垃圾回收器(GC)会认为这些内存不在被使用,从而对图片进行 GC 操作。这样会大大降低 OOM 的风险。

c. 更多的 OOM 讨论,参见:http://blog.csdn.net/vshuang/article/details/39647167

13. iOS 应用(ipa)安装失败可能的原因和解决方法

每个 ipa 包本质上是一个 zip 包,里面包含 ios 应用的资源和可执行文件。

a. 如果提示 “应用重签名失败”,很可能的原因是 ipa 是直接从 itunes 市场下载的正式发布包,这样的包经过苹果的加密,无法安装到任何没有购买过这个应用的用户手机上面。

b. 如果部分的手机安装失败,请检查一下你的应用支持的最低 ios SDK 的版本(可以很直观的从包里面的 Info.plist 看到)。比如最低支持 ios8.3,则 ios8.2 版本的手机就装不上这个应用。

14. 启动失败如何进行 Debug?

很多同学遇到启动失败的问题,很难进行 debug,不知道该如何入手。启动失败其实也可以找到错误栈信息,并且通过这个错误栈信息,定位到具体的问题原因。如下图:

ed57342015f8838445b184e4968c998e

这里,我们可以看到启动失败的进程 pid:26981。然后,我们需要下载日志,这里的日志就是详细的 logcat 日志。

下载之后,我们需要通过这个 PID 找到真正引起 crash 的错误栈。这里建议,使用支持正则匹配的编辑器打开 logcat 日志(比如 nodepad++、vim 等等),打开之后,使用正则规则:“26981.* E .*” 进行匹配查找。可以找到如下信息:

7c0b99279866541efc5c3a97a1d20914

这样我们就能知道具体那行代码导致的错误了。

15. 常见崩溃问题,NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference**

该问题一般是由于资源加载时,引用初始化未完全的 Context 对象导致。

解决方法:通过增加非空检查;创建 View 时,使用当前组件的 Context(比如 ActivityXXX.this),而不用 getApplicationContext() 等方式。

74d764a48948b5fac5823f46ced2a95b_1_

参考资料:http://stackoverflow.com/questions/28248232/what-am-i-doing-wrong-with-my-handling-of-contex-java-android
参考资料:http://stackoverflow.com/questions/25488208/java-nullpointerexception-getting-resources**

阿里云测移动质量中心(以下简称 MQC)是为广大企业客户和移动开发者提供真机测试服务的云平台,拥有大量热门机型,提供 7x24 全天候服务。

我们致力于提供专业、稳定、全面、高价值的自动化测试能力,以及简单易用的使用流程、贴心的技术服务,并且帮助客户以最低的成本、最高的效率发现 APP 中的各类隐患(APP 崩溃、各类兼容性问题、功能性问题、性能问题等),减少用户流失,提高 APP 质量和市场竞争力。

联系我们:
 网站地址:https://mqc.aliyun.com
 开发者交流旺旺群:335334143
 开发者交流 QQ 群:492028798
 客服邮箱:mqc_group@service.alibaba.com;
更多精彩技术分享 欢迎关注 MQC 公众号
17

暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册