标签: dalvik

Dalvik的内存模型与Java相同吗?

Dalvik的内存模型与Java相同吗?我特别感兴趣的是否读取和写入参考和非long/非double原始变量是原子,但我也想知道有没有这两个平台的内存模型之间的差异.

java android memory-model dalvik java-memory-model

30
推荐指数
2
解决办法
4740
查看次数

Android了解堆大小

我是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的回复我将再次阅读并重新阅读,直到这些内容对我有意义

heap android virtual-machine dalvik ddms

30
推荐指数
2
解决办法
3万
查看次数

Mono for Android如何运作?

我对Android(由Novell)的Mono如何工作感兴趣.

我最大的问题是使用的实际运行时.MfA是否提供了一个Mono运行时,它包装并调用Dalvik运行时,或者在此操作中是否完全绕过了Dalvik?完全是别的吗?

我很好奇,因为我听说Mono运行时在移动设备上有更好的性能(不是我相信我在互联网上读到的任何内容......),而且我只是想了解整个事情.

关于比较和对比Mono/Dalvik运行时主题的任何其他一般知识将不胜感激.

谢谢!

mono android dalvik xamarin.android

28
推荐指数
1
解决办法
8206
查看次数

什么是Smali Code Android

我将学习一些关于Dalvik VM,dex和Smali的知识.

我读过关于smali的内容,但仍然无法清楚地了解它在编译器链中的位置.它的目的是什么.
这里有一些问题:

  1. 据我所知,dalvik作为其他虚拟机运行字节码,在Android的情况下它是dex字节码.
  2. 什么是小?Android OS或Dalvik Vm是否直接使用它,或者它只是相同的dex字节码,但对人类更具可读性?
  3. 它是像Windows的dissasembler(如OllyDbg)程序可执行程序由不同的机器代码(例如D3,5F)组成,并且每个机器代码都有适当的汇编命令,但Dalvik Vm也是软件,因此smali是字节码的可读表示
  4. 有新的ART环境.它仍然使用字节码或直接执行本机代码吗?

先感谢您.

android dalvik dex smali vm-implementation

28
推荐指数
1
解决办法
2万
查看次数

如何将Scala集成到核心Android平台?

我有兴趣将Scala(或其他一些非Java JVM语言)集成到android平台中.我不是指用Scala编写一个Android应用程序,我早期就做过,但实际上是在构建android平台源代码树的构建过程中.我想这将是一个挂入makefile等问题.有没有人对此有所了解?

到目前为止我所拥有的: 平台源代码树来自git://android.git.kernel.org/platform/manifest.git以其处女形式构建,以"[下载并构建Google Android] [1]"为指导

  • build/core/combo/scalac.mk#配置由config.mk包含的scala编译器相关变量
  • 在build/core/definitions.mk中为all-subdir-scala-files和all-scala-files-under添加了定义
  • 在definitions.mk中添加了定义以构建scala文件,以便它们包含在包中

还剩什么:

  • 包括scala-library.jar
  • 确保对-bootclasspath的更改没有破坏任何内容
  • 弄清楚如何处理scala类依赖于java类的情况,反之亦然
  • 主要清理代码
  • 测试!
  • 通过我所做的更改,弄清楚要做什么(除了在这里发布)

看起来我快到了!

过去的一些笔记

最新:我找到了编译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文件.

android scala jvm-languages dalvik

27
推荐指数
1
解决办法
1713
查看次数

如何编译Dalvik在Linux上本地运行?

在Linux上编译和运行Dalvik虚拟机所需的最小步骤(包括检索源代码)是什么?

android dalvik

27
推荐指数
2
解决办法
2万
查看次数

如何解决Dalvik编译器限制64K方法的问题?

我的团队和我继承了另一个团队的大型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)

是的,应用程序架构可能应该进行重组,但这需要时间.目前我们正试图找出解决方案来暂时解决这个问题.

有什么建议?

android dalvik protocol-buffers dex

27
推荐指数
2
解决办法
3万
查看次数

如何在Android上运行Frege程序?

我对函数式语言的Android编程感兴趣,最好是接近Haskell.弗雷格似乎是一个不错的选择.我发现有人已经做过这样的概念验证应用程序,但我找不到它的来源或类似的东西.

所以我的问题是,如何在Android上运行Frege程序,它有多难以及最终的障碍是什么?

android haskell dalvik frege

27
推荐指数
2
解决办法
2354
查看次数

在对象大小方面,Dalvik对HotSpot的记忆力是否更大?

我一直想知道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)

java android memory-management dalvik

26
推荐指数
2
解决办法
1883
查看次数

java.lang.IllegalArgumentException:Rect应与子节点相交

在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)

这个例外意味着什么,以及如何解决它?这是一个全新的项目,所以我没有做任何改变.

android dalvik android-layout

26
推荐指数
3
解决办法
6233
查看次数