qigsaw-android/splitloader/src/main/java/com/iqiyi/android/qigsaw/core/splitload/SplitCompatLibraryLoader.java
/**
     * All versions of createSplitInstallService logic follow these rules:
     * 1. If path of {@code folder} is not injected into the classloader, inject it to the
     * beginning of pathList in the classloader.
     * <p>
     * 2. Otherwise remove path of {@code folder} first, then re-inject it to the
     * beginning of pathList in the classloader.
     */
All versions of createSplitInstallService logic follow these rules:
1. If path of  folder is not injected into the classloader, inject it to the
beginning of pathList in the classloader.

2. Otherwise remove path of  folder first, then re-inject it to the
beginning of pathList in the classloader.
All versions of createSplitInstallService logic follow these rules : 1 . If path of folder is not injected into the classloader inject it to the beginning of pathList in the classloader . 2 . Otherwise remove path of folder first then re - inject it to the beginning of pathList in the classloader .
static void load(ClassLoader classLoader, File folder)
            throws Throwable {
        if (folder == null || !folder.exists()) {
            SplitLog.e(TAG, "load, folder %s is illegal", folder);
            return;
        }
        if ((Build.VERSION.SDK_INT == 25 && Build.VERSION.PREVIEW_SDK_INT != 0)
                || Build.VERSION.SDK_INT > 25) {
            try {
                V25.load(classLoader, folder);
            } catch (Throwable throwable) {
                SplitLog.e(TAG, "load, v25 fail, sdk: %d, error: %s, try to fallback to V23",
                        Build.VERSION.SDK_INT, throwable.getMessage());
                V23.load(classLoader, folder);
            }
        } else if (Build.VERSION.SDK_INT >= 23) {
            try {
                V23.load(classLoader, folder);
            } catch (Throwable throwable) {
                SplitLog.e(TAG, "load, v23 fail, sdk: %d, error: %s, try to fallback to V14",
                        Build.VERSION.SDK_INT, throwable.getMessage());
                V14.load(classLoader, folder);
            }
        } else if (Build.VERSION.SDK_INT >= 14) {
            V14.load(classLoader, folder);
        } else {
            V4.load(classLoader, folder);
        }
    }
static void load ( ClassLoader classLoader , File folder ) throws Throwable { if ( folder == null || ! folder . exists ( ) ) { SplitLog . e ( TAG , "load, folder %s is illegal" , folder ) ; return ; } if ( ( Build . VERSION . SDK_INT == 25 && Build . VERSION . PREVIEW_SDK_INT != 0 ) || Build . VERSION . SDK_INT > 25 ) { try { V25 . load ( classLoader , folder ) ; } catch ( Throwable throwable ) { SplitLog . e ( TAG , "load, v25 fail, sdk: %d, error: %s, try to fallback to V23" , Build . VERSION . SDK_INT , throwable . getMessage ( ) ) ; V23 . load ( classLoader , folder ) ; } } else if ( Build . VERSION . SDK_INT >= 23 ) { try { V23 . load ( classLoader , folder ) ; } catch ( Throwable throwable ) { SplitLog . e ( TAG , "load, v23 fail, sdk: %d, error: %s, try to fallback to V14" , Build . VERSION . SDK_INT , throwable . getMessage ( ) ) ; V14 . load ( classLoader , folder ) ; } } else if ( Build . VERSION . SDK_INT >= 14 ) { V14 . load ( classLoader , folder ) ; } else { V4 . load ( classLoader , folder ) ; } }
All versions of createSplitInstallService logic follow these rules:
 1.
All versions of createSplitInstallService logic follow these rules : 1 .
// android o sdk_int 26 // for android o preview sdk_int 25 // createSplitInstallService fail, try to treat it as v23 // some preview N version may go here // createSplitInstallService fail, try to treat it as v14