WALA/com.ibm.wala.dalvik/src/com/ibm/wala/dalvik/util/AndroidAnalysisScope.java

114 lines
3.6 KiB
Java

/*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html.
*
* This file is a derivative of code released under the terms listed below.
*
*/
package com.ibm.wala.dalvik.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.jar.JarFile;
import com.ibm.wala.classLoader.BinaryDirectoryTreeModule;
import com.ibm.wala.classLoader.JarFileModule;
import com.ibm.wala.dalvik.classLoader.DexFileModule;
import com.ibm.wala.ipa.callgraph.AnalysisScope;
import com.ibm.wala.shrikeCT.InvalidClassFileException;
import com.ibm.wala.types.ClassLoaderReference;
import com.ibm.wala.util.config.AnalysisScopeReader;
import com.ibm.wala.util.config.FileOfClasses;
import com.ibm.wala.util.debug.Assertions;
import com.ibm.wala.util.io.FileProvider;
public class AndroidAnalysisScope {
private static final String BASIC_FILE = "primordial.txt";
public static AnalysisScope setUpAndroidAnalysisScope(URI classpath, String exclusions, ClassLoader loader, URI... androidLib) throws IOException {
AnalysisScope scope;
File exclusionsFile = exclusions != null? new File(exclusions) : null;
if (androidLib == null || androidLib.length == 0) {
scope = AnalysisScopeReader.readJavaScope(BASIC_FILE, exclusionsFile, loader);
} else {
scope = AnalysisScope.createJavaAnalysisScope();
if (exclusionsFile != null) {
try (final InputStream fs = exclusionsFile.exists() ? new FileInputStream(exclusionsFile) : FileProvider.class.getClassLoader().getResourceAsStream(exclusionsFile.getName())) {
scope.setExclusions(new FileOfClasses(fs));
}
}
scope.setLoaderImpl(ClassLoaderReference.Primordial,
"com.ibm.wala.dalvik.classLoader.WDexClassLoaderImpl");
for(URI al : androidLib) {
try {
scope.addToScope(ClassLoaderReference.Primordial, DexFileModule.make(new File(al)));
} catch (Exception e) {
scope.addToScope(ClassLoaderReference.Primordial, new JarFileModule(new JarFile(new File(al))));
}
}
}
scope.setLoaderImpl(ClassLoaderReference.Application,
"com.ibm.wala.dalvik.classLoader.WDexClassLoaderImpl");
scope.addToScope(ClassLoaderReference.Application, DexFileModule.make(new File(classpath)));
return scope;
}
/**
* Handle .apk file.
*
* @param classPath
* @param scope
* @param loader
*/
public static void addClassPathToScope(String classPath,
AnalysisScope scope, ClassLoaderReference loader) {
if (classPath == null) {
throw new IllegalArgumentException("null classPath");
}
try {
String[] paths = classPath.split(File.pathSeparator);
for (String path : paths) {
if (path.endsWith(".jar")
|| path.endsWith(".apk")
|| path.endsWith(".dex")) { // Handle android file.
File f = new File(path);
scope.addToScope(loader, DexFileModule.make(f));
} else {
File f = new File(path);
if (f.isDirectory()) { // handle directory FIXME not working
// for .dex and .apk files into that
// directory
scope.addToScope(loader, new BinaryDirectoryTreeModule(
f));
} else { // handle java class file.
try {
scope.addClassFileToScope(loader, f);
} catch (InvalidClassFileException e) {
throw new IllegalArgumentException(
"Invalid class file", e);
}
}
}
}
} catch (IOException e) {
Assertions.UNREACHABLE(e.toString());
}
}
}