标签: android-runtime

dexopt和dex2oat之间的区别?

Google是从移动DalvikART(Android的运行系统).

我试图了解它是如何改善性能的.

我找到的最好的解释是下面的图像:

Dalvik和ART

其中一个已改变的主要成分是dexoptdex2oat.

由于我对这些没有太多了解,有谁可以解释这些差异以及这将如何改善性能?

android dalvik dexopt android-runtime dex2oat

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

OAT是什么意思?

我们知道Dalvik使用APK,DEX和ODEX文件.我们知道这个缩写意味着通过AOSP源或开发者网站.

(像这样 - https://source.android.com/devices/tech/dalvik/dex-format.html)

  • DEX表示Dalvik EXcutable文件.
  • ODEX表示优化的Dalvik EXcutable文件.
  • APK表示Android PacKage.

ART(Android RunTime)使用OAT和ART,但它们并没有解释任何意义.

有谁知道这些缩短词的含义?

android android-runtime android-5.0-lollipop

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

Android FinalizerDaemon挂断了

我在Android应用程序中遇到了一个非常奇怪的问题.在某个点之后(主要活动开始并且显示片段的时候),FinalizerDaemon会停止处理对象并且垃圾堆积不断.看一下线程转储,它似乎停留在ReferenceQueue.remove():

"FinalizerDaemon@4461" daemon prio=5 waiting
  java.lang.Thread.State: WAITING
      at java.lang.Object.wait(Object.java:-1)
      at java.lang.Object.wait(Object.java:423)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:101)
      - locked <0x1173> (a java.lang.ref.ReferenceQueue)
      at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:72)
      at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:185)
      at java.lang.Thread.run(Thread.java:818)
Run Code Online (Sandbox Code Playgroud)

但队列并非空.如果我在使用app一段时间之后转储堆,那么队列实际上是数千个条目.数据结构也看起来不破: FinalizerDaemon实例显示非空的ReferenceQueue

在分配和垃圾收集后再次转储更多显示队列的头部与以前相同的Matrix实例.

现在,我注意到了这一点,因为我保留了一些C++对象,需要在某些时候释放它们.虽然我怀疑终结器调用JNI函数并在C++端做一些愚蠢的操作可能会以某种方式破坏它,但我的所有日​​志都表明所有终结器都运行良好并返回而不会抛出任何东西,直到它们随机停止被调用.此外,最终的调用不应该打破守护进程,除了整个应用程序或其他东西,因为看门狗应该处理运行时间太长并抛出异常的终结器.

我尝试了一个显式的System.runFinalization(),它所做的只是永远挂起主线程,等待从未运行的守护进程.

知道怎么会这样吗?

java multithreading android android-ndk android-runtime

19
推荐指数
1
解决办法
3917
查看次数

从/system/framework/arm/boot.oat启动的Android本机崩溃

在我最近在Google Play上更新我的应用程序之后,我开始收到很多崩溃报告,所有这些都是来自Android 5的三星设备.较低的Android版本工作正常,其他Android 5厂商的设备也可以正常工作.

我没有任何可以重现问题的设备,所以我不能一分为二.我试图从崩溃报告和自我上一个工作版本(不幸的是很长)以来的更改列表中推断出可能出现的问题.

所有崩溃报告都是这样的(只是设备之间的地址略有不同):

Build fingerprint: 'samsung/kltektt/kltektt:5.0/LRX21T/G900KKTU1BOB1:user/release-keys'
Revision: '15'
ABI: 'arm'
pid: 26265, tid: 26265, name: mt.AnnelidsDemo >>> cz.gdmt.AnnelidsDemo <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x76f57e84
r0 00000800 r1 0000004b r2 b4aa9f9a r3 00000000
r4 1426e019 r5 76f57e80 r6 0000012c r7 76e6b040
r8 00000019 r9 76f57d54 sl 000007ff fp b4e1b330
ip b4aa9f70 sp bea94b50 lr b4bc72c1 pc b4c0d9b8 cpsr 00070030

backtrace:
#00 pc 001099b8 /system/lib/libart.so (art::TypeLookupTable::Lookup(char const*) const+59)
#01 pc 000c32bd /system/lib/libart.so (art::ClassLinker::LookupClassFromImage(char const*, art::gc::space::ImageSpace*)+64) …
Run Code Online (Sandbox Code Playgroud)

crash android samsung-mobile android-runtime android-5.0-lollipop

18
推荐指数
1
解决办法
6484
查看次数

棉花糖许可实施

我正在尝试在我的现有Android应用程序中添加Android 6.0支持.我曾经用过SYNCADAPTER同步数据.它的工作正常,直到API 22.但是在23(ANDROID 6.0)中他们已经删除了Group权限AUTHENTICATE_ACCOUNTS.

我找到了如何获得运行时权限的示例,我尝试过同样AUTHENTICATE_ACCOUNTS但它不起作用.

我也找到了一个答案,是否有任何诀窍与AUTHENTICATE_ACCOUNTS答案相同?

我发现删除权限列表overhere.所以,如果我的应用程序使用列出的权限.在这种情况下,任何应用程序在Android M(6.0)中都有效吗?

android android-permissions android-runtime android-6.0-marshmallow

17
推荐指数
1
解决办法
6289
查看次数

在Android 5.0上动态加载DEX文件

在Android 5.0之前,我能够使用DexClassLoader和调用loadClass()方法动态加载DEX文件,但是使用最新的Android版本,我得到了一个ClassNotFoundException.

这是我在做的事情:

  1. 生成DEX文件.

    ../android-sdk/android-sdk-linux_86/build-tools/21.1.1/dx --dex --output=bin/output.dex  bin/output.jar
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建一个DexClassLoader.

    DexClassLoader cl = new DexClassLoader(
    dexFile.getAbsolutePath(),
    odexFile.getAbsolutePath(),
    null,
    mContext.getClassLoader());
    
    Run Code Online (Sandbox Code Playgroud)
  3. 呼叫 cl.loadClass("myMethod");

我知道ART使用dex2oat来生成一个由ART加载的ELF文件但是在步骤2中我生成了一个ODEX文件,因此我不需要在ART中运行以在运行时加载DEX文件,任何人都可以帮助我 ?

android classloader dex android-runtime dex2oat

15
推荐指数
1
解决办法
6947
查看次数

艺术:X的验证花了Y ms

我的logcat中有一个警告:

W/art: Verification of void com.myapp.LoginFragment$override.lambda$logIn$5(com.myapp.LoginFragment, java.lang.Throwable) took 217.578ms
Run Code Online (Sandbox Code Playgroud)

这是代码:

subscription = viewModel.logIn()
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(
               this::showStudioSelection,
               error -> {
                    ErrorResponse errorResponse = ErrorResponseFactory.create(error);

                    if (errorResponse.code() == ApiResult.BAD_REQUEST) {
                       Snackbar.make(getView(), R.string.login_bad_credentials, Snackbar.LENGTH_LONG)
                            .setAction(android.R.string.ok, v -> {})
                            .show();
                    } else {
                        Snackbar.make(getView(), "Unknown error " + errorResponse.code(), Snackbar.LENGTH_LONG)
                            .setAction(android.R.string.ok, v -> {})
                            .show();
                    }
                    viewModel.updateLoginButtonState();
                 }
            );
Run Code Online (Sandbox Code Playgroud)

220ms是相当多的(我觉得我注意到片段启动时滞后).

我正在使用RxJava和retrolambda,但这不是弹出此消息的唯一地点,所以我认为它不直接相关.

我如何影响验证时间?它甚至值得吗?

它似乎与圈复杂度有关,因为我可以通过删除一些更干的代码中的Snackbar.make调用来消除警告:if

String errorMessage;
if (errorResponse.code() == ApiResult.BAD_REQUEST) {
    errorMessage = getString(R.string.login_bad_credentials);
} else {
    errorMessage = …
Run Code Online (Sandbox Code Playgroud)

performance android android-runtime

15
推荐指数
2
解决办法
3873
查看次数

onRequestPermissionsResult 在片段中不起作用

我正在尝试实现 Marshmallow 的权限支持,但我在“onRequestPermissionsResult”中的代码从未被调用。

在 Activity 中工作时,它的工作正常但在片段中我遇到了问题,即控件没有进入 onRequestPermissionsResult()

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                            mCheckPermission();
                        }
Run Code Online (Sandbox Code Playgroud)

在 mCheckPermission() 中:-

public void mCheckPermission() {
        if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION},
                    PERMISSION_REQUEST_COARSE_LOCATION );

        }
    }
Run Code Online (Sandbox Code Playgroud)

对话框弹出 2 个按钮。拒绝和允许。单击按钮时,控件未进入 onRequestPermissionCheck();

@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode){
            case PERMISSION_REQUEST_COARSE_LOCATION: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    Toast.makeText(getActivity(), "permission granted", Toast.LENGTH_LONG).show();
                    //call your action

                } …
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-runtime runtime-permissions

14
推荐指数
1
解决办法
6583
查看次数

Android垃圾收集器释放内存

我正在开发一个处理大量分配的应用程序(大约400万个双打和100万个类).我正在查看垃圾收集器日志,我看到不同设备上释放的内存总量不同.

例如,我有一个Moto X(2014)最终释放超过312 MB.我还有一个Droid Bionic在相同的数据上运行相同的代码,平均释放616 MB.两个设备最终的堆大小约为50 MB.

为什么Bionic上的GC释放的内存比Moto X多?他们应该生成相同数量的垃圾.垃圾收集器幕后发生了什么?Moto X在Android 5.1上,Bionic在4.1.2上.

编辑:我有四个可以释放大约300 MB RAM的设备:Moto X(2014),Nexus 7 2013,Nexus 7 2012和Razr i.所有这四个都使用ART.Bionic正在运行Dalvik运行时.这是为什么没有那么放松了?我注意到GC_FOR_ALLOC在ART中没有发生,但在Dalvik上一直被调用.

memory android garbage-collection android-runtime

11
推荐指数
1
解决办法
605
查看次数

Android - 暂停所有线程:*ms

我离开应用程序一段时间后,我的logcat中出现了这些警告.(虽然没有杀死,只是按回来离开它.)

05-03 13:43:42.955 13047-13053/package W/art: Suspending all threads took: 7.873ms
05-03 13:44:32.458 13047-13053/package W/art: Suspending all threads took: 13.441ms
05-03 13:46:58.584 13047-13053/package W/art: Suspending all threads took: 34.462ms
05-03 13:47:00.574 13047-13053/package W/art: Suspending all threads took: 8.281ms
05-03 13:48:00.425 13047-13053/package W/art: Suspending all threads took: 25.929ms
05-03 13:48:16.019 13047-13053/package W/art: Suspending all threads took: 35.053ms
05-03 13:50:01.858 13047-13053/package W/art: Suspending all threads took: 16.160ms
05-03 13:50:17.975 13047-13053/package W/art: Suspending all threads took: 20.074ms
05-03 13:52:07.744 13047-13053/package W/art: Suspending all threads …
Run Code Online (Sandbox Code Playgroud)

multithreading android threadpoolexecutor android-runtime

10
推荐指数
1
解决办法
8165
查看次数