diff options
Diffstat (limited to 'test/554-jit-profile-file/src/Main.java')
-rw-r--r-- | test/554-jit-profile-file/src/Main.java | 136 |
1 files changed, 136 insertions, 0 deletions
diff --git a/test/554-jit-profile-file/src/Main.java b/test/554-jit-profile-file/src/Main.java new file mode 100644 index 0000000000..ba613ae569 --- /dev/null +++ b/test/554-jit-profile-file/src/Main.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2015 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. + */ + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.util.HashMap; + +public class Main { + + public void coldMethod() { + hotMethod(); + } + + public String hotMethod() { + HashMap<String, String> map = new HashMap<String, String>(); + for (int i = 0; i < 10; i++) { + map.put("" + i, "" + i + 1); + } + return map.get("1"); + } + + private static final String PKG_NAME = "test.package"; + private static final String PROFILE_FILE = PKG_NAME + ".prof"; + private static final String TEMP_FILE_NAME_PREFIX = "dummy"; + private static final String TEMP_FILE_NAME_SUFFIX = ".file"; + private static final int JIT_INVOCATION_COUNT = 101; + + /* needs to match Runtime:: kProfileBackground */ + private static final int PROFILE_BACKGROUND = 1; + + public static void main(String[] args) throws Exception { + System.loadLibrary(args[0]); + + File file = null; + File profileDir = null; + File profileFile = null; + try { + // We don't know where we have rights to create the code_cache. So create + // a dummy temporary file and get its parent directory. That will serve as + // the app directory. + file = createTempFile(); + String appDir = file.getParent(); + profileDir = new File(appDir, "code_cache"); + profileDir.mkdir(); + + // Registering the app info will set the profile file name. + VMRuntime.registerAppInfo(PKG_NAME, appDir); + + // Make sure the hot methods are jitted. + Main m = new Main(); + OtherDex o = new OtherDex(); + for (int i = 0; i < JIT_INVOCATION_COUNT; i++) { + m.hotMethod(); + o.hotMethod(); + } + + // Updating the process state to BACKGROUND will trigger profile saving. + VMRuntime.updateProcessState(PROFILE_BACKGROUND); + + // Check that the profile file exists. + profileFile = new File(profileDir, PROFILE_FILE); + if (!profileFile.exists()) { + throw new RuntimeException("No profile file found"); + } + // Dump the profile file. + // We know what methods are hot and we compare with the golden `expected` output. + System.out.println(getProfileInfoDump(profileFile.getPath(), m.getClass(), o.getClass())); + } finally { + if (file != null) { + file.delete(); + } + if (profileFile != null) { + profileFile.delete(); + } + if (profileDir != null) { + profileDir.delete(); + } + } + } + + private static class VMRuntime { + private static final Method registerAppInfoMethod; + private static final Method updateProcessStateMethod; + private static final Method getRuntimeMethod; + static { + try { + Class c = Class.forName("dalvik.system.VMRuntime"); + registerAppInfoMethod = c.getDeclaredMethod("registerAppInfo", + String.class, String.class, String.class); + updateProcessStateMethod = c.getDeclaredMethod("updateProcessState", Integer.TYPE); + getRuntimeMethod = c.getDeclaredMethod("getRuntime"); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void registerAppInfo(String pkgName, String appDir) throws Exception { + registerAppInfoMethod.invoke(null, pkgName, appDir, null); + } + public static void updateProcessState(int state) throws Exception { + Object runtime = getRuntimeMethod.invoke(null); + updateProcessStateMethod.invoke(runtime, state); + } + } + + static native String getProfileInfoDump( + String filename, Class<?> clsFromPrimary, Class<?> clsFromSecondary); + + private static File createTempFile() throws Exception { + try { + return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); + } catch (IOException e) { + System.setProperty("java.io.tmpdir", "/data/local/tmp"); + try { + return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); + } catch (IOException e2) { + System.setProperty("java.io.tmpdir", "/sdcard"); + return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX); + } + } + } +} |