Dalvik的内存模型与Java相同吗?我特别感兴趣的是否读取和写入参考和非long/非double原始变量是原子,但我也想知道有没有这两个平台的内存模型之间的差异.
我是Android开发的新手,我似乎无法掌握Java Out of Memory异常.我知道这意味着我的应用程序已经超过了VM的预算,但经过Google搜索这么多次后,我似乎仍然没有掌握这个概念.我担心我的应用程序会占用太多内存,因为每个屏幕有六个按钮选择器,每个选择器有两个位图,根据属性选项卡每个大约20 kb.在我的根目录G2x上,我已将VM预算设置为12mb,重新启动了我的手机并运行了我的应用程序,没有任何问题.我在每个onDestroy()上取消绑定drawables并暗示GC也在这里运行.在模拟器中使用应用程序一段时间后,在我的DDMS屏幕上单击"原因GC",结果为ID = 1,堆大小6.133 MB,分配2.895MB,自由3.238 MB,%使用47.20,#对象52,623.
这是我不明白发生了什么,我的模拟器设置为24MB的VM.那个数字在哪里?我遇到的实际问题是,如果我将模拟器设置为16MB的VM,我的应用程序会因为内存不足异常而在第二个活动上崩溃.为什么我的手机上的VM设置为12 MB,或者我的旧HTC Magic手机上有12 MB的VM存量?你们还认为我的应用占用了太多内存吗?我不知道这些DDMS号码是否好.谢谢你的时间.
至于我的代码,我有XML布局中指定的每个图像,除了向它们添加侦听器之外,我不会以编程方式对它们执行任何操作.我在这里找到了这段代码,我已将它添加到我拥有的每个活动中......
@Override
protected void onDestroy() {
super.onDestroy();
unbindDrawables(findViewById(R.id.myRootLayout));
System.gc();
}
private void unbindDrawables(View view) {
if (view.getBackground() != null) {
view.getBackground().setCallback(null);
}
if (view instanceof ViewGroup && !(view instanceof AdapterView)) {
for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
unbindDrawables(((ViewGroup) view).getChildAt(i));
}
((ViewGroup) view).removeAllViews();
}
}
Run Code Online (Sandbox Code Playgroud)
否则,我所做的就是将onClickListeners添加到具有PNG背景的按钮.我想学习如何以编程方式指定按钮背景,但我需要选择功能,如焦点,按下,非聚焦但按下等,以使按钮背景根据用户交互而变化.我已经回顾了关于这个的文档,但它看起来势不可挡,这就是为什么我认为我从这里开始管理堆的基础知识,并努力在代码中指定选择器.这可能没有意义但是有一个"健康"的内存分配量,应用程序可以分配而不会接近内存不足异常?例如,如果一个应用程序分配6MB应该没问题,但8MB会推动它,在内存分配方面有这样的界限吗?再次感谢Alex Lockwood的回复我将再次阅读并重新阅读,直到这些内容对我有意义
我对Android(由Novell)的Mono如何工作感兴趣.
我最大的问题是使用的实际运行时.MfA是否提供了一个Mono运行时,它包装并调用Dalvik运行时,或者在此操作中是否完全绕过了Dalvik?完全是别的吗?
我很好奇,因为我听说Mono运行时在移动设备上有更好的性能(不是我相信我在互联网上读到的任何内容......),而且我只是想了解整个事情.
关于比较和对比Mono/Dalvik运行时主题的任何其他一般知识将不胜感激.
谢谢!
我将学习一些关于Dalvik VM,dex和Smali的知识.
我读过关于smali的内容,但仍然无法清楚地了解它在编译器链中的位置.它的目的是什么.
这里有一些问题:
先感谢您.
我有兴趣将Scala(或其他一些非Java JVM语言)集成到android平台中.我不是指用Scala编写一个Android应用程序,我早期就做过,但实际上是在构建android平台源代码树的构建过程中.我想这将是一个挂入makefile等问题.有没有人对此有所了解?
到目前为止我所拥有的: 平台源代码树来自git://android.git.kernel.org/platform/manifest.git以其处女形式构建,以"[下载并构建Google Android] [1]"为指导
还剩什么:
看起来我快到了!
过去的一些笔记
最新:我找到了编译Java源文件的位置!在definitions.mk中,请参阅'define transform-java-to-classes.jar'.最新的想法是编写一个transform-scala-to-classes定义,然后将它们存储在直接打包的类中.我将在transform-java-to-classes.jar中的这一步之前调用transform-scala-to-class.对eclipse和cygwin的支持现在将被删除,因为它会使代码混乱,因此会增加失败的可能性.
构建过程由运行build/core/main.mk的根Makefile开始构建/ core/main.mk包括build/core/config.mk,其中包括build/core/combo/javac.mk,它设置HOST_JAVAC,TARGET_JAVAC和COMMON_JAVAC.COMMON_JAVAC是"具有公共参数的Java编译器命令",通过它看,其他两个变量默认获取这些值,除非在特殊环境(openjdk或eclipse)中.COMMON_JAVAC不在此文件之外使用.另外两个仅用于build/core/definitions.mk.
build/core/java_library.mk(由config.mk包含)似乎只关心构建jar.这超出了我们关心的范围.与jar的任何交互预先假定类文件,这些类文件预先假定我们已经成功构建了我们的scala文件.
main.mk中有关于java版本的检查.我们将忽略这些并假设我们的scala版本是兼容的.现在(在combo/scalac.mk中)我使用的是javac.mk中使用的相同的--target arg.这应该存储在一个变量中.
main.mk还包括build/core/definitions.mk,它依次定义了一些有用的函数.我们关心的是all-java-files-under和all-subdir-java-files.后者在Android.mk文件中用于查找java文件.前者用于后者的实施.我会写Scala等价物.
为了弄清楚构建过程是如何工作的,我现在用-n和其他人运行make.我从stackoverflow文章"[用于调试makefile的工具] [2]"中得到了这个想法.我也在研究翻拍调试.
build/core/{config.mk,definitions.mk}告诉我们使用哪些make文件/命令来做什么.
作为在每个项目基础上攻击支持的可能方式,可能会将额外的代码添加到项目的Android.mk文件中.从platform/build/core/build-system.html我们读到"Android.mk是控制给定模块构建的makefile片段的标准名称.只有顶层目录应该有一个名为"Makefile"的文件." 您可以创建一个新目标,如"scala-build",并在最终make之前运行(make PackageName scala-build).也许还可以偷偷地将它隐藏在变量赋值中,从而减少了明确调用目标的需要.
另一种方式(远远更加hackish)是劫持用于javac的命令.这在build/core/combo/javac.mk中设置.您的项目的Android.mk必须包含LOCAL_SRC_FILES中的*.scala文件以及*.java文件.
在Linux上编译和运行Dalvik虚拟机所需的最小步骤(包括检索源代码)是什么?
我的团队和我继承了另一个团队的大型Android项目.据报道,包含所有包含库的整个应用程序有大约35000种方法.我们现在的任务是在应用程序中实现我们需要使用Protocol Buffers的新服务.
问题是生成的.jar文件包含所有必需的.proto文件,会创建另外35个方法,即70000个方法.如果您不知道,Android编译器每个.dex文件的限制为65536个方法.我们显然超过了这个限制,我们在尝试编译应用程序时遇到以下错误:
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
Run Code Online (Sandbox Code Playgroud)
是的,应用程序架构可能应该进行重组,但这需要时间.目前我们正试图找出解决方案来暂时解决这个问题.
有什么建议?
我一直想知道Object在Android上占用了多少内存.有许多与HotSpot JVM相关的资源(如此)告诉空对象占用8个字节,空数组占用12个字节,并且所有对象都与8字节边界对齐.因此,没有额外字段的对象应该占用8个字节,最小的对象至少有一个额外字段--16个字节,一个空数组--16个字节,对吧?
我在这个问题上没有找到关于Dalvik的具体信息,并决定通过测试来弄清楚.运行测试结果令人惊讶.
关于计算方法的几句话.Android的Object.hashCode()实现只返回指向int的对象的指针.(似乎很明显和一般,但[另一个惊喜]事实证明,它不在HotSpot JVM上 - 例如使用HotSpot运行MemTest并查看).所以,我在Dalvik上使用了hashCode()的简单性来计算Android上的对象大小,通过在一行中分配测试类的两个实例,并且分配的空间量应该等于它们的hashCode()的差异值(假设Dalvik在完全随机的地址分配它们没有多大意义).只是为了确保每个测试类连续分配4个对象,这总是提供了hashCode()的相同差异.所以,我相信这种方法的正确性毫无疑问.
以下是测试的源代码:
public class MemTest {
public static void run() {
Object o1 = new Object();
Object o2 = new Object();
Object o3 = new Object();
Object o4 = new Object();
EmptyObject eo1 = new EmptyObject();
EmptyObject eo2 = new EmptyObject();
EmptyObject eo3 = new EmptyObject();
EmptyObject eo4 = new EmptyObject();
ObjectWithBoolean ob1 = new ObjectWithBoolean();
ObjectWithBoolean ob2 = new ObjectWithBoolean();
ObjectWithBoolean ob3 = new ObjectWithBoolean();
ObjectWithBoolean ob4 = new …Run Code Online (Sandbox Code Playgroud) 在Android Studio中启动新项目并选择Tabbed Activity之后,在构建项目后,我在Android Monitor中收到此错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app, PID: 23581
java.lang.IllegalArgumentException: Rect should intersect with child's bounds.
at android.support.design.widget.CoordinatorLayout.offsetChildByInset(CoordinatorLayout.java:1319)
at android.support.design.widget.CoordinatorLayout.onChildViewsChanged(CoordinatorLayout.java:1257)
at android.support.design.widget.CoordinatorLayout$OnPreDrawListener.onPreDraw(CoordinatorLayout.java:1805)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:847)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1867)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:996)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5600)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
at android.view.Choreographer.doCallbacks(Choreographer.java:574)
at android.view.Choreographer.doFrame(Choreographer.java:544)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
这个例外意味着什么,以及如何解决它?这是一个全新的项目,所以我没有做任何改变.