DexFilepublic final class DexFile extends Object Manipulates DEX files. The class is similar in principle to
{@link java.util.zip.ZipFile}. It is used primarily by class loaders.
Note we don't directly open and read the DEX file here. They're memory-mapped
read-only by the VM. |
Fields Summary |
---|
private final int | mCookie | private String | mFileName |
Constructors Summary |
---|
public DexFile(File file)Opens a DEX file from a given File object. This will usually be a ZIP/JAR
file with a "classes.dex" inside. The method should not be used for files
inside the Dalvik cache.
this(file.getPath());
| public DexFile(String fileName)Opens a DEX file from a given filename. This will usually be a ZIP/JAR
file with a "classes.dex" inside. The method should not be used for files
inside the Dalvik cache.
String wantDex = System.getProperty("android.vm.dexfile", "false");
if (!wantDex.equals("true"))
throw new UnsupportedOperationException("No dex in this VM");
mCookie = openDexFile(fileName, null, 0);
mFileName = fileName;
//System.out.println("DEX FILE cookie is " + mCookie);
| private DexFile(String sourceName, String outputName, int flags)Opens a DEX file from a given filename, using a specified file
to hold the optimized data.
String wantDex = System.getProperty("android.vm.dexfile", "false");
if (!wantDex.equals("true"))
throw new UnsupportedOperationException("No dex in this VM");
mCookie = openDexFile(sourceName, outputName, flags);
mFileName = sourceName;
//System.out.println("DEX FILE cookie is " + mCookie);
|
Methods Summary |
---|
public void | close()Closes the DEX file.
This may not be able to release any resources. If classes have been
loaded, the underlying storage can't be discarded.
closeDexFile(mCookie);
| private static native void | closeDexFile(int cookie)
| private static native java.lang.Class | defineClass(java.lang.String name, java.lang.ClassLoader loader, int cookie, java.security.ProtectionDomain pd)
| public java.util.Enumeration | entries()Enumerate the names of the classes in this DEX file.
return new DFEnum(this);
| protected void | finalize()Called when the class is finalized. Makes sure the DEX file is closed.
close();
| private static native java.lang.String[] | getClassNameList(int cookie)
| public java.lang.String | getName()Gets the name of the (already opened) DEX file.
return mFileName;
| public static native boolean | isDexOptNeeded(java.lang.String fileName)Returns true if the VM believes that the apk/jar file is out of date
and should be passed through "dexopt" again.
| public java.lang.Class | loadClass(java.lang.String name, java.lang.ClassLoader loader)Loads a class. Returns the class on success, or a {@code null} reference
on failure.
If you are not calling this from a class loader, this is most likely not
going to do what you want. Use {@link Class#forName(String)} instead.
The method does not throw {@link ClassNotFoundException} if the class
isn't found because it isn't feasible to throw exceptions wildly every
time a class is not found in the first DEX file we look at. It will
throw exceptions for other failures, though.
return defineClass(name, loader, mCookie,
null);
//new ProtectionDomain(name) /*DEBUG ONLY*/);
| public static dalvik.system.DexFile | loadDex(java.lang.String sourcePathName, java.lang.String outputPathName, int flags)Open a DEX file, specifying the file in which the optimized DEX
data should be written. If the optimized form exists and appears
to be current, it will be used; if not, the VM will attempt to
regenerate it.
This is intended for use by applications that wish to download
and execute DEX files outside the usual application installation
mechanism. This function should not be called directly by an
application; instead, use a class loader such as
dalvik.system.DexClassLoader.
/*
* TODO: we may want to cache previously-opened DexFile objects.
* The cache would be synchronized with close(). This would help
* us avoid mapping the same DEX more than once when an app
* decided to open it multiple times. In practice this may not
* be a real issue.
*/
return new DexFile(sourcePathName, outputPathName, flags);
| private static native int | openDexFile(java.lang.String sourceName, java.lang.String outputName, int flags)
|
|