Android 项目中,特别是当项目文件和规模达到一定的程度后,会引发一些平常不常见的问题。 下面对遇到的一些问题做一个汇总和总结。

scenario 1:

  在项目中,我们采用了chromimum内核 和 android4.4 的java层代码来实现自定义my_webview。

  过程中编译生成android4.4的java的class.jar文件,并将其导入my_webview的libs中作为第三方库导入。

  排除错误连接模拟器运行,报如下错误  

  1. Unable to execute dex: method ID not in [0, 0xffff]: 65536;

    Conversion to Dalvik format failed: Unable to execute dex: method ID not in [0, 0xffff]: 65536

     原因: Answer

   The Dalvik VM can have a maximum of 65536 methods per dex file, due to a memory allocation issue.

   While it is possible to fix this using multiple dex files, Facebook found another fix that they could deploy within their app to get around the    problem.

   由于在使用的过程中,我们把class.jar等第三方的jar放在了libs目录下,同时在user library目录下又存在第二份,重复包含很多接口,所以导致接口溢出。

   如果项目扩展中,实际使用的接口超过了限制,可以采用如下方式尝试解决!

     参见:http://androiddev.orkitra.com/?p=32706

          http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

          http://developer.android.com/tools/help/proguard.html

   2. unable to execute dex:GC overhead limit exceeded

       采用android4.4 编译的class.jar 包作为第三方库,把jar包通过Add Jar放到Build Path中, 在生成APK过程中,Eclipse长时间停留在100%那个进度。

      最后Eclipse报告unable to execute dex:GC overhead limit exceeded错误

      原因:运行中占用的堆内存超过了jvm设置的限制。

   -startup
   plugins/org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
   --launcher.library
   plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
   -showsplash
   org.eclipse.platform
   --launcher.XXMaxPermSize
   256m
   -vmargs
   -Xms40m
   -Xmx256m

解决办法:修改 eclipse.ini 添加内存限制  -Xms512m;  -Xmx1024 ; --launcher.XXMaxPermSize = 512;  

  了解一下JVM内存管理的机制,然后再解释每个参数代表的含义。 

    JVM主要管理两种类型的内存:堆和非堆。按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。在JVM中堆之外的内存称为非堆内存(Non-heap memory)。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以,方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。

     对内存分配:

         -vmargs  的意思是设置JVM参数,所以后面的其实都是JVM的参数了

         -Xms:   JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;

-Xmx:   JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。

    默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。

    因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。

   非堆内存分配
     -XX:PermSize: JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;

-XX:MaxPermSize: JVM使用-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
   JVM内存限制(最大值)
    首先JVM内存限制于实际的最大物理内存,假设物理内存无限大的话,JVM内存的最大值跟操作系统有很大的关系。

    简单的说就32位处理器虽然可控内存空间有4GB,但是具体的操作系统会给一个限制,这个限制一般是2GB-3GB

   (一般来说Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。

    JVM虚拟机设置

   参数形如 "key value"这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。比如我们使用-vm C:\Java\jre1.6.0\bin\javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:

    -vm                                            
      C:\Java\jre1.6.0\bin\javaw.exe

    其中–launcher.XXMaxPermSize(注意最前面是两个连接线)跟-XX:MaxPermSize参数的含义基本是一样的,

    区别就是前者是eclipse.exe启动的时候设置的参数,而后者是eclipse所使用的JVM中的参数。

     参考:http://blog.csdn.net/zengyangtech/article/details/7003379

  

  3.  unable to execute dex:java heap space

   经过第二部的修改后,运行还是不行,Eclipse长时间停留在100%那个进度 后报unable to execute dex:java heap space错误提示。

   将class.jar的Jar 添加user Library,并把 as system Library 选上,并引入工程:
        建立User Library:Windows->Preference->Java->Build Path->User Library, New and Add Jars (必须 System Library)
        添加User Library 到工程:Project->Properties->Java Build Path->Libraries->Add Library->User Library
 
         

     http://www.cnblogs.com/garygou/p/3501346.html

   4.  Installation error: INSTALL_FAILED_INSUFFICIENT_STORAGE

     android应用的apk过大; 或者 模拟器上运行的程序越来越多,终于报内存不足的异常,安装apk也不行了…

     原因:默认的模拟器内存被占用,导致存储空间不够

     解决:修改配置文件以扩大手机内存:
     
1、网上的方法:
      配置文件目录:
      C:\Documents and Settings\username\.android\avd\avdname.avd
      该目录下包含:hardware-qemu.ini;emulator-user.ini;config.ini三个配置文件
      修改hardware-qemu.ini中hw.ramSize = 128 的值;
          验证结果,网上的这种方式在模拟器重启之后又变成原来的128了,无效!

    2、通过命令行修改手机默认内存:
      在windows cmd下运行emulator命令
      启动已经建立好的虚拟Android系统
      ($HOME)\emulator.exe -avd <AVD名字> -memory <RAM大小> -partition-size <ROM大小>
        ($SDK_DIR)\tools\emulator.exe -avd Android -memory 512 -partition-size 1024

    3、按照上面2的步骤,每次重启avd内存还是变成了设置前的数据了
          解决方案:创建emulator.exe的快捷方式,
      在目标中保存 ($SDK_DIR)\tools\emulator.exe -avd Android -memory 512 -partition-size 1024
      以后每次用这个快捷方式启动模拟器!

    4. 修改eclipse中启动时的附加参数 -memory 512 -partition-size 1024

                Window->Preference->android->Launch   Add  "-partition-size 1024” on the “Default emulator option” field.

    
    

    


 

android大项目运行中出现问题汇总的更多相关文章

  1. android Studio项目运行时报错“Could not identify launch activity: Default Activity not found”

    出现红色的小叉叉,有点蒙圈的感觉 其实只是因为AndroidManifest.xml里面没有设置运行初始的activity <activity android:name=".MainA ...

  2. ELK系列--实时日志分析系统ELK 部署与运行中的问题汇总

    前记: 去年测试了ELK,今年测试了Storm,最终因为Storm需要过多开发介入而放弃,选择了ELK.感谢互联网上各路大神,目前总算是正常运行了. logstash+elasticsearch+ki ...

  3. java 项目创建中的问题汇总

    eclipse 创建maven项目时 报错 Unable to create project from archetype [org.apache.maven.archetypes:ma 你看看你ma ...

  4. GitHub上史上最全的Android开源项目分类汇总 (转)

    GitHub上史上最全的Android开源项目分类汇总 标签: github android 开源 | 发表时间:2014-11-23 23:00 | 作者:u013149325 分享到: 出处:ht ...

  5. GitHub上史上最全的Android开源项目分类汇总

    今天在看博客的时候,无意中发现了 @Trinea 在GitHub上的一个项目 Android开源项目分类汇总 ,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参考价值,包括很炫 ...

  6. Android 开源项目分类汇总(转)

    Android 开源项目分类汇总(转) ## 第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Galler ...

  7. Android 开源项目分类汇总

    Android 开源项目分类汇总 Android 开源项目第一篇——个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView ...

  8. Android开源项目分类汇总【畜生级别】[转]

    Android开源项目分类汇总 欢迎大家推荐好的Android开源项目,可直接Commit或在 收集&提交页 中告诉我,欢迎Star.Fork :) 微博:Trinea    主页:www.t ...

  9. Android开源项目分类汇总[转]

    Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析欢迎加入 QQ 交流群:383537512(入群理由需要填写群 ...

随机推荐

  1. HDMI接口与协议

    深入了解HDMI接口 一.HDMI接口的工作原理这张图是HDMI接口的架构示意图.从左边的信号源中你可以看到,HDMI接口的信源可以是任何支持HDMI输出的设备,而接入端也可以是任何带有HDMI输 入 ...

  2. php没有开启Memcache扩展类时

    模拟PHP Memcache 类.当服务器没有开启Memcache扩展的时候.可以采用本类使用方法class_exists('Memcache') or include './Memcache.cla ...

  3. shell下root用户切换其他用户运行程序

    工作中,一些程序,需要随机启动,但是不是以root用户运行,于是需要在rc.local中通过shell,从root用户切换到其他用户运行程序,命令如下: su -c 'command' - user ...

  4. shell脚本摘要

    开启监听端口的程序时,查看是否开启成功(该例子监听8983端口) #动态显示[|][/][-][\] function spinner() { local pid=$1 local delay=0.5 ...

  5. C# STUDY

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  6. 牢骚 - 你代码写得丑,又不肯用好一点的IDE,这让我很为难啊。

    又有人问我代码错误,发过来就是一篇巨丑无比的代码,先不说左大括号转行还和代码写在同一行的谭浩强风格,你这狗啃的一样的缩进是闹哪样!粘进VS2015里面,自动格式化,瞬间赏心悦目,编译错误出了5行,我直 ...

  7. cotex_m3内核提供的ITM串口打印调试

    cotex_m3内核的ARM提供了ITM串口打印观测的功能,可以不用ARM单片机自己的串口就可在开发时候串口打印调试.节约了宝贵的内部资源,同时也为调试提供了方便.使用方法如下: 1 将下面的SWO_ ...

  8. python 最长公共子序列

    网上有很多,但有bug,特别是这个:http://www.oschina.net/code/snippet_16840_2015 好大的坑... get length def lcs_len(a,b) ...

  9. Jmeter-Maven-Plugin高级应用:Selecting Tests To Run

    地址:https://github.com/jmeter-maven-plugin/jmeter-maven-plugin/wiki/Advanced-Configuration Selecting ...

  10. 织梦CMS站点favicon.ico图标的放置

    1.在线制作一个ico图标,推荐制作网站:http://ico.55.la/.制作好后,将favicon.ico图标放在站点模板默认目录下的images文件夹里. 2.在index.htm的<h ...