diff --git a/lib/android.js b/lib/android.js index 775383ee..e76951d7 100644 --- a/lib/android.js +++ b/lib/android.js @@ -618,6 +618,7 @@ function _getArtRuntimeSpec (api) { const apiLevel = getAndroidApiLevel(); const codename = getAndroidCodename(); + const isApiLevel34OrApexEquivalent = Module.findExportByName('libart.so', '_ZN3art7AppInfo29GetPrimaryApkReferenceProfileEv') !== null; let spec = null; @@ -645,7 +646,7 @@ function _getArtRuntimeSpec (api) { const threadListOffset = internTableOffset - pointerSize; let heapOffset; - if (Module.findExportByName('libart.so', '_ZN3art7AppInfo29GetPrimaryApkReferenceProfileEv') !== null) { // with apex updates apiLevel!=libart version + if (isApiLevel34OrApexEquivalent) { heapOffset = threadListOffset - (9 * pointerSize); } else if (apiLevel >= 24) { heapOffset = threadListOffset - (8 * pointerSize); @@ -1887,21 +1888,24 @@ function ensureArtKnowsHowToHandleReplacementMethods (vm) { const apiLevel = getAndroidApiLevel(); - let exportName = null; - const api = getApi(); + let mayUseCollector = () => false; + if (apiLevel > 28) { + const impl = Module.findExportByName('libart.so', '_ZNK3art2gc4Heap15MayUseCollectorENS0_13CollectorTypeE'); + if (impl !== null) + mayUseCollector = new NativeFunction(impl, 'bool', ['pointer', 'int']); + } + const kCollectorTypeCMC = 3; - const mayUseCollector = new NativeFunction(Module.findExportByName('libart.so', '_ZNK3art2gc4Heap15MayUseCollectorENS0_13CollectorTypeE'), 'int', ['pointer', 'int']); - if (mayUseCollector !== null && apiLevel > 28 && mayUseCollector(api.artHeap, kCollectorTypeCMC)) { - exportName = '_ZN3art6Thread15RunFlipFunctionEPS0_b'; - Interceptor.attach(Module.getExportByName('libart.so', exportName), artController.hooks.Gc.runFlip); + if (mayUseCollector(getApi().artHeap, kCollectorTypeCMC)) { + Interceptor.attach(Module.getExportByName('libart.so', '_ZN3art6Thread15RunFlipFunctionEPS0_b'), artController.hooks.Gc.runFlip); } else { + let exportName = null; if (apiLevel > 28) { exportName = '_ZN3art2gc9collector17ConcurrentCopying12CopyingPhaseEv'; } else if (apiLevel > 22) { exportName = '_ZN3art2gc9collector17ConcurrentCopying12MarkingPhaseEv'; } - if (exportName !== null) { Interceptor.attach(Module.getExportByName('libart.so', exportName), artController.hooks.Gc.copyingPhase); }