我刚刚在我的Android手机上从ICS(4.0.4)到JB(4.1)进行了自动更新,当我运行我的应用程序时它引入了多个垃圾收集调用:
WAIT_FOR_CONCURRENT_GC blocked 30ms
Run Code Online (Sandbox Code Playgroud)
我在我的应用程序中播放视频,这些阻止的GC调用几乎使我的延迟加倍,这是什么意思?
最近我读到了有关Dalvik 65K方法限制的内容.我已经知道方法调用列表只能调用第一个65536方法引用.为解决这个问题,我们提供了许多解决方案.其中一个是多索引,我们通过使用android的支持库将.dex文件拆分为多个类[classes.dex,classes1.dex ...].
我无法理解的是,由于这种多重索引,Android应用程序有什么缺点,为什么我们应该花费大量精力来减少引用方法的数量.
基本上在我的理解中,为了减少方法计数,我必须减少模块化,这使得我的代码可读性降低,从而消除了在删除第三方库代码时消耗的小时数.减少方法计数值得吗?
我很想知道google选择在java VM上开发android框架的原因.
在为Android编写代码近6个月的过程中,我观察到在资源有限的平台上运行VM的代码非常慢.涉及很多开销.我知道java是可移植的等等,是不是可以使用本地语言并获得VM提供的性能和功能?对于面向性能的应用程序,人们仍然最终编写本机代码并用JNI包装它,
那么谷歌为什么选择这个特定的堆栈:
编辑:我知道java - JVM与我服务器上的C++应用程序相同,但不是在android上运行.关于android并非如此 - 根据我的经验,用JNI包装的C++代码运行速度远远快于java代码(注意我甚至用java中的静态块完全相同的代码检查)我同意你的意见在任何其他平台上回答.
众所周知,Java 5引入了Instrumentation轻松获取对象大小的能力.在Android和Dalvik上有这样的方法吗?
该java.lang.instrument软件包在Android上不可用.
一切都很好,直到最近我注意到调试变得非常缓慢.我不记得任何会引起这种情况的剧烈变化.
UI导航有明显的滞后,网络操作需要永远.如果我重新启动手机并重新启动Android Studio/ADB,这可以解决一些问题.
在正常模式下运行时,App表现良好.
我在Android 4.4.2上使用Dalvik运行时.我还没有用过ART.
关于如何解决这个问题的任何建议?
我知道android系统包括Dalvik虚拟机(DVM)但是我不明白android系统是否包含JVM还是DVM是JVM的替代品?谢谢
我发现在使用eclipse运行或调试我的应用程序几次之后,我在我的控制台中得到了上面的输出(红色),我得不到Dalvik关于我手机连接状态的反馈.我的应用程序仍将调试等.我的控制台中没有任何用处.
任何想法如何解决这一问题?它似乎是间歇性的.几分钟后它就开始做了,继续做了很长一段时间,偶尔会再次消失.这发生在我的最后一台笔记本电脑上,现在在我的新笔记本电脑上进行了全新安装等.
我的应用程序导致这些可怕的GC_FOR_ALLOC在特定位置(方法)多次发生:
12-29 22:20:30.229: D/dalvikvm(10592): GC_FOR_ALLOC freed 1105K, 14% free 10933K/12615K, paused 33ms, total 34ms
12-29 22:20:30.260: D/dalvikvm(10592): GC_FOR_ALLOC freed 337K, 13% free 11055K/12615K, paused 25ms, total 26ms
12-29 22:20:30.288: D/dalvikvm(10592): GC_FOR_ALLOC freed 278K, 14% free 10951K/12615K, paused 24ms, total 24ms
12-29 22:20:30.495: D/dalvikvm(10592): GC_CONCURRENT freed 633K, 11% free 11317K/12615K, paused 16ms+3ms, total 79ms
12-29 22:20:30.495: D/dalvikvm(10592): WAIT_FOR_CONCURRENT_GC blocked 16ms
12-29 22:20:30.499: D/dalvikvm(10592): WAIT_FOR_CONCURRENT_GC blocked 15ms
Run Code Online (Sandbox Code Playgroud)
我很清楚我在内存管理方面做错了(是的,垃圾收集很棒,但仍然没有让我免除责任,知道何时以及如何分配).
您能否推荐一种故障排除方法或技术,可以引导我找到令人讨厌的代码行和可能的解决方案?
我有2个应用程序版本 - 专业版和精简版.它们都已在v1.01上市.我试图为两者发布v1.1.此更新包括SwawrmConnect集成,以便使用其全局排行榜.
我应该首先说我知道我没有正确维护我的代码.我有2个完全独立的应用程序,可能共享90%的代码.我单独维护它们是因为经过一周或者2或3次未能弄清楚如何建立一个库并共享代码之后,我放弃了,就这样用它来了.
SwarmConnect是我使用的第一个jar,必须为两个应用程序创建一个库(请参阅下面的文件结构截图).
现在我的Lite版本正在运行并准备发布.我现在正试图将我的专业版本发布到需要发布的位置.我相当确定所有java/xml文件都是最新的并且准备就绪.当我在模拟器中运行专业版时,我收到以下错误:
[2013-04-18 11:24:41 - Dex Loader] Unable to execute dex: Multiple dex files define Lcom/swarmconnect/loopj/android/http/AsyncHttpResponseHandler;
[2013-04-18 11:24:41 - BibleTriviaPro] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/swarmconnect/loopj/android/http/AsyncHttpResponseHandler;
Run Code Online (Sandbox Code Playgroud)
我试过的事情:
我的文件结构:

可能问题是我正在尝试使用SwarmConnect作为2个项目(lite和pro)的库?
编辑:
下面是完美运行的lite版本的文件结构.在模拟器上编译并运行.

根据Fred Chung在Android开发者博客上介绍Dalvik中的Custom Class Loading:
Dalvik VM为开发人员提供了执行自定义类加载的工具.应用程序可以从其他位置(如内部存储)或通过网络加载它们,而不是从默认位置加载Dalvik可执行文件("dex").
但是,没有多少开发人员需要进行自定义类加载.但那些按照博客文章中的说明进行操作的人可能会在使用Gradle(Google I/O 2013中引入的Android新构建系统)模仿相同行为时遇到一些问题.
究竟如何调整新构建系统以执行与旧(基于Ant)构建系统相同的中间步骤?