Bug 1798617 - GeckoAppShell.isTablet returns correct value. r=geckoview-reviewers,owlish

Since `GeckoLoader.getLoadDiagnostics` is never called, `HardwareUtils` isn't
initialized. It means that `GeckoAppShell.isTablet` always return false.

So `HardwareUtils` should be initialized.

Also, a lot of codes in `HardwareUtils` and `GeckoLoader.getLoadDiagnostics`
are unused, so let's clean up.

Differential Revision: https://phabricator.services.mozilla.com/D161006
This commit is contained in:
Makoto Kato 2022-11-15 07:41:52 +00:00
Родитель df8c460a6b
Коммит a83c653bc8
3 изменённых файлов: 6 добавлений и 124 удалений

Просмотреть файл

@ -1213,7 +1213,7 @@ public class GeckoAppShell {
@WrapForJNI(calledFrom = "gecko")
@RobocopTarget
public static boolean isTablet() {
return HardwareUtils.isTablet();
return HardwareUtils.isTablet(getApplicationContext());
}
@WrapForJNI(calledFrom = "gecko")

Просмотреть файл

@ -21,7 +21,6 @@ import java.util.zip.ZipFile;
import org.mozilla.gecko.GeckoAppShell;
import org.mozilla.gecko.annotation.JNITarget;
import org.mozilla.gecko.annotation.RobocopTarget;
import org.mozilla.gecko.util.HardwareUtils;
public final class GeckoLoader {
private static final String LOGTAG = "GeckoLoader";
@ -350,55 +349,6 @@ public final class GeckoLoader {
}
}
private static String getLoadDiagnostics(final Context context, final String lib) {
final String androidPackageName = context.getPackageName();
final StringBuilder message = new StringBuilder("LOAD ");
message.append(lib);
final String packageDataDir = context.getApplicationInfo().dataDir;
// These might differ. If so, we know why the library won't load!
HardwareUtils.init(context);
message.append(": ABI: " + HardwareUtils.getLibrariesABI() + ", " + getCPUABI());
message.append(": Data: " + packageDataDir);
try {
final boolean appLibExists =
new File("/data/app-lib/" + androidPackageName + "/lib" + lib + ".so").exists();
final boolean dataDataExists = new File(packageDataDir + "/lib/lib" + lib + ".so").exists();
message.append(", ax=" + appLibExists);
message.append(", ddx=" + dataDataExists);
} catch (final Throwable e) {
message.append(": ax/ddx fail, ");
}
try {
final String dashOne = packageDataDir + "-1";
final String dashTwo = packageDataDir + "-2";
final boolean dashOneExists = new File(dashOne).exists();
final boolean dashTwoExists = new File(dashTwo).exists();
message.append(", -1x=" + dashOneExists);
message.append(", -2x=" + dashTwoExists);
} catch (final Throwable e) {
message.append(", dash fail, ");
}
try {
final String nativeLibPath = context.getApplicationInfo().nativeLibraryDir;
final boolean nativeLibDirExists = new File(nativeLibPath).exists();
final boolean nativeLibLibExists = new File(nativeLibPath + "/lib" + lib + ".so").exists();
message.append(", nativeLib: " + nativeLibPath);
message.append(", dirx=" + nativeLibDirExists);
message.append(", libx=" + nativeLibLibExists);
} catch (final Throwable e) {
message.append(", nativeLib fail.");
}
return message.toString();
}
private static boolean attemptLoad(final String path) {
try {
System.load(path);

Просмотреть файл

@ -7,11 +7,6 @@ package org.mozilla.gecko.util;
import android.content.Context;
import android.content.res.Configuration;
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public final class HardwareUtils {
private static final String LOGTAG = "GeckoHardwareUtils";
@ -22,12 +17,9 @@ public final class HardwareUtils {
private static volatile boolean sIsLargeTablet;
private static volatile boolean sIsSmallTablet;
private static volatile File sLibDir;
private static volatile int sMachineType = -1;
private HardwareUtils() {}
public static void init(final Context context) {
public static synchronized void init(final Context context) {
if (sInited) {
return;
}
@ -42,73 +34,13 @@ public final class HardwareUtils {
sIsSmallTablet = true;
}
sLibDir = new File(context.getApplicationInfo().nativeLibraryDir);
sInited = true;
}
public static boolean isTablet() {
public static boolean isTablet(final Context context) {
if (!sInited) {
init(context);
}
return sIsLargeTablet || sIsSmallTablet;
}
private static final int ELF_MACHINE_UNKNOWN = 0;
private static final int ELF_MACHINE_X86 = 0x03;
private static final int ELF_MACHINE_X86_64 = 0x3e;
private static final int ELF_MACHINE_ARM = 0x28;
private static final int ELF_MACHINE_AARCH64 = 0xb7;
private static int readElfMachineType(final File file) {
try (final FileInputStream is = new FileInputStream(file)) {
final byte[] buf = new byte[19];
int count = 0;
while (count != buf.length) {
count += is.read(buf, count, buf.length - count);
}
int machineType = buf[18];
if (machineType < 0) {
machineType += 256;
}
return machineType;
} catch (final FileNotFoundException e) {
Log.w(LOGTAG, String.format("Failed to open %s", file.getAbsolutePath()));
return ELF_MACHINE_UNKNOWN;
} catch (final IOException e) {
Log.w(LOGTAG, "Failed to read library", e);
return ELF_MACHINE_UNKNOWN;
}
}
private static String machineTypeToString(final int machineType) {
switch (machineType) {
case ELF_MACHINE_X86:
return "x86";
case ELF_MACHINE_X86_64:
return "x86_64";
case ELF_MACHINE_ARM:
return "arm";
case ELF_MACHINE_AARCH64:
return "aarch64";
case ELF_MACHINE_UNKNOWN:
default:
return String.format("unknown (0x%x)", machineType);
}
}
private static void initMachineType() {
if (sMachineType >= 0) {
return;
}
sMachineType = readElfMachineType(new File(sLibDir, System.mapLibraryName("mozglue")));
}
/**
* @return The ABI of the libraries installed for this app.
*/
public static String getLibrariesABI() {
initMachineType();
return machineTypeToString(sMachineType);
}
}