summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabien Sanglard <sanglardf@google.com>2022-08-05 18:50:47 -0700
committerAlan Leung <acleung@google.com>2022-08-09 01:49:04 +0000
commitd263073cccc854aa1b0bfd77ae920e8e4baf24be (patch)
tree058a62245142cbbe815d2583307f90bb84f8fcb9
parent105fab4779798a96923fc12537a394c0b26a9f43 (diff)
downloadbase-d263073cccc854aa1b0bfd77ae920e8e4baf24be.tar.gz
LE: Fix Installer Self checker
Problem: Some emulators return bogus values when calling readlink(2) on "/proc/self/exe". Solution: Use sitelib to get the path to check. Test: TestSites Fixes: 241561956 Change-Id: I4fc76bbdff79960a361e4ebb93ecaa5dd88438fa
-rw-r--r--deploy/deployer/BUILD1
-rw-r--r--deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java5
-rw-r--r--deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java6
-rw-r--r--deploy/installer/self_android.cc13
-rw-r--r--deploy/sites/BUILD5
-rw-r--r--deploy/sites/src/com/android/tools/Function.java39
-rw-r--r--deploy/sites/src/com/android/tools/SitesGenerator.java88
-rw-r--r--deploy/sites/tests/src/java/com/android/tools/TestSites.java16
8 files changed, 140 insertions, 33 deletions
diff --git a/deploy/deployer/BUILD b/deploy/deployer/BUILD
index 1a8448484e..c4d80dd44b 100644
--- a/deploy/deployer/BUILD
+++ b/deploy/deployer/BUILD
@@ -75,6 +75,7 @@ coverage_java_library(
"//tools/base/common:tools.common",
"//tools/base/ddmlib:tools.ddmlib",
"//tools/base/deploy/proto:deploy_java_proto",
+ "//tools/base/deploy/sites:java_sites",
"//tools/base/manifest-parser:tools.manifest-parser",
"//tools/base/tracer:tools.tracer",
"//tools/base/zipflinger",
diff --git a/deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java b/deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java
index 7f027101d2..74bcb9ef1a 100644
--- a/deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java
+++ b/deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java
@@ -36,9 +36,8 @@ import java.util.Stack;
import java.util.concurrent.TimeoutException;
public class AdbInstaller extends Installer {
- public static final String INSTALLER_BINARY_NAME = "installer";
- public static final String INSTALLER_PATH =
- Deployer.INSTALLER_DIRECTORY + "/" + INSTALLER_BINARY_NAME;
+ public static final String INSTALLER_BINARY_NAME = Sites.installerBinary();
+ public static final String INSTALLER_PATH = Sites.installerPath();
public static final String ANDROID_EXECUTABLE_PATH =
"/tools/base/deploy/installer/android-installer";
private final AdbClient adb;
diff --git a/deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java b/deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java
index a0771308ab..033c5a974f 100644
--- a/deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java
+++ b/deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java
@@ -38,9 +38,9 @@ import java.util.function.Predicate;
public class Deployer {
- public static final String BASE_DIRECTORY = "/data/local/tmp/.studio";
- public static final String INSTALLER_DIRECTORY = BASE_DIRECTORY + "/bin";
- public static final String INSTALLER_TMP_DIRECTORY = BASE_DIRECTORY + "/tmp";
+ public static final String BASE_DIRECTORY = Sites.deviceStudioFolder();
+ public static final String INSTALLER_DIRECTORY = Sites.installerExecutableFolder();
+ public static final String INSTALLER_TMP_DIRECTORY = Sites.installerTmpFolder();
private final AdbClient adb;
private final SqlApkFileDatabase dexDb;
diff --git a/deploy/installer/self_android.cc b/deploy/installer/self_android.cc
index 5103d3f6fd..e6ecd25912 100644
--- a/deploy/installer/self_android.cc
+++ b/deploy/installer/self_android.cc
@@ -19,20 +19,19 @@
#include "tools/base/deploy/common/event.h"
#include "tools/base/deploy/common/io.h"
#include "tools/base/deploy/common/log.h"
+#include "tools/base/deploy/sites/sites.h"
#include <unistd.h>
namespace deploy {
-Self::Self() {
- char buffer[BUFSIZ];
- readlink("/proc/self/exe", buffer, BUFSIZ);
- binary_full_path = std::string(buffer);
-}
+Self::Self() { binary_full_path = Sites::InstallerPath(); }
bool Self::gone() {
bool there = IO::access(binary_full_path.c_str(), F_OK) == 0;
- std::string msg = "Self-Checking '" + binary_full_path +
- "' is there = " + std::to_string(there);
+ if (!there) {
+ std::string msg = "Self-Checking '" + binary_full_path + "' NOT FOUND!";
+ WarnEvent(msg.c_str());
+ }
return !there;
}
diff --git a/deploy/sites/BUILD b/deploy/sites/BUILD
index bee4c8936a..e079cc61f8 100644
--- a/deploy/sites/BUILD
+++ b/deploy/sites/BUILD
@@ -25,7 +25,10 @@ java_library(
java_binary(
name = "generator",
- srcs = ["src/com/android/tools/SitesGenerator.java"],
+ srcs = [
+ "src/com/android/tools/Function.java",
+ "src/com/android/tools/SitesGenerator.java",
+ ],
main_class = "com.android.tools.SitesGenerator",
)
diff --git a/deploy/sites/src/com/android/tools/Function.java b/deploy/sites/src/com/android/tools/Function.java
new file mode 100644
index 0000000000..a6189e4e7c
--- /dev/null
+++ b/deploy/sites/src/com/android/tools/Function.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.tools;
+
+public class Function {
+
+ final String name;
+
+ final String code;
+
+ final String javaSignature;
+
+ final String cppSignature;
+
+ public Function(String name, String code) {
+ this(name, code, "", "");
+ }
+
+ public Function(String name, String code, String javaSignature, String cppSignature) {
+ this.name = name;
+ this.code = code;
+ this.javaSignature = javaSignature;
+ this.cppSignature = cppSignature;
+ }
+}
diff --git a/deploy/sites/src/com/android/tools/SitesGenerator.java b/deploy/sites/src/com/android/tools/SitesGenerator.java
index ea7dffb374..99e47ebee9 100644
--- a/deploy/sites/src/com/android/tools/SitesGenerator.java
+++ b/deploy/sites/src/com/android/tools/SitesGenerator.java
@@ -18,7 +18,9 @@ package com.android.tools;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Set;
public class SitesGenerator {
@@ -27,16 +29,64 @@ public class SitesGenerator {
private static final String LOC_C = "loc_c";
private static final String LOC_H = "loc_h";
- private static final String[][] functions = {
- {"AppData", "\"/data/data/\" + pkg + \"/\""},
- {"AppCodeCache", "AppData(pkg) + \"code_cache/\""},
- {"AppStudio", "AppCodeCache(pkg) + \".studio/\""},
- {"AppLog", "AppData(pkg) + \".agent-logs/\""},
- {"AppStartupAgent", "AppCodeCache(pkg) + \"startup_agents/\""},
+ private static final List<Function> functions = new ArrayList<>();
+
+ static {
+ functions.add(
+ new Function(
+ "AppData",
+ "\"/data/data/\" + pkg + \"/\"",
+ "String pkg",
+ "const std::string pkg"));
+ functions.add(
+ new Function(
+ "AppCodeCache",
+ "AppData(pkg) + \"code_cache/\"",
+ "String pkg",
+ "const std::string pkg"));
+ functions.add(
+ new Function(
+ "AppStudio",
+ "AppCodeCache(pkg) + \".studio/\"",
+ "String pkg",
+ "const std::string pkg"));
+ functions.add(
+ new Function(
+ "AppLog",
+ "AppData(pkg) + \".agent-logs/\"",
+ "String pkg",
+ "const std::string pkg"));
+ functions.add(
+ new Function(
+ "AppStartupAgent",
+ "AppCodeCache(pkg) + \"startup_agents/\"",
+ "String pkg",
+ "const std::string pkg"));
// TODO: Change name to AppOverlay (no 's' at the end).
- {"AppOverlays", "AppCodeCache(pkg) + \".overlay/\""},
- {"AppLiveLiteral", "AppCodeCache(pkg) + \".ll/\""}
- };
+ functions.add(
+ new Function(
+ "AppOverlays",
+ "AppCodeCache(pkg) + \".overlay/\"",
+ "String pkg",
+ "const std::string pkg"));
+ functions.add(
+ new Function(
+ "AppLiveLiteral",
+ "AppCodeCache(pkg) + \".ll/\"",
+ "String pkg",
+ "const std::string pkg"));
+
+ functions.add(new Function("DeviceStudioFolder", qString("/data/local/tmp/.studio/")));
+ functions.add(new Function("InstallerExecutableFolder", "DeviceStudioFolder() + \"bin/\""));
+ functions.add(new Function("InstallerTmpFolder", "DeviceStudioFolder() + \"tmp/\""));
+ functions.add(new Function("InstallerBinary", qString("installer")));
+ functions.add(
+ new Function("InstallerPath", "InstallerExecutableFolder() + InstallerBinary()"));
+ }
+
+ private static String qString(String string) {
+ return '"' + string + '"';
+ }
private static void print(String path, String code) throws FileNotFoundException {
try (PrintWriter writer = new PrintWriter(path)) {
@@ -60,10 +110,10 @@ public class SitesGenerator {
code.append("package com.android.tools.deployer;\n");
code.append("public class Sites {\n");
- for (String[] func : functions) {
- code.append("public static String " + func[0] + "(String pkg) {\n");
+ for (Function func : functions) {
+ code.append("public static String " + func.name + "(" + func.javaSignature + ") {\n");
code.append(" return ");
- code.append(func[1]);
+ code.append(func.code);
code.append(";}\n");
}
@@ -71,8 +121,8 @@ public class SitesGenerator {
String src = code.toString();
// Fix function names and callsites
- for (String[] func : functions) {
- String funcName = func[0];
+ for (Function func : functions) {
+ String funcName = func.name;
src = src.replace(funcName + "(", jFunc(funcName) + "(");
}
return src;
@@ -88,8 +138,8 @@ public class SitesGenerator {
code.append("namespace deploy {\n");
code.append("namespace Sites {\n");
- for (String[] func : functions) {
- code.append("std::string " + func[0] + "(const std::string pkg);\n");
+ for (Function func : functions) {
+ code.append("std::string " + func.name + "(" + func.cppSignature + ");\n");
}
code.append("} // namespace Sites\n");
@@ -105,10 +155,10 @@ public class SitesGenerator {
code.append("namespace deploy {\n");
code.append("namespace Sites {\n");
- for (String[] func : functions) {
- code.append("std::string " + func[0] + "(const std::string pkg){\n");
+ for (Function func : functions) {
+ code.append("std::string " + func.name + "(" + func.cppSignature + "){\n");
code.append(" return ");
- code.append(func[1]);
+ code.append(func.code);
code.append(";}\n");
}
diff --git a/deploy/sites/tests/src/java/com/android/tools/TestSites.java b/deploy/sites/tests/src/java/com/android/tools/TestSites.java
index 57596d17b8..d419b29876 100644
--- a/deploy/sites/tests/src/java/com/android/tools/TestSites.java
+++ b/deploy/sites/tests/src/java/com/android/tools/TestSites.java
@@ -17,6 +17,7 @@
package com.android.tools;
import com.android.tools.deployer.Sites;
+import org.junit.Assert;
import org.junit.Test;
public class TestSites {
@@ -31,5 +32,20 @@ public class TestSites {
String startup = Sites.appStartupAgent(pkg);
String overlays = Sites.appOverlays(pkg);
String liveLiteral = Sites.appLiveLiteral(pkg);
+
+ String deviceStudioFolder = Sites.deviceStudioFolder();
+ Assert.assertEquals("/data/local/tmp/.studio/", deviceStudioFolder);
+
+ String installerExecutableFolder = Sites.installerExecutableFolder();
+ Assert.assertEquals("/data/local/tmp/.studio/bin/", installerExecutableFolder);
+
+ String installerTmpFolder = Sites.installerTmpFolder();
+ Assert.assertEquals("/data/local/tmp/.studio/tmp/", installerTmpFolder);
+
+ String installerBinary = Sites.installerBinary();
+ Assert.assertEquals("installer", installerBinary);
+
+ String installerPath = Sites.installerPath();
+ Assert.assertEquals("/data/local/tmp/.studio/bin/installer", installerPath);
}
}