diff options
author | Fabien Sanglard <sanglardf@google.com> | 2022-08-05 18:50:47 -0700 |
---|---|---|
committer | Alan Leung <acleung@google.com> | 2022-08-09 01:49:04 +0000 |
commit | d263073cccc854aa1b0bfd77ae920e8e4baf24be (patch) | |
tree | 058a62245142cbbe815d2583307f90bb84f8fcb9 | |
parent | 105fab4779798a96923fc12537a394c0b26a9f43 (diff) | |
download | base-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/BUILD | 1 | ||||
-rw-r--r-- | deploy/deployer/src/main/java/com/android/tools/deployer/AdbInstaller.java | 5 | ||||
-rw-r--r-- | deploy/deployer/src/main/java/com/android/tools/deployer/Deployer.java | 6 | ||||
-rw-r--r-- | deploy/installer/self_android.cc | 13 | ||||
-rw-r--r-- | deploy/sites/BUILD | 5 | ||||
-rw-r--r-- | deploy/sites/src/com/android/tools/Function.java | 39 | ||||
-rw-r--r-- | deploy/sites/src/com/android/tools/SitesGenerator.java | 88 | ||||
-rw-r--r-- | deploy/sites/tests/src/java/com/android/tools/TestSites.java | 16 |
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); } } |