diff options
author | Colin Cross <ccross@android.com> | 2017-09-12 22:50:46 -0700 |
---|---|---|
committer | Colin Cross <ccross@android.com> | 2017-09-20 13:20:45 -0700 |
commit | 635acc9446c3a8c88b6599d30312c6399419f2b8 (patch) | |
tree | f46d048da7c2ac22272bcfb8f792a3db56997b80 /jar | |
parent | 6eebec7414cb5940725c91bc03261c7de838b9e0 (diff) | |
download | build_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.bp | 3 | ||||
-rw-r--r-- | jar/jar.go | 63 |
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", + ], } @@ -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 +} |