mirror of https://github.com/YTVanced/VancedMicroG
98 lines
3.7 KiB
Java
98 lines
3.7 KiB
Java
/*
|
|
* SPDX-FileCopyrightText: 2021, microG Project Team
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
package com.google.android.gms.chimera.container;
|
|
|
|
import android.content.Context;
|
|
import android.content.ContextWrapper;
|
|
import android.content.pm.ApplicationInfo;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Build;
|
|
import android.os.Process;
|
|
import android.util.Log;
|
|
|
|
import androidx.annotation.RequiresApi;
|
|
|
|
import org.microg.gms.common.Constants;
|
|
|
|
import java.io.File;
|
|
|
|
import dalvik.system.PathClassLoader;
|
|
|
|
public class DynamiteContext extends ContextWrapper {
|
|
private static final String TAG = "DynamiteContext";
|
|
private DynamiteModuleInfo moduleInfo;
|
|
private Context originalContext;
|
|
private Context gmsContext;
|
|
private DynamiteContext appContext;
|
|
|
|
private ClassLoader classLoader;
|
|
|
|
public DynamiteContext(DynamiteModuleInfo moduleInfo, Context base, Context gmsContext, DynamiteContext appContext) {
|
|
super(base);
|
|
this.moduleInfo = moduleInfo;
|
|
this.originalContext = base;
|
|
this.gmsContext = gmsContext;
|
|
this.appContext = appContext;
|
|
}
|
|
|
|
@Override
|
|
public ClassLoader getClassLoader() {
|
|
if (classLoader == null) {
|
|
StringBuilder nativeLoaderDirs = new StringBuilder(gmsContext.getApplicationInfo().nativeLibraryDir);
|
|
if (Build.VERSION.SDK_INT >= 23 && Process.is64Bit()) {
|
|
for (String abi : Build.SUPPORTED_64_BIT_ABIS) {
|
|
nativeLoaderDirs.append(File.pathSeparator).append(gmsContext.getApplicationInfo().sourceDir).append("!/lib/").append(abi);
|
|
}
|
|
} else if (Build.VERSION.SDK_INT >= 21) {
|
|
for (String abi : Build.SUPPORTED_32_BIT_ABIS) {
|
|
nativeLoaderDirs.append(File.pathSeparator).append(gmsContext.getApplicationInfo().sourceDir).append("!/lib/").append(abi);
|
|
}
|
|
} else {
|
|
nativeLoaderDirs.append(File.pathSeparator).append(gmsContext.getApplicationInfo().sourceDir).append("!/lib/").append(Build.CPU_ABI);
|
|
}
|
|
classLoader = new PathClassLoader(gmsContext.getApplicationInfo().sourceDir, nativeLoaderDirs.toString(), new FilteredClassLoader(originalContext.getClassLoader(), moduleInfo.getMergedClasses(), moduleInfo.getMergedPackages()));
|
|
}
|
|
return classLoader;
|
|
}
|
|
|
|
@Override
|
|
public String getPackageName() {
|
|
return gmsContext.getPackageName();
|
|
}
|
|
|
|
@Override
|
|
public ApplicationInfo getApplicationInfo() {
|
|
return gmsContext.getApplicationInfo();
|
|
}
|
|
|
|
@Override
|
|
public Context getApplicationContext() {
|
|
return appContext;
|
|
}
|
|
|
|
@RequiresApi(24)
|
|
@Override
|
|
public Context createDeviceProtectedStorageContext() {
|
|
return new DynamiteContext(moduleInfo, originalContext.createDeviceProtectedStorageContext(), gmsContext.createDeviceProtectedStorageContext(), appContext);
|
|
}
|
|
|
|
public static DynamiteContext create(String moduleId, Context originalContext) {
|
|
try {
|
|
DynamiteModuleInfo moduleInfo = new DynamiteModuleInfo(moduleId);
|
|
Context gmsContext = originalContext.createPackageContext(Constants.GMS_PACKAGE_NAME, 0);
|
|
Context originalAppContext = originalContext.getApplicationContext();
|
|
if (originalAppContext == null || originalAppContext == originalContext) {
|
|
return new DynamiteContext(moduleInfo, originalContext, gmsContext, null);
|
|
} else {
|
|
return new DynamiteContext(moduleInfo, originalContext, gmsContext, new DynamiteContext(moduleInfo, originalAppContext, gmsContext, null));
|
|
}
|
|
} catch (PackageManager.NameNotFoundException e) {
|
|
Log.w(TAG, e);
|
|
return null;
|
|
}
|
|
}
|
|
}
|