Search in sources :

Example 6 with InstallResult

use of com.lody.virtual.remote.InstallResult in project UnityModManager by xausky.

the class VAppManagerService method installPackage.

public synchronized InstallResult installPackage(String path, int flags, boolean notify) {
    long installTime = System.currentTimeMillis();
    if (path == null) {
        return InstallResult.makeFailure("path = NULL");
    }
    File packageFile = new File(path);
    if (!packageFile.exists() || !packageFile.isFile()) {
        return InstallResult.makeFailure("Package File is not exist.");
    }
    VPackage pkg = null;
    try {
        pkg = PackageParserEx.parsePackage(packageFile);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    if (pkg == null || pkg.packageName == null) {
        return InstallResult.makeFailure("Unable to parse the package.");
    }
    InstallResult res = new InstallResult();
    res.packageName = pkg.packageName;
    // PackageCache holds all packages, try to check if we need to update.
    VPackage existOne = PackageCacheManager.get(pkg.packageName);
    PackageSetting existSetting = existOne != null ? (PackageSetting) existOne.mExtras : null;
    if (existOne != null) {
        if ((flags & InstallStrategy.IGNORE_NEW_VERSION) != 0) {
            res.isUpdate = true;
            return res;
        }
        if (!canUpdate(existOne, pkg, flags)) {
            return InstallResult.makeFailure("Not allowed to update the package.");
        }
        res.isUpdate = true;
    }
    File appDir = VEnvironment.getDataAppPackageDirectory(pkg.packageName);
    File libDir = new File(appDir, "lib");
    if (res.isUpdate) {
        FileUtils.deleteDir(libDir);
        VEnvironment.getOdexFile(pkg.packageName).delete();
        VActivityManagerService.get().killAppByPkg(pkg.packageName, VUserHandle.USER_ALL);
    }
    if (!libDir.exists() && !libDir.mkdirs()) {
        return InstallResult.makeFailure("Unable to create lib dir.");
    }
    boolean dependSystem = (flags & InstallStrategy.DEPEND_SYSTEM_IF_EXIST) != 0 && VirtualCore.get().isOutsideInstalled(pkg.packageName);
    if (existSetting != null && existSetting.dependSystem) {
        dependSystem = false;
    }
    NativeLibraryHelperCompat.copyNativeBinaries(new File(path), libDir);
    if (!dependSystem) {
        File privatePackageFile = new File(appDir, "base.apk");
        File parentFolder = privatePackageFile.getParentFile();
        if (!parentFolder.exists() && !parentFolder.mkdirs()) {
            VLog.w(TAG, "Warning: unable to create folder : " + privatePackageFile.getPath());
        } else if (privatePackageFile.exists() && !privatePackageFile.delete()) {
            VLog.w(TAG, "Warning: unable to delete file : " + privatePackageFile.getPath());
        }
        try {
            FileUtils.copyFile(packageFile, privatePackageFile);
        } catch (IOException e) {
            privatePackageFile.delete();
            return InstallResult.makeFailure("Unable to copy the package file.");
        }
        packageFile = privatePackageFile;
    }
    if (existOne != null) {
        PackageCacheManager.remove(pkg.packageName);
    }
    chmodPackageDictionary(packageFile);
    PackageSetting ps;
    if (existSetting != null) {
        ps = existSetting;
    } else {
        ps = new PackageSetting();
    }
    ps.dependSystem = dependSystem;
    ps.apkPath = packageFile.getPath();
    ps.libPath = libDir.getPath();
    ps.packageName = pkg.packageName;
    ps.appId = VUserHandle.getAppId(mUidSystem.getOrCreateUid(pkg));
    if (res.isUpdate) {
        ps.lastUpdateTime = installTime;
    } else {
        ps.firstInstallTime = installTime;
        ps.lastUpdateTime = installTime;
        for (int userId : VUserManagerService.get().getUserIds()) {
            boolean installed = userId == 0;
            ps.setUserState(userId, false, /*launched*/
            false, /*hidden*/
            installed);
        }
    }
    PackageParserEx.savePackageCache(pkg);
    PackageCacheManager.put(pkg, ps);
    mPersistenceLayer.save();
    if (!dependSystem) {
        boolean runDexOpt = false;
        if (VirtualRuntime.isArt()) {
            try {
                ArtDexOptimizer.interpretDex2Oat(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath());
            } catch (IOException e) {
                e.printStackTrace();
                runDexOpt = true;
            }
        } else {
            runDexOpt = true;
        }
        if (runDexOpt) {
            try {
                DexFile.loadDex(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath(), 0).close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    BroadcastSystem.get().startApp(pkg);
    if (notify) {
        notifyAppInstalled(ps, -1);
    }
    res.isSuccess = true;
    return res;
}
Also used : VPackage(com.lody.virtual.server.pm.parser.VPackage) IOException(java.io.IOException) DexFile(dalvik.system.DexFile) File(java.io.File) InstallResult(com.lody.virtual.remote.InstallResult)

Example 7 with InstallResult

use of com.lody.virtual.remote.InstallResult in project VirtualApp by asLody.

the class VAppManagerService method installPackage.

public synchronized InstallResult installPackage(String path, int flags, boolean notify) {
    long installTime = System.currentTimeMillis();
    if (path == null) {
        return InstallResult.makeFailure("path = NULL");
    }
    File packageFile = new File(path);
    if (!packageFile.exists() || !packageFile.isFile()) {
        return InstallResult.makeFailure("Package File is not exist.");
    }
    VPackage pkg = null;
    try {
        pkg = PackageParserEx.parsePackage(packageFile);
    } catch (Throwable e) {
        e.printStackTrace();
    }
    if (pkg == null || pkg.packageName == null) {
        return InstallResult.makeFailure("Unable to parse the package.");
    }
    InstallResult res = new InstallResult();
    res.packageName = pkg.packageName;
    // PackageCache holds all packages, try to check if we need to update.
    VPackage existOne = PackageCacheManager.get(pkg.packageName);
    PackageSetting existSetting = existOne != null ? (PackageSetting) existOne.mExtras : null;
    if (existOne != null) {
        if ((flags & InstallStrategy.IGNORE_NEW_VERSION) != 0) {
            res.isUpdate = true;
            return res;
        }
        if (!canUpdate(existOne, pkg, flags)) {
            return InstallResult.makeFailure("Not allowed to update the package.");
        }
        res.isUpdate = true;
    }
    File appDir = VEnvironment.getDataAppPackageDirectory(pkg.packageName);
    File libDir = new File(appDir, "lib");
    if (res.isUpdate) {
        FileUtils.deleteDir(libDir);
        VEnvironment.getOdexFile(pkg.packageName).delete();
        VActivityManagerService.get().killAppByPkg(pkg.packageName, VUserHandle.USER_ALL);
    }
    if (!libDir.exists() && !libDir.mkdirs()) {
        return InstallResult.makeFailure("Unable to create lib dir.");
    }
    boolean dependSystem = (flags & InstallStrategy.DEPEND_SYSTEM_IF_EXIST) != 0 && VirtualCore.get().isOutsideInstalled(pkg.packageName);
    if (existSetting != null && existSetting.dependSystem) {
        dependSystem = false;
    }
    NativeLibraryHelperCompat.copyNativeBinaries(new File(path), libDir);
    if (!dependSystem) {
        File privatePackageFile = new File(appDir, "base.apk");
        File parentFolder = privatePackageFile.getParentFile();
        if (!parentFolder.exists() && !parentFolder.mkdirs()) {
            VLog.w(TAG, "Warning: unable to create folder : " + privatePackageFile.getPath());
        } else if (privatePackageFile.exists() && !privatePackageFile.delete()) {
            VLog.w(TAG, "Warning: unable to delete file : " + privatePackageFile.getPath());
        }
        try {
            FileUtils.copyFile(packageFile, privatePackageFile);
        } catch (IOException e) {
            privatePackageFile.delete();
            return InstallResult.makeFailure("Unable to copy the package file.");
        }
        packageFile = privatePackageFile;
    }
    if (existOne != null) {
        PackageCacheManager.remove(pkg.packageName);
    }
    chmodPackageDictionary(packageFile);
    PackageSetting ps;
    if (existSetting != null) {
        ps = existSetting;
    } else {
        ps = new PackageSetting();
    }
    ps.dependSystem = dependSystem;
    ps.apkPath = packageFile.getPath();
    ps.libPath = libDir.getPath();
    ps.packageName = pkg.packageName;
    ps.appId = VUserHandle.getAppId(mUidSystem.getOrCreateUid(pkg));
    if (res.isUpdate) {
        ps.lastUpdateTime = installTime;
    } else {
        ps.firstInstallTime = installTime;
        ps.lastUpdateTime = installTime;
        for (int userId : VUserManagerService.get().getUserIds()) {
            boolean installed = userId == 0;
            ps.setUserState(userId, false, /*launched*/
            false, /*hidden*/
            installed);
        }
    }
    PackageParserEx.savePackageCache(pkg);
    PackageCacheManager.put(pkg, ps);
    mPersistenceLayer.save();
    if (!dependSystem) {
        boolean runDexOpt = false;
        if (VirtualRuntime.isArt()) {
            try {
                ArtDexOptimizer.interpretDex2Oat(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath());
            } catch (IOException e) {
                e.printStackTrace();
                runDexOpt = true;
            }
        } else {
            runDexOpt = true;
        }
        if (runDexOpt) {
            try {
                DexFile.loadDex(ps.apkPath, VEnvironment.getOdexFile(ps.packageName).getPath(), 0).close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    BroadcastSystem.get().startApp(pkg);
    if (notify) {
        notifyAppInstalled(ps, -1);
    }
    res.isSuccess = true;
    return res;
}
Also used : VPackage(com.lody.virtual.server.pm.parser.VPackage) IOException(java.io.IOException) DexFile(dalvik.system.DexFile) File(java.io.File) InstallResult(com.lody.virtual.remote.InstallResult)

Aggregations

InstallResult (com.lody.virtual.remote.InstallResult)7 IOException (java.io.IOException)6 VPackage (com.lody.virtual.server.pm.parser.VPackage)3 DexFile (dalvik.system.DexFile)3 File (java.io.File)3 PackageManager (android.content.pm.PackageManager)2 VirtualCore (com.lody.virtual.client.core.VirtualCore)2 VUserInfo (com.lody.virtual.os.VUserInfo)2 VUserManager (com.lody.virtual.os.VUserManager)2 InstalledAppInfo (com.lody.virtual.remote.InstalledAppInfo)2 VCommends (io.virtualapp.VCommends)2 VUiKit (io.virtualapp.abs.ui.VUiKit)2 AppData (io.virtualapp.home.models.AppData)2 AppInfoLite (io.virtualapp.home.models.AppInfoLite)2 MultiplePackageAppData (io.virtualapp.home.models.MultiplePackageAppData)2 PackageAppData (io.virtualapp.home.models.PackageAppData)2 PackageAppDataStorage (io.virtualapp.home.repo.PackageAppDataStorage)2 Activity (android.app.Activity)1 Context (android.content.Context)1 Intent (android.content.Intent)1