Android 中 RuntimeException("Stub!") 的含义

Posted

技术标签:

【中文标题】Android 中 RuntimeException("Stub!") 的含义【英文标题】:meaning of RuntimeException("Stub!") in Android 【发布时间】:2017-02-16 05:40:35 【问题描述】:

我正在浏览 android 代码,因为我想看看 Activity.finish() 方法中有什么。

我只是想确认在Activity.finish() 中会调用onDestroy() 方法。

但我在这种方法(以及许多其他方法)中发现的是:

public void finish() 
    throw new RuntimeException("Stub!");

那么我在哪里可以找到真正破坏 Activity 的代码? 谢谢!

【问题讨论】:

SQLiteDatabase getWritableDatabase() throw new RuntimeException("Stub!"); 的可能重复 【参考方案1】:

这是因为 SDK 中没有找到源代码。 要查看源代码,您需要下载 Android SDK 的源代码,以便 Android Studio 可以显示相应的代码。

【讨论】:

这是对的,但请注意,它不会下载任何 Native 类 很奇怪,因为我在 SDK Manager>Appearance & Behavior>System Settings >Android SDK >SDK Platforms > Android 7.0 (Nougat)> Sources for Android 24 (INSTALLED)... 但是当我访问编辑器上部的 Activity 类有此消息:找不到“Android API 24 平台”的源。我点击下载,但没有任何反应! :-O @AlexMawashi 请根据我的经验重新启动您的 android studio,有时它会在 AS 重新启动后工作 没什么。它报告:“反编译的 .class 文件,字节码版本:52.0 (Java 8)”和“找不到‘Android API 24 平台’的源代码”。打开的文件Activity在这个路径:C:/Users/alessandro.argentier/AppData/Local/Android/sdk/platforms/android-24/android.jar!/android/app/Activity.class @AlexMawashi 您需要将您的 Java SDK 更新到 java 8,或者您使用目标 sdk 23,然后下载 Android SDK API 级别 23 的源代码【参考方案2】:

我不知道你在哪里看的,但是finish() 的代码是这样的

/**
 * Call this when your activity is done and should be closed.  The
 * ActivityResult is propagated back to whoever launched you via
 * onActivityResult().
 */
public void finish() 
    finish(DONT_FINISH_TASK_WITH_ACTIVITY);

调用私有实现

/**
 * Finishes the current activity and specifies whether to remove the task associated with this
 * activity.
 */
private void finish(int finishTask) 
    if (mParent == null) 
        int resultCode;
        Intent resultData;
        synchronized (this) 
            resultCode = mResultCode;
            resultData = mResultData;
        
        if (false) Log.v(TAG, "Finishing self: token=" + mToken);
        try 
            if (resultData != null) 
                resultData.prepareToLeaveProcess(this);
            
            if (ActivityManagerNative.getDefault()
                    .finishActivity(mToken, resultCode, resultData, finishTask)) 
                mFinished = true;
            
         catch (RemoteException e) 
            // Empty
        
     else 
        mParent.finishFromChild(this);
    

这里很重要的是ActivityManagerNative.getDefault().finishActivity,你可以在这个文件https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/app/ActivityManagerNative.java的第3359行找到它

如果你想潜得更深,你可以跟着小路走。

【讨论】:

【参考方案3】:

您正在签入 .class 而不是 .java 文件。

【讨论】:

类文件不包含public void finish() throw new RuntimeException("Stub!"); 之类的源代码吗?? 检查Activity.class,有:protected void onDestroy() throw new RuntimeException("Stub!"); 我的意思是 .class 文件根本不包含源代码。它们包含已编译的字节码。如果 OP 是查看 .class 文件的反编译,那么它必须在某处反映 .java 文件中的源代码,对吗?在这种情况下,问题是为什么 .java 文件包含这个存根代码。

以上是关于Android 中 RuntimeException("Stub!") 的含义的主要内容,如果未能解决你的问题,请参考以下文章

封装异常处理之坑

添加 ImageView 时应用程序崩溃?

Java 异常浅谈

201621123026《JAVA程序设计》第十周学习总结

java.lang.RuntimeException:无法启动“jarsigner”进程,请将其添加到 PATH

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )