aboutsummaryrefslogtreecommitdiff
path: root/src/tools/ak/mindex/mindex.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/ak/mindex/mindex.go')
-rw-r--r--src/tools/ak/mindex/mindex.go108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/tools/ak/mindex/mindex.go b/src/tools/ak/mindex/mindex.go
new file mode 100644
index 0000000..9bdbefa
--- /dev/null
+++ b/src/tools/ak/mindex/mindex.go
@@ -0,0 +1,108 @@
+// Copyright 2018 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// Package mindex writes a minimal dex into a file.
+// It encodes the minimal necessary fields to pass muster with the android runtime.
+package mindex
+
+import (
+ "flag"
+ "io/ioutil"
+ "log"
+ "sync"
+
+ "src/tools/ak/types"
+)
+
+var (
+ // Cmd defines the command to run mindex
+ Cmd = types.Command{
+ Init: Init,
+ Run: Run,
+ Desc: desc,
+ Flags: []string{
+ "out",
+ },
+ }
+
+ // Variables that hold flag values
+ out string
+ initOnce sync.Once
+
+ // see https://android.googlesource.com/platform/art/+/android-5.0.1_r1/runtime/dex_file.h
+
+ minDex = []byte{
+ 0x64, 0x65, 0x78, 0x0A, // 0x00: Dex magic
+ 0x30, 0x33, 0x35, 0x00, // 0x04: Dex version
+ 0x44, 0x0E, 0xC1, 0x0F, // 0x08: Adler32 checksum
+ 0x8B, 0x9B, 0x61, 0xEA, // 0x0C: Sha1 digest
+ 0xC1, 0x7F, 0x94, 0x5A, // 0x10: Sha1 digest cont.
+ 0xE9, 0xC0, 0x8A, 0x70, // 0x14: Sha1 digest cont.
+ 0xFD, 0xED, 0x4F, 0x53, // 0x18: Sha1 digest cont.
+ 0x0F, 0x10, 0x51, 0x75, // 0x1C: Sha1 digest cont.
+
+ // Header
+ 0x8C, 0x00, 0x00, 0x00, // 0x20: Files size
+ 0x70, 0x00, 0x00, 0x00, // 0x24: Header size
+ 0x78, 0x56, 0x34, 0x12, // 0x28: Endian tag
+ 0x00, 0x00, 0x00, 0x00, // 0x2C: Link size
+ 0x00, 0x00, 0x00, 0x00, // 0x30: Link offset
+ 0x70, 0x00, 0x00, 0x00, // 0x34: Map offset
+ 0x00, 0x00, 0x00, 0x00, // 0x38: String ids size
+ 0x00, 0x00, 0x00, 0x00, // 0x3C: String ids offset
+ 0x00, 0x00, 0x00, 0x00, // 0x40: Type ids size
+ 0x00, 0x00, 0x00, 0x00, // 0x44: Type ids offset
+ 0x00, 0x00, 0x00, 0x00, // 0x48: Proto ids size
+ 0x00, 0x00, 0x00, 0x00, // 0x4C: Proto ids offset
+ 0x00, 0x00, 0x00, 0x00, // 0x50: Field ids size
+ 0x00, 0x00, 0x00, 0x00, // 0x54: Field ids offset
+ 0x00, 0x00, 0x00, 0x00, // 0x58: Method ids size
+ 0x00, 0x00, 0x00, 0x00, // 0x5C: Method ids offset
+ 0x00, 0x00, 0x00, 0x00, // 0x60: Class defs size
+ 0x00, 0x00, 0x00, 0x00, // 0x64: Class defs offset
+ 0x1C, 0x00, 0x00, 0x00, // 0x68: Data size
+ 0x70, 0x00, 0x00, 0x00, // 0x6C: Data offset
+
+ // Data
+ 0x02, 0x00, 0x00, 0x00, // 0x70: Map list size (header and map list)
+ 0x00, 0x00, 0x00, 0x00, // 0x74: kDexTypeHeaderItem
+ 0x01, 0x00, 0x00, 0x00, // 0x78: HeaderItem count
+ 0x00, 0x00, 0x00, 0x00, // 0x7C: Offset 0x00
+ 0x00, 0x10, 0x00, 0x00, // 0x80: kDexTypeMapList
+ 0x01, 0x00, 0x00, 0x00, // 0x84: MapList count
+ 0x70, 0x00, 0x00, 0x00, // 0x88: Offset 0x70
+ }
+)
+
+// Init initializes mindex.
+func Init() {
+ initOnce.Do(func() {
+ flag.StringVar(&out, "out", "", "Path to output.")
+ })
+}
+
+func desc() string {
+ return "Mindex writes the smallest possible dex to a file."
+}
+
+// Run is the entry point for mindex.
+func Run() {
+ if out == "" {
+ log.Fatal("Flags -out must be specified.")
+ }
+
+ if err := ioutil.WriteFile(out, minDex, 0655); err != nil {
+ log.Fatalf("Error writing minimal dex %v", err)
+ }
+}