create Class Loader Impl - Android java.lang.reflect

Android examples for java.lang.reflect:Class Loader

Description

create Class Loader Impl

Demo Code

/**// w w w  .ja  v  a  2  s.  c  o m
 * Copyright 2011 JogAmp Community. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without modification, are
 * permitted provided that the following conditions are met:
 * 
 *    1. Redistributions of source code must retain the above copyright notice, this list of
 *       conditions and the following disclaimer.
 * 
 *    2. Redistributions in binary form must reproduce the above copyright notice, this list
 *       of conditions and the following disclaimer in the documentation and/or other materials
 *       provided with the distribution.
 * 
 * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * The views and conclusions contained in the software and documentation are those of the
 * authors and should not be interpreted as representing official policies, either expressed
 * or implied, of JogAmp Community.
 */
import java.io.File;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.util.Log;

public class Main{
    private static final String TAG = "JogampClassLoader";
    private static File dexPath = null;
    private static final String PATH_SEP = "/";
    private static final String ELEM_SEP = ":";
    /**
     * 
     * @param ctx
     * @param userPackageNames list of user package names, the last entry shall reflect the Activity
     * @return
     */
    private static synchronized ClassLoader createClassLoaderImpl(
            Context ctx, List<String> userPackageNames,
            boolean addUserLibPath, List<String> apkNames,
            ClassLoader parent) {

        final ApplicationInfo appInfo = ctx.getApplicationInfo();
        final String appDir = new File(appInfo.dataDir).getParent();
        final String libSub = appInfo.nativeLibraryDir
                .substring(appInfo.nativeLibraryDir.lastIndexOf('/') + 1);
        Log.d(TAG, "S: userPackageName: " + userPackageNames + "; appName "
                + appInfo.name + ", appDir " + appDir
                + ", nativeLibraryDir: " + appInfo.nativeLibraryDir
                + "; dataDir: " + appInfo.dataDir + ", libSub " + libSub);

        StringBuilder apks = new StringBuilder();
        StringBuilder libs = new StringBuilder();
        int apkCount = 0;
        String lastUserPackageName = null; // the very last one reflects the Activity

        if (null != userPackageNames) {
            for (Iterator<String> i = userPackageNames.iterator(); i
                    .hasNext();) {
                lastUserPackageName = i.next();
                String userAPK = null;
                try {
                    userAPK = ctx.getPackageManager().getApplicationInfo(
                            lastUserPackageName, 0).sourceDir;
                } catch (PackageManager.NameNotFoundException e) {
                    Log.d(TAG, "error: " + e, e);
                }
                if (null != userAPK) {
                    if (apkCount > 0) {
                        apks.append(ELEM_SEP);
                        if (addUserLibPath) {
                            libs.append(ELEM_SEP);
                        }
                    }
                    apks.append(userAPK);
                    Log.d(TAG, "APK[" + apkCount + "] found: <"
                            + lastUserPackageName + "> -> <" + userAPK
                            + ">");
                    Log.d(TAG,
                            "APK[" + apkCount + "] apks: <"
                                    + apks.toString() + ">");
                    if (addUserLibPath) {
                        libs.append(appDir).append(PATH_SEP)
                                .append(lastUserPackageName)
                                .append(PATH_SEP).append(libSub)
                                .append(PATH_SEP);
                        Log.d(TAG,
                                "APK[" + apkCount + "] libs: <"
                                        + libs.toString() + ">");
                    }
                    apkCount++;
                } else {
                    Log.d(TAG, "APK not found: <" + lastUserPackageName
                            + ">");
                }
            }
            if (userPackageNames.size() != apkCount) {
                Log.d(TAG, "User APKs incomplete, abort (1)");
                return null;
            }
        }
        final int userAPKCount = apkCount;

        if (null != apkNames) {
            for (Iterator<String> i = apkNames.iterator(); i.hasNext();) {
                String userAPK = i.next();
                if (apkCount > 0) {
                    apks.append(ELEM_SEP);
                }
                apks.append(userAPK);
                Log.d(TAG, "APK added: <" + userAPK + ">");
                apkCount++;
            }
            if (apkNames.size() != apkCount - userAPKCount) {
                Log.d(TAG, "Framework APKs incomplete, abort (2)");
                return null;
            }
        }

        // return new TraceDexClassLoader(apks.toString(), dexPath.getAbsolutePath(), libs.toString(), parent);
        return new AssetDexClassLoader(apks.toString(),
                dexPath.getAbsolutePath(), libs.toString(), parent);
    }
}

Related Tutorials