Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 525714a8 authored by Mohamed Heikal's avatar Mohamed Heikal
Browse files

Precalculate the required number of characters for path shortening

It does not make sense for aapt2 to calculate the optimal number of
chars in the shortened path when it only depends on the number of
resources rather than anything apk specific. This cl precalculates the
number of chars and uses if conditions instead.

Test: manual testing + aapt2_tests still passes.
Change-Id: If2dc86952a6b6e01ce02dc42754c037d07d57325
parent 59dc6124
Loading
Loading
Loading
Loading
+6 −10
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@

#include "optimize/ResourcePathShortener.h"

#include <math.h>
#include <unordered_set>

#include "androidfw/StringPiece.h"
@@ -50,18 +49,15 @@ std::string ShortenFileName(const android::StringPiece& file_path, int output_le
}


// Calculate the optimal hash length such that an average of 10% of resources
// collide in their shortened path.
// Return the optimal hash length such that at most 10% of resources collide in
// their shortened path.
// Reference: http://matt.might.net/articles/counting-hash-collisions/
int OptimalShortenedLength(int num_resources) {
  int num_chars = 2;
  double N = 64*64; // hash space when hash is 2 chars long
  double max_collisions = num_resources * 0.1;
  while (num_resources - N + N * pow((N - 1) / N, num_resources) > max_collisions) {
    N *= 64;
    num_chars++;
  if (num_resources > 4000) {
    return 3;
  } else {
    return 2;
  }
  return num_chars;
}

std::string GetShortenedPath(const android::StringPiece& shortened_filename,