仔细检查了安卓系统中的锁定情况
根据许多人的说法,除非您运行1.5或更高版本并使用volatile关键字. 损坏的双检查锁样本: // Broken multithreaded version // "Double-Checked Locking" idiom class Foo { private Helper helper = null; public Helper getHelper() { if (helper == null) synchronized(this) { if (helper == null) helper = new Helper(); } return helper; } // other functions and members... } 样本来自本文,该文章还提供了有关如何修复它的详细信息: /memorymodel/doublecheckedlocking
0 2023-11-20
编程技术问答社区
toArray与预设大小的数组
使用ar.toArray(new String[ar.size()]) Android Studio 3.2.1 警告预先大小的数组,并建议空数组: 有两种将集合转换为数组的样式:要么使用 预尺寸数组(例如C.ToArray(new String [C.Size()))或使用 空数组(例如C.ToArray(新字符串[0]).在较旧的Java版本中 建议使用预尺寸阵列,作为反射调用 创建适当尺寸的阵列所需的速度非常慢.然而 由于OpenJDK 6的晚期更新此通话是固有的,使得 空数阵列版本的性能相同,有时甚至 更好,与尺寸的版本相比.也通过预尺寸 阵列对于并发或同步收集是危险的 数据竞赛是可能在大小和toarray调用之间 如果收集为 手术过程中同时缩水.此检查允许 遵循统一样式:要么使用空数组(是 推荐在现代Java中)或使用尺寸的阵列(可能是 在较旧的Java版本或基于非HOTSPOT的JVM中更快). 对于Android还是仅适用于Java? 使用预尺寸的数组(在
2 2023-11-20
编程技术问答社区
如何使孤立的Dalvik
我正在追踪Dalvik机器源代码.因此,我想让Dalvik运行.我似乎是DVK项目.但是有许多问题导致故障.是否有任何方法可以使Dalvik只有没有所有Android.因为制作Android会花费太多时间(大约很多小时) dvk项目: 解决方案 如果您建造午餐" sim-eng",则将获得一个为主机构建的dalvikvm(即,您正在构建的Linux Box).这已经使用glibc而不是仿生. 如果您想为设备构建,并且只需要更快的构建,则无需重建所有内容; " MMM Dalvik Snod"就足够了. (尽管如果您在Dalvik/Libcore/中没有更改任何内容,那么对VM进行更改也不应该重建太多,即使您做了完整的顶级" MAKE".) 不要忘记使用" make -j"将一些并行性进入您的构建! 其他解决方案 这个博客文章有关如何编译二进制的信息以及如何使用它.
10 2023-11-19
编程技术问答社区
什么是Android中的ODEX文件?
安装了一些android应用程序后,我发现它将更改为智能手机中的odex文件(不是apk). 它是怎么发生的?谁可以教我,我对此非常感兴趣. 解决方案 博客文章主要是对的,但不完整.要充分了解Odex文件的功能,您必须了解有关应用程序(APK)的工作方式. 应用基本上是荣耀的拉链档案. Java代码存储在一个名为class.dex的文件中.dex,并且该文件由Dalvik JVM解析,并且已处理后的类的缓存.DEX文件存储在电话的Dalvik Cache中. . odex基本上是应用程序类的预处理版本.dex,DALVIK的执行准备.当应用程序触发时,将class.dex从APK存档中删除,并且不会将任何内容写入Dalvik Cache.一个未经探测的应用程序最终带有2个class.dex文件的副本 - apk中包装的一个副本,然后在dalvik缓存中处理了一个.自达尔维克(Dalvik)必须提取和处理class.dex文件以来,第一次启动也需要更长的时间. . 如
0 2023-11-19
编程技术问答社区
安卓系统了解堆的大小
我是Android开发的新手,我似乎无法将Java从内存中掌握.我知道这意味着我的应用程序已经超出了VM预算,但是在搜索了很多次之后,我似乎仍然没有掌握这个概念.恐怕我的应用程序使用了太多的内存,因为根据"属性"选项卡,每个屏幕上有六个按钮选择器,每个选择器的每个选择器都有两个位图.在扎根的G2X上,我将VM预算设置为12MB,重新启动手机并运行了我的应用程序,毫无问题.我在每个Ondestroy()上绑定了可抽签的东西,并暗示GC也可以在这里运行.在模拟器中使用了一段时间后,我在DDMS屏幕上单击"原因GC",结果是 ID = 1,堆尺寸6.133 MB,分配2.895MB,免费3.238 MB,%使用47.20,#对象52,623. 这是我不了解发生的事情的地方,我的仿真器设置为24MB的VM.那个数字在哪里?我遇到的实际问题是,如果我将模拟器设置为VM的16MB,则我的应用程序在第二个活动上崩溃,而不可记忆的例外.如果VM设置为12 MB或使用12 MB VM库存的VM设置为
0 2023-11-19
编程技术问答社区
在Eclair中的Android Dalvik验证
我最近一直在研究处理API级别的分裂,并发现了一个很棒的 教程 支持源代码中的不同API级别: 如本教程中所述,为了避免使用较新的类/方法的运行时间错误,而不是API级别,请检查API级别并使用懒惰加载. 我已经检查了代码,并且可以在Android 我将使用Camera.setDisplayOrientation方法来说明问题.该方法是在Froyo 2.2中引入的. import android.hardware.Camera; ... public class CameraActivity extends Activity implements SurfaceHolder.Callback{ Camera mCamera; ... public void surfaceChanged(SurfaceHolder holder, int format, int w, int h){ final int APIversion = Int
0 2023-11-17
编程技术问答社区
从BroadcastReceiver显示复杂的祝酒词
我想知道是否有人可以帮助我.收到SMS时,我正在尝试显示吐司元素.此吐司应包含具有图像(SMS图标)和2个文本视图(发送者,消息) 的布局 如果我从活动中调用以下方法,则可以按预期工作... public void showToast(Context context, String name, String message) { LayoutInflater inflater = getLayoutInflater(); View layout = inflater.inflate(R.layout.toast_sms, (ViewGroup) findViewById(R.id.toast_sms_root)); TextView text = (TextView) layout.findViewById(R.id.toastsms_text); text.setText(
0 2023-11-11
编程技术问答社区
安卓模拟器上的Mockito
Android Newbie在这里试图在Android中使用我最喜欢的Java测试工具.我正在尝试使用以下博客文章中概述的Mockito 1.9.5,但无法在模拟器上运行测试(我目前没有物理设备可以使用). oighit-android教程: 我能够执行所有正常的JUNIT测试而没有问题,但是我利用Mockito的任何测试都会收到以下内容: Can't open dex cache '/data/dalvik-cache/data@data@com.trendium.peg@cache@Generated-621101.jar@classes.dex': No such file or directory Unable to open or create cache for /data/data/com.trendium.peg/cache/Generated-621101.jar (/data/dalvik-cache/data@data@com.trendium.p
8 2023-10-17
编程技术问答社区
安卓测试项目构建工具v17中的VerifyError
由于安装了Android构建工具的V17,因此我在测试项目中获得了验证. 我的项目结构的简短描述: 所有JAR文件都存在于我的主要项目中 libs 文件夹 测试项目是一个位于我的主要项目中的项目 所有仪器测试都与我的活动相同. 我有一个仅在我的 libs 文件夹中的测试项目中需要的罐子 有人看过吗?自更新以来,这都发生在我所有的项目上.运行测试会产生一个仪器exception:java.lang.verifyError 解决方案 x ...@android.com为我报告的问题做了一个临时修复程序: http://code.google.com/p/android/issues/detail?id=27608 . 您可以尝试查看新的anttasks.jar文件可以解决您的问题. 它固定了我的. noclassdeffounderror在使用ANT进行仪器测试时 其他解决方案 在我的情况下,我使用" Robotium"库有一个测试
4 2023-10-17
编程技术问答社区
安卓系统中的系统调用是如何执行的,有可能监控它们吗?
我很难理解在Android应用执行中如何发挥系统调用. 从我对Android App执行的理解中,.class文件转换为Dalvik字节码(DEX),该文件合并在一起形成Odex.然后将ODEX与JIT编译器直接编译到机器代码中以进行执行. 在这种情况下,系统如何在Android的Linux内核中发挥作用?此外,是否有任何可能监视这些系统调用的方法? 解决方案 系统调用是内核空间的功能,可用于 用户空间.它赋予操纵硬盘文件或控制过程的能力.可以通过libc.so获得.所有需要与Linux OS/Android OS交互的代码(Java,Native,无论如何...)最终都会调用SYSCALL. Strace是用于调试过程的Linux实用程序.它可以监视系统呼叫,信号传递和过程状态的更改. Strace使用Ptrace系统调用来监视另一个过程内存和注册.对于使用它,只需执行: strace -p 其他解决方案 好吧,J
4 2023-10-13
编程技术问答社区
安卓虚拟机有没有可能在不杀死整个安卓程序的情况下对静态变量进行垃圾收集?
(由于垃圾收集器仅收集对象,因此标题具有误导性,但我发现此标题更简单) 假设我在一个名为global的类中具有一个静态变量的Android应用程序(在初始化时为null). 如果我将" userId"变量设置为某个值的duing android应用程序生命周期,例如global.userid =" myid",那么该变量是否有可能在Android应用程序还活着时变为null? 换句话说,Android VM是否有可能在不杀死整个Android应用程序的情况下卸载全局类并"杀死"此全局静态变量? 我担心用户ID在应用程序运行时突然无效的情况(由于存储器问题低),因此崩溃了整个应用程序. 编辑 我误解了一些概念(在应用程序与活动之间).感谢所有答案! 解决方案 如果我将" userId"变量设置为某个值的duing android应用程序生命周期,例如global.userid =" myid",那么该变量是否有可能在Android应用程序还活着时变
4 2023-09-28
编程技术问答社区
在Android中实现类似Spring的包扫描
对于我正在开发的Android框架,我正在尝试实现类似于Spring的component-scan的包装扫描功能.基本上,我希望能够指定基本软件包,例如com.foo.bar并检索具有特定注释的所有实例.我不想在我的框架上注册每个组件,因为这会破坏自动扫描的目的. 根据我的研究,Java似乎不可能使用反射来检索给定包装名称的资源.但是,我简要介绍了我稍微研究了弹簧来源,以了解他们是如何实现的,但是我认为他们在达尔维克运行时不起作用. 更新 当前,以下代码是我可以做的最好的选择,以检索包含特定注释的所有类,但坦率地说,这是一个非常差的解决方案.它对ClassLoader加上扫描(和加载)所有应用程序类做出了一些真正不安全的假设. public Set> getClassesWithAnnotation(Class annotation) { Set> classes = new
6 2023-09-10
编程技术问答社区
Dalvik正在寻找带有'.0'扩展名的.so文件--为什么?
我已经开始开发一个非常简单的Android应用程序,该应用程序由三个部分组成: Java应用程序本身 预先建造的共享库(我们将其称为libfoo) 另一个使用预构建库的共享库(我们将其称为libfoowrapper) 文件系统看起来像这样: jni Android.mk libfoo.so foowrapper.c Android.mk文件包含以下内容: LOCAL_PATH := $(call my-dir) #============================== include $(CLEAR_VARS) LOCAL_MODULE := foo-prebuilt LOCAL_SRC_FILES := libfoo.so include $(PREBUILT_SHARED_LIBRARY) #========================= include $(CLEAR_VARS) LOCAL_MODULE := foowrap
16 2023-08-31
编程技术问答社区
Dalvik到Java SE的通信
我正计划为Android开发一个应用程序,该应用需要后端服务器与该应用程序的其他用户同步数据.我计划在UNIX服务器上运行的标准Java中编写此服务器. 我曾经在两个Android设备之间直接执行此操作,在这种情况下,我只是序列化了两端需要发送的所有数据. 但是,我怀疑Dalvik序列化的格式与Java SE的格式不兼容.是这样吗?如果是,我的选择是什么?突然出现的一件事是在插座上发送RAW XML,但是如果有更好的选择,我会很高兴听到它们. 谢谢. 解决方案 如果您正在执行服务器,则应依靠更标准的XML或JSON.我个人喜欢JSON.您不应该指望所有客户都会友好.几乎每个移动设备都支持JSON.查看 Jackson 库来生成您的JSON.然后,您可以再次使用杰克逊(Jackson)进行对象的认可. 这种解决方案的美也很简单.您只需将请求放入浏览器中即可查看内容.使用二进制数据并不容易. 其他解决方案 我已经在Android设备和服务器之间成功使用
2 2023-08-29
编程技术问答社区
安卓进程调度
我正在尝试更好地理解,以便在创建Android应用程序/服务时可以探讨潜在互操作性问题的可靠性.我想弄清楚如何确定过程优先级.服务与活动之间的优先级差异以及调度程序是否对其优先级的差异有所不同.基本上,我试图深入了解活动或服务的可能性是由其他应用程序(甚至Linux内核)饿死的.) 有人可以推荐任何好的链接...我的搜索还没有太多. 谢谢! 编辑:我关注的是处理器时间切片/调度,而不是内存资源(内存资源在Android文档中得到很好的描述.)再次感谢! 解决方案 以下列表以重要性顺序介绍了不同类型的过程(第一个过程是最重要的,最后被杀死): 前景过程 可见过程 服务过程 背景过程 空过程 注意: Android基于当前在此过程中活跃的组件的重要性,在最高级别上排名一个过程.例如,如果一个过程托管服务和可见活动,则该过程被排名为可见过程,而不是服务过程. 这是从此处引用的 process and threads 编辑: 了解应
4 2023-08-21
编程技术问答社区
Scala on Android: java.lang.NoSuchMethodError: java.lang.String.isEmpty
我在Android 2.2.1上得到以下例外: java.lang.NoSuchMethodError: java.lang.String.isEmpty 我正在从Scala打电话text.isEmpty.任何想法,如何解决这个问题? 解决方案 使用JRE/JDK 1.5,它在String上没有isEmpty方法.这将避免Scala使用1.6的isEmpty而不是自己的情况.如果您也有Java库,请务必选择与1.5兼容的库. 在姜饼(2.3)中添加 其他解决方案 java.lang.String.isEmpty().您将必须编写自己的替换功能... 其他解决方案 替代使用(text.length()>0)?
42 2023-08-19
编程技术问答社区
我可以在Android Dalvik上使用哪些编程语言?
从理论上讲,达维克执行任何虚拟机字节代码,例如用 的编译器创建 expackj ColdFusion clojure Groovy javafx脚本 jruby jython 犀牛 Scala 除了Java以外 解决方案 在启动时,Java是唯一一种用于构建可分发第三方Android软件的官方支持的编程语言. Android Native Development Kit(Android NDK),它将允许开发人员使用C>和C++构建Android软件组件. 除了提供对本机代码的支持外,Google还扩展了Android以支持流行动态脚本语言.本月早些时候,Google推出了 android脚本脚本环境(ASE) 强>允许第三方开发人员使用perl,JRuby,Python,LUA和BeanShell构建简单的Android应用程序.有关 ase 的想法和使用,请参阅此 scala 也得到了支持.有关Scala的示例,请参阅这些 , 示例li
12 2023-08-19
编程技术问答社区
了解Dalvik代码的反汇编?
我正在玩 smali and baksmali 在一个小型Hello World Android应用程序上,我有书面.我的源代码是: package com.hello; import android.app.Activity; import android.os.Bundle; public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } } 然后将其分解为: .class public Lcom/hello/Main; .super La
4 2023-08-11
编程技术问答社区
在Android中,如何使用Java反射来调用sun.misc.Unsafe方法?
尽管有类似的问题(例如 a , b 和我正在使用Android Studio 1.5.1针对Android API 18(在Android Kitkat 4.4之前,我正在处理Dalvik,而不是Art Runtime). 我的问题是: (1)当我使用以下代码时,我可以打印一个 sun.misc.unsafe方法Android ,所以我认为我可以使用 Reflection ,但我确实可以访问它们不知道如何使用反射. (2)如果可能(1),如何使用sun.misc.unsafe方法在Android中通过反射找到magicnumber(在下面的代码中)地址? (3)如果可能(1),但是(2)是不可能的,如何将整数编号(例如int test = 123)放在任何本机内存地址中,并使用sun.misc.misc.unsafe方法打印其内存地址在Android中通过反射? String ClassName = "sun.misc.Unsafe";
10 2023-08-04
编程技术问答社区
是否有可能在运行时从Android应用程序中动态加载一个库?
有什么方法可以在运行时下载和使用Java库? 这是一个示例: 想象一下,应用程序需要根据输入值进行一些计算.该应用程序要求这些输入值,然后检查是否可用所需的Classe s或Method. 如果没有,它将连接到服务器,下载所需的库,并在运行时加载它,以使用反射技术调用所需的方法.实现可能会根据各种标准(例如下载库的用户)而改变. 解决方案 对不起,我迟到了,问题已经接受了答案,但是是,您可以下载并执行外部库.这是我这样做的方式: 我想知道这是否可行,所以我写了以下课程: package org.shlublu.android.sandbox; import android.util.Log; public class MyClass { public MyClass() { Log.d(MyClass.class.getName(), "MyClass: constructor called."); }
4 2023-08-03
编程技术问答社区