Android 源码中ZygoteInit 调用ActivityThread main 函数 实例

本文讲通过java main函数调用 其它main函数执行 (当然也可以调用其它函数) ;android 部分源码

被调用的 java main函数

package main;

public class Main {

public static void main(String[] args) {

System.out.println(args[0]);

}

}

 

调用Java main函数的类

package main;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class TestMain {
    public static void main(String[] args) {
        TestMain testMain = new TestMain();

        Runnable runnable = findStaticMain("main.Main", new String[] { "testtest" }, testMain.getClass().getClassLoader());
        runnable.run();
    }

    /**
     * Invokes a static "main(argv[]) method on class "className". Converts various
     * failing exceptions into RuntimeExceptions, with the assumption that they will
     * then cause the VM instance to exit.
     *
     * @param className
     *            Fully-qualified class name
     * @param argv
     *            Argument vector for main()
     * @param classLoader
     *            the classLoader to load {@className} with
     */
    protected static Runnable findStaticMain(String className, String[] argv, ClassLoader classLoader) {
        Class<?> cl;

        try {
            cl = Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException("Missing class when invoking static main " + className, ex);
        }

        Method m;
        try {
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException("Missing static main on " + className, ex);
        } catch (SecurityException ex) {
            throw new RuntimeException("Problem getting static main on " + className, ex);
        }

        int modifiers = m.getModifiers();
        if (!(Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers))) {
            throw new RuntimeException("Main method is not public and static on " + className);
        }

        /*
         * This throw gets caught in ZygoteInit.main(), which responds by invoking the
         * exception's run() method. This arrangement clears up all the stack frames
         * that were required in setting up the process.
         */
        return new MethodAndArgsCaller(m, argv);
    }
}
 

利用反射调用main函数

package main;

 

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

 

/**

 * Helper class which holds a method and arguments and can call them. This is

 * used as part of a trampoline to get rid of the initial process setup stack

 * frames.

 */

public class MethodAndArgsCaller implements Runnable {

/** method to call */

private final Method mMethod;

 

/** argument array */

private final String[] mArgs;

 

public MethodAndArgsCaller(Method method, String[] args) {

mMethod = method;

mArgs = args;

}

 

public void run() {

try {

mMethod.invoke(null, new Object[] { mArgs });

} catch (IllegalAccessException ex) {

throw new RuntimeException(ex);

} catch (InvocationTargetException ex) {

Throwable cause = ex.getCause();

if (cause instanceof RuntimeException) {

throw (RuntimeException) cause;

} else if (cause instanceof Error) {

throw (Error) cause;

}

throw new RuntimeException(ex);

}

}

}

这个报错是什么原因 08-25 13:55:17.847685 10355 10355 E AndroidRuntime: FATAL EXCEPTION: main Process: com.android.systemui:tuner, PID: 10355 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.android.systemui/com.android.systemui.tuner.TunerActivity}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.systemui.tuner.TunerFragment: could not find Fragment constructor at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4624) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4821) at android.app.ActivityThread.handleRelaunchActivityInner(ActivityThread.java:7159) at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:7010) at android.app.servertransaction.ActivityRelaunchItem.execute(ActivityRelaunchItem.java:106) at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:63) at android.app.servertransaction.TransactionExecutor.executeNonLifecycleItem(TransactionExecutor.java:138) at android.app.servertransaction.TransactionExecutor.executeTransactionItems(TransactionExecutor.java:108) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:85) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:3110) at android.os.Handler.dispatchMessage(Handler.java:115) at android.os.Looper.loopOnce(Looper.java:298) at android.os.Looper.loop(Looper.java:408) at android.app.ActivityThread.main(ActivityThread.java:9952) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:613) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1074) Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.android.systemui.tuner.TunerFragment: could not find Fragment constructor at android.app.Fragment.instantiate(Fragment.java:567) at android.app.FragmentContainer.instantiate(FragmentContainer.java:53) at android.app.FragmentState.instantiate(FragmentState.java:77) at android.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:2867) at android.app.FragmentController.restoreAllState(FragmentController.java:143) at android.app.Activity.onCreate(Activity.java:1924) at com.android.systemui.tuner.TunerActivity.onCreate(go/retraceme aff8b06f686a392573423f635cd3b1b8cadac5d31fb1f98ab46c18e784738f44:1) at android.app.Activity.performCreate(Activity.java:9391) at android.app.Activity.performCreate(Activity.java:9363) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1541) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4598) ... 16 more Caused by: java.lang.NoSuchMethodException: com.android.systemui.tuner.TunerFragment.<init> [] at java.lang.Class.getConstructor0(Class.java:3385) at java.lang.Class.getConstructor(Class.java:2477) at android.app.Fragment.instantiate(Fragment.java:548) ... 26 more
最新发布
08-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值