Skip to content

Commit

Permalink
Try to use github.com/klauspost/compress for APKs, should be faster
Browse files Browse the repository at this point in the history
  • Loading branch information
Tasssadar committed Sep 24, 2020
1 parent 64ac289 commit 5683a50
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 2 deletions.
5 changes: 4 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,7 @@ module github.com/avast/apkparser

go 1.10

require github.com/avast/apkverifier v0.0.0-20200416105355-97c5338f32f0
require (
github.com/avast/apkverifier v0.0.0-20200416105355-97c5338f32f0
github.com/klauspost/compress v1.11.0
)
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,5 @@ github.com/avast/apkverifier v0.0.0-20200416104336-6c1a563fa49d h1:AeG4tMRAeMnz3
github.com/avast/apkverifier v0.0.0-20200416104336-6c1a563fa49d/go.mod h1:SV58cyAAN+SzX8GIBhizatMJNGcDyfQUj/xZUlKRW+I=
github.com/avast/apkverifier v0.0.0-20200416105355-97c5338f32f0 h1:Ybldr9XobZ93hnxcx3NQQtiL4he9KdCT3QPO81L7Ubk=
github.com/avast/apkverifier v0.0.0-20200416105355-97c5338f32f0/go.mod h1:HskRSJJJbP3poUkDRAyRAdDVSsh5J1mz8cRc2/B4kbc=
github.com/klauspost/compress v1.11.0 h1:wJbzvpYMVGG9iTI9VxpnNZfd4DzMPoCWze3GgSqz8yg=
github.com/klauspost/compress v1.11.0/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
47 changes: 46 additions & 1 deletion zipreader.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package apkparser

import (
"archive/zip"
"compress/flate"
"encoding/binary"
"errors"
"fmt"
"io"
"os"
"path"
"sync"

"github.com/klauspost/compress/flate"
)

type zipReaderFileSubEntry struct {
Expand Down Expand Up @@ -305,6 +307,11 @@ func tryReadZip(f *readAtWrapper) (r *zip.Reader, err error) {
}

r, err = zip.NewReader(f, size)
if err != nil {
return
}

r.RegisterDecompressor(zip.Deflate, newFlateReader)
return
}

Expand Down Expand Up @@ -350,3 +357,41 @@ func findNextFileHeader(f io.ReadSeeker) (offset int64, err error) {
offset += int64(n)
}
}

var flateReaderPool sync.Pool

func newFlateReader(r io.Reader) io.ReadCloser {
fr, ok := flateReaderPool.Get().(io.ReadCloser)
if ok {
fr.(flate.Resetter).Reset(r, nil)
} else {
fr = flate.NewReader(r)
}
return &pooledFlateReader{fr: fr}
}

type pooledFlateReader struct {
mu sync.Mutex // guards Close and Read
fr io.ReadCloser
}

func (r *pooledFlateReader) Read(p []byte) (n int, err error) {
r.mu.Lock()
defer r.mu.Unlock()
if r.fr == nil {
return 0, errors.New("Read after Close")
}
return r.fr.Read(p)
}

func (r *pooledFlateReader) Close() error {
r.mu.Lock()
defer r.mu.Unlock()
var err error
if r.fr != nil {
err = r.fr.Close()
flateReaderPool.Put(r.fr)
r.fr = nil
}
return err
}

0 comments on commit 5683a50

Please sign in to comment.