com.linkedin.dex.spec.DexFile.kt Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of parser Show documentation
Show all versions of parser Show documentation
Find all test methods in an Android instrumentation APK
/**
* Copyright (c) LinkedIn Corporation. All rights reserved. Licensed under the BSD-2 Clause license.
* See LICENSE in the project root for license information.
*/
package com.linkedin.dex.spec
import com.linkedin.dex.parser.ParseUtils
import java.nio.ByteBuffer
import java.nio.ByteOrder
class DexFile(byteBuffer: ByteBuffer) {
val byteBuffer: ByteBuffer
val headerItem: HeaderItem
val stringIds: Array
val typeIds: Array
val protoIds: Array
val fieldIds: Array
val methodIds: Array
val classDefs: Array
companion object {
val NO_INDEX = -1
}
inline fun parse(count: Int, offset: Int, size: Int, init: (ByteBuffer) -> T): Array {
return Array(count, { index ->
byteBuffer.position(offset + (index * size))
init(byteBuffer)
})
}
init {
this.byteBuffer = byteBuffer.asReadOnlyBuffer().order(ByteOrder.LITTLE_ENDIAN)
this.byteBuffer.position(0)
headerItem = HeaderItem(this.byteBuffer)
headerItem.validate()
stringIds = parse(headerItem.stringIdsSize, headerItem.stringIdsOff, StringIdItem.size, ::StringIdItem)
typeIds = parse(headerItem.typeIdsSize, headerItem.typeIdsOff, TypeIdItem.size, ::TypeIdItem)
protoIds = parse(headerItem.protoIdsSize, headerItem.protoIdsOff, ProtoIdItem.size, ::ProtoIdItem)
fieldIds = parse(headerItem.fieldIdsSize, headerItem.fieldIdsOff, FieldIdItem.size, ::FieldIdItem)
methodIds = parse(headerItem.methodIdsSize, headerItem.methodIdsOff, MethodIdItem.size, ::MethodIdItem)
classDefs = parse(headerItem.classDefsSize, headerItem.classDefsOff, ClassDefItem.size, ::ClassDefItem)
}
val inheritedAnnotationTypeIdIndex: Int? by lazy {
var result: Int? = null
typeIds.forEachIndexed { index, typeIdItem ->
if (ParseUtils.parseDescriptor(byteBuffer, typeIdItem, stringIds) == "Ljava/lang/annotation/Inherited;") {
result = index
}
}
result
}
val typeIdToClassDefMap: Map by lazy {
val map = mutableMapOf()
for (classDef in classDefs) {
map[classDef.classIdx] = classDef
}
map.toMap()
}
}