Bootstrap

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

堆栈打印跟踪Activity的启动过程(基于Android10.0.0-r41),framework修改,去除第三方app的倒计时页面

1.打印异常堆栈

,查看Activity的onCreate如何回调的

        Log.i(TAG, "onCreate: ", new Exception());

在这里插入图片描述

编译

在这里插入图片描述

logcat -c清除日志缓存

logcat -s qfh过滤tag

在这里插入图片描述

在这里插入图片描述

跟踪堆栈调试发现,onCreate的回调大致从这里开始

在这里插入图片描述

走到这

在这里插入图片描述

往下走

在这里插入图片描述

那系统又是怎么调用handleLaunchActivity的?

系统Handler发消息以及处理消息

在这里插入图片描述

执行

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

从这里就能看出系统调用handleLaunchActivity的过程

2.去除第三方app的倒计时页面

查看位于最上层的activity,想办法去掉这个倒计时页面直接进入主页面

在这里插入图片描述

adb shell dumpsys activity activities | grep “Resumed”

查看最顶层

在这里插入图片描述

framework中修改,一般都是lanucher界面启动我们的第三方app

@Override
    public void startActivity(Intent intent, @Nullable Bundle options) {
        //qfh add
        ComponentName originCom = new ComponentName("com.example.myapplication2", "com.example.myapplication.WelcomeActivity");
        ComponentName targetCom = new ComponentName("com.example.myapplication2", "com.example.myapplication.MainActivity");
        if (intent.getComponent() != null && intent.getComponent().equals(originCom)) {
            intent.setComponent(targetCom);
        }
        //qfh end
        if (options != null) {
            startActivityForResult(intent, -1, options);
        } else {
            // Note we want to go through this call for compatibility with
            // applications that may have overridden the method.
            startActivityForResult(intent, -1);
        }
    }

在这里插入图片描述

这样就可以拦截我们想要拦截的Activity了

进到倒计时的下一个页面

在这里插入图片描述

3.模拟点击事件跳过首页进入主页

自定义一个方法处理点击按钮事件

@CallSuper
    protected void onResume() {
        if (DEBUG_LIFECYCLE) Slog.v(TAG, "onResume " + this);
        dispatchActivityResumed();
        mActivityTransitionState.onResume(this);
        enableAutofillCompatibilityIfNeeded();
        if (mAutoFillResetNeeded) {
            if (!mAutoFillIgnoreFirstResumePause) {
                View focus = getCurrentFocus();
                if (focus != null && focus.canNotifyAutofillEnterExitEvent()) {
                    // TODO: in Activity killed/recreated case, i.e. SessionLifecycleTest#
                    // testDatasetVisibleWhileAutofilledAppIsLifecycled: the View's initial
                    // window visibility after recreation is INVISIBLE in onResume() and next frame
                    // ViewRootImpl.performTraversals() changes window visibility to VISIBLE.
                    // So we cannot call View.notifyEnterOrExited() which will do nothing
                    // when View.isVisibleToUser() is false.
                    getAutofillManager().notifyViewEntered(focus);
                }
            }
        }

        notifyContentCaptureManagerIfNeeded(CONTENT_CAPTURE_RESUME);

        mCalled = true;
        //qfh add
        ComponentName originCom = new ComponentName("com.example.myapplication2", "com.example.myapplication.TestWelcomeActivity");
        if (originCom.equals(getComponentName())){
            Log.i(TAG, "originCom.equals(getComponentName()) == true");
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    injectClick(420,52);
                }
            }, 1000);
        }
        //qfh end
    }

在这里插入图片描述

//qfh add 
    //处理跳过按钮的坐标,模拟点击跳过广告页按钮
    private void injectClick(int x, int y) {
        MotionEvent downAction = MotionEvent.obtain(android.os.SystemClock.uptimeMillis(),
                android.os.SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x, y, 0);
                dispatchTouchEvent(downAction);
        MotionEvent upAction = MotionEvent.obtain(android.os.SystemClock.uptimeMillis(),
                android.os.SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.i(TAG, "injectClick");
                dispatchTouchEvent(upAction);
            }
        },100);
    }
    //qfh end

注入一个点击事件

在这里插入图片描述

这样模拟点击事件跳过也可以的

;