/*
* Copyright (C) 2014 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.build.gradle.integration.common.utils;
import com.android.annotations.NonNull;
import com.android.annotations.Nullable;
import com.android.ide.common.process.CachedProcessOutputHandler;
import com.android.ide.common.process.DefaultProcessExecutor;
import com.android.ide.common.process.ProcessException;
import com.android.ide.common.process.ProcessExecutor;
import com.android.ide.common.process.ProcessInfo;
import com.android.ide.common.process.ProcessInfoBuilder;
import com.android.utils.StdLogger;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import java.io.File;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Helper to help read/test the content of generated apk file.
*/
public class ApkHelper {
private static final Pattern PATTERN_LOCALES = Pattern.compile(
"^locales\\W*:\\W*(.+)$");
/**
* Runs a process, and returns the output.
*
* @param processInfo the process info to run
*
* @return the output as a list of files.
* @throws ProcessException
*/
@NonNull
public static List<String> runAndGetOutput(@NonNull ProcessInfo processInfo)
throws ProcessException {
ProcessExecutor executor = new DefaultProcessExecutor(
new StdLogger(StdLogger.Level.ERROR));
return runAndGetOutput(processInfo, executor);
}
/**
* Runs a process, and returns the output.
*
* @param processInfo the process info to run
* @param processExecutor the process executor
*
* @return the output as a list of files.
* @throws ProcessException
*/
@NonNull
public static List<String> runAndGetOutput(
@NonNull ProcessInfo processInfo,
@NonNull ProcessExecutor processExecutor)
throws ProcessException {
CachedProcessOutputHandler handler = new CachedProcessOutputHandler();
processExecutor.execute(processInfo, handler).rethrowFailure().assertNormalExitValue();
return Splitter.on('\n').splitToList(handler.getProcessOutput().getStandardOutputAsString());
}
@NonNull
public static List<String> getApkBadging(@NonNull File apk) throws ProcessException {
File aapt = SdkHelper.getAapt();
ProcessInfoBuilder builder = new ProcessInfoBuilder();
builder.setExecutable(aapt);
builder.addArgs("dump", "badging", apk.getPath());
return ApkHelper.runAndGetOutput(builder.createProcess());
}
/**
* Returns the locales of an apk as found in the badging information
* @param apk the apk
* @return the list of locales or null.
* @throws ProcessException
*
* @see #getApkBadging(File)
*/
@Nullable
public static List<String> getLocales(@NonNull File apk) throws ProcessException {
List<String> output = getApkBadging(apk);
for (String line : output) {
Matcher m = PATTERN_LOCALES.matcher(line.trim());
if (m.matches()) {
List<String> list = Splitter.on(' ').splitToList(m.group(1).trim());
List<String> result = Lists.newArrayListWithCapacity(list.size());
for (String local: list) {
// remove the '' on each side.
result.add(local.substring(1, local.length() - 1));
}
return result;
}
}
return null;
}
}