diff --git a/app/src/main/java/org/fdroid/fdroid/data/App.java b/app/src/main/java/org/fdroid/fdroid/data/App.java index dda0ae0ba..0dbe7af02 100644 --- a/app/src/main/java/org/fdroid/fdroid/data/App.java +++ b/app/src/main/java/org/fdroid/fdroid/data/App.java @@ -21,8 +21,12 @@ import java.io.InputStream; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; import java.util.Date; +import java.util.Enumeration; +import java.util.HashSet; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class App extends ValueObject implements Comparable { @@ -113,7 +117,8 @@ public class App extends ValueObject implements Comparable { return name.compareToIgnoreCase(app.name); } - public App() { } + public App() { + } public App(Cursor cursor) { @@ -274,20 +279,33 @@ public class App extends ValueObject implements Comparable { this.name = (String) appInfo.loadLabel(pm); - final SanitizedFile apkFile = SanitizedFile.knownSanitized(appInfo.publicSourceDir); final Apk apk = new Apk(); apk.versionName = packageInfo.versionName; apk.versionCode = packageInfo.versionCode; - apk.hashType = "sha256"; - apk.hash = Utils.getBinaryHash(apkFile, apk.hashType); apk.added = this.added; apk.minSdkVersion = Utils.getMinSdkVersion(context, packageName); apk.maxSdkVersion = Utils.getMaxSdkVersion(context, packageName); apk.packageName = this.packageName; - apk.installedFile = apkFile; apk.permissions = Utils.CommaSeparatedList.make(packageInfo.requestedPermissions); apk.apkName = apk.packageName + "_" + apk.versionCode + ".apk"; + final SanitizedFile apkFile = SanitizedFile.knownSanitized(appInfo.publicSourceDir); + apk.hashType = "sha256"; + apk.hash = Utils.getBinaryHash(apkFile, apk.hashType); + apk.installedFile = apkFile; + + JarFile jarFile = new JarFile(apkFile); + HashSet abis = new HashSet<>(3); + Pattern pattern = Pattern.compile("^lib/([a-z0-9-]+)/.*"); + for (Enumeration jarEntries = jarFile.entries(); jarEntries.hasMoreElements();) { + JarEntry jarEntry = jarEntries.nextElement(); + Matcher matcher = pattern.matcher(jarEntry.getName()); + if (matcher.matches()) { + abis.add(matcher.group(1)); + } + } + apk.nativecode = Utils.CommaSeparatedList.make(abis.toArray(new String[abis.size()])); + final FeatureInfo[] features = packageInfo.reqFeatures; if (features != null && features.length > 0) { final String[] featureNames = new String[features.length]; diff --git a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java index faccfd992..c8d9920ec 100644 --- a/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java +++ b/app/src/main/java/org/fdroid/fdroid/localrepo/LocalRepoManager.java @@ -456,6 +456,7 @@ public final class LocalRepoManager { tag("added", app.installedApk.added); tagFeatures(app); tagPermissions(app); + tagNativecode(app); serializer.endTag("", "package"); } @@ -485,6 +486,14 @@ public final class LocalRepoManager { serializer.endTag("", "features"); } + private void tagNativecode(App app) throws IOException { + if (app.installedApk.nativecode != null) { + serializer.startTag("", "nativecode"); + serializer.text(Utils.CommaSeparatedList.str(app.installedApk.nativecode)); + serializer.endTag("", "nativecode"); + } + } + private void tagHash(App app) throws IOException { serializer.startTag("", "hash"); serializer.attribute("", "type", app.installedApk.hashType);