aboutsummaryrefslogtreecommitdiffstats
path: root/jar
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2017-09-12 22:50:46 -0700
committerColin Cross <ccross@android.com>2017-09-20 13:20:45 -0700
commit635acc9446c3a8c88b6599d30312c6399419f2b8 (patch)
treef46d048da7c2ac22272bcfb8f792a3db56997b80 /jar
parent6eebec7414cb5940725c91bc03261c7de838b9e0 (diff)
downloadbuild_soong-635acc9446c3a8c88b6599d30312c6399419f2b8.tar.gz
build_soong-635acc9446c3a8c88b6599d30312c6399419f2b8.tar.bz2
build_soong-635acc9446c3a8c88b6599d30312c6399419f2b8.zip
Rearrange manifest file handling in merge_zips and soong_zip
Jar always puts default MANIFEST.MF files in if none was specified. Copying that behavior in soong_zip causes problems with merge_zips, because it ends up taking the default manifest from the classes.jar instead of the user's manifest from res.jar. We don't want the user's manifest in the classes.jar, otherwise a change to the manifest will cause all the class files to rebuild. Instead, move the manifest insertion to the final merge_zips stage. Test: m -j checkbuild Change-Id: Id6376961dbaf743c2fb92843f9bdf2e44b963be0
Diffstat (limited to 'jar')
-rw-r--r--jar/Android.bp3
-rw-r--r--jar/jar.go63
2 files changed, 66 insertions, 0 deletions
diff --git a/jar/Android.bp b/jar/Android.bp
index 23ad5368..6c2e60e4 100644
--- a/jar/Android.bp
+++ b/jar/Android.bp
@@ -18,5 +18,8 @@ bootstrap_go_package {
srcs: [
"jar.go",
],
+ deps: [
+ "android-archive-zip",
+ ],
}
diff --git a/jar/jar.go b/jar/jar.go
index 5960bf0a..f17bc98d 100644
--- a/jar/jar.go
+++ b/jar/jar.go
@@ -15,8 +15,14 @@
package jar
import (
+ "bytes"
"fmt"
+ "io/ioutil"
+ "os"
"strings"
+ "time"
+
+ "android/soong/third_party/zip"
)
const (
@@ -25,6 +31,10 @@ const (
ModuleInfoClass = "module-info.class"
)
+var DefaultTime = time.Date(2009, 1, 1, 0, 0, 0, 0, time.UTC)
+
+var MetaDirExtra = [2]byte{0xca, 0xfe}
+
// EntryNamesLess tells whether <filepathA> should precede <filepathB> in
// the order of files with a .jar
func EntryNamesLess(filepathA string, filepathB string) (less bool) {
@@ -59,3 +69,56 @@ func index(name string) int {
}
panic(fmt.Errorf("file %q did not match any pattern", name))
}
+
+func MetaDirFileHeader() *zip.FileHeader {
+ dirHeader := &zip.FileHeader{
+ Name: MetaDir,
+ Extra: []byte{MetaDirExtra[1], MetaDirExtra[0], 0, 0},
+ }
+ dirHeader.SetMode(0700 | os.ModeDir)
+ dirHeader.SetModTime(DefaultTime)
+
+ return dirHeader
+}
+
+// Convert manifest source path to zip header and contents. If path is empty uses a default
+// manifest.
+func ManifestFileContents(src string) (*zip.FileHeader, []byte, error) {
+ b, err := manifestContents(src)
+ if err != nil {
+ return nil, nil, err
+ }
+
+ fh := &zip.FileHeader{
+ Name: ManifestFile,
+ Method: zip.Store,
+ UncompressedSize64: uint64(len(b)),
+ }
+
+ return fh, b, nil
+}
+
+// Convert manifest source path to contents. If path is empty uses a default manifest.
+func manifestContents(src string) ([]byte, error) {
+ var givenBytes []byte
+ var err error
+
+ if src != "" {
+ givenBytes, err = ioutil.ReadFile(src)
+ if err != nil {
+ return nil, err
+ }
+ }
+
+ manifestMarker := []byte("Manifest-Version:")
+ header := append(manifestMarker, []byte(" 1.0\nCreated-By: soong_zip\n")...)
+
+ var finalBytes []byte
+ if !bytes.Contains(givenBytes, manifestMarker) {
+ finalBytes = append(append(header, givenBytes...), byte('\n'))
+ } else {
+ finalBytes = givenBytes
+ }
+
+ return finalBytes, nil
+}