Android中Module之間介面呼叫發現不了繼承關係

weixin_33912445發表於2018-08-05

最近發現一個奇怪的問題,特此記錄一下,為了場景重現我寫了一個比較簡單Demo:
有兩個Module,並且都只有一個類
Module1:

public class ModuleOneEntrance {
    public ModuleOneEntrance() {
    }

    public static void init(FragmentActivity fragmentActivity) {
        ModuleTwoEntrance.init(fragmentActivity);
        System.out.print("module one init");
    }
}

Module2:

public class ModuleTwoEntrance {
    public ModuleTwoEntrance() {
    }

    public static void init(Activity activity) {
        System.out.print("module two init from " + activity.getComponentName());
    }
}

可以看出來Module1依賴於Module2的init,但是引數物件是繼承關係,按照道理說這樣寫應該沒有什麼問題,但是在模組之間這樣寫就會出現方法簽名找不到. 我們繼續來看看主工程的呼叫


8298629-0596f29722352006.png
image.png

8298629-20d9fc2ac3d84f11.png
image.png
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ModuleOneEntrance.init(this);
    }
}

主工程很簡單,直接就是ModuleOneEntrance.init(this),接下來執行就會報

08-05 11:37:48.711 8357-8357/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: com.example.huangli.moduledepdemo3, PID: 8357
                                                 java.lang.NoSuchMethodError: No static method init(Landroid/support/v4/app/FragmentActivity;)V in class Lcom/example/module2/ModuleTwoEntrance; or its super classes (declaration of 'com.example.module2.ModuleTwoEntrance' appears in /data/app/com.example.huangli.moduledepdemo3-1/split_lib_dependencies_apk.apk)
                                                     at com.example.module1.ModuleOneEntrance.init(ModuleOneEntrance.java:15)
                                                     at com.example.huangli.moduledepdemo3.MainActivity.onCreate(MainActivity.java:14)
                                                     at android.app.Activity.performCreate(Activity.java:6237)
                                                     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                     at android.os.Looper.loop(Looper.java:148)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

這錯誤的意思很明確說是在ModuleTwoEntrance裡面找不到init(FragmentActivity fragmentActivity),但是ModuleTwoEntrance明明有init(Activity activity)方法,FragmentActivity是Activity的子類。這裡只能說明模組之間的方法呼叫是沒有多型性,它找不到繼承關係,要解決這個問題只能使用方法的過載.

相關文章