下面列出了android.app.Application#getApplicationInfo ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public AnimatorSet() {
super();
mNodeMap.put(mDelayAnim, mRootNode);
mNodes.add(mRootNode);
boolean isPreO;
// Set the flag to ignore calling end() without start() for pre-N releases
Application app = ActivityThread.currentApplication();
if (app == null || app.getApplicationInfo() == null) {
mShouldIgnoreEndWithoutStart = true;
isPreO = true;
} else {
if (app.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.N) {
mShouldIgnoreEndWithoutStart = true;
} else {
mShouldIgnoreEndWithoutStart = false;
}
isPreO = app.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.O;
}
mShouldResetValuesAtStart = !isPreO;
mEndCanBeCalled = !isPreO;
}
private static ApplicationInfo getApplicationInfo(String packageName, int userId) {
if (packageName == null) {
return null;
}
// Get the application for the passed in package and user.
Application application = ActivityThread.currentApplication();
if (application == null) {
throw new IllegalStateException("Cannot create remote views out of an aplication.");
}
ApplicationInfo applicationInfo = application.getApplicationInfo();
if (UserHandle.getUserId(applicationInfo.uid) != userId
|| !applicationInfo.packageName.equals(packageName)) {
try {
Context context = application.getBaseContext().createPackageContextAsUser(
packageName, 0, new UserHandle(userId));
applicationInfo = context.getApplicationInfo();
} catch (NameNotFoundException nnfe) {
throw new IllegalArgumentException("No such package " + packageName);
}
}
return applicationInfo;
}
/**
* Init the framework
*
* @param application
* @return
* @throws Exception
*/
public void init(Application application,boolean reset) throws AssertionArrayException, Exception {
if(application==null){
throw new RuntimeException("application is null,atlas init failed!");
}
ApplicationInfo app_info = application.getApplicationInfo();
sAPKSource = app_info.sourceDir;
RuntimeVariables.androidApplication = application;
RuntimeVariables.delegateResources = application.getResources();
Framework.containerVersion = RuntimeVariables.sInstalledVersionName;
ClassLoader cl = Atlas.class.getClassLoader();
Framework.systemClassLoader = cl;
// defineAndVerify
String packageName = application.getPackageName();
RuntimeVariables.delegateClassLoader = Atlas.class.getClassLoader();
frameworkLifecycleHandler = new FrameworkLifecycleHandler();
Framework.frameworkListeners.add(frameworkLifecycleHandler);
}
/**
* 未使用
*/
/* package */static Resources createPluginResourceFor5(Application application, String absolutePluginApkPath) {
try {
AssetManager assetMgr = AssetManager.class.newInstance();
Method addAssetPaths = AssetManager.class.getDeclaredMethod("addAssetPaths", String[].class);
String[] assetPaths = new String[2];
// 不可更改顺序否则不能兼容4.x
assetPaths[0] = absolutePluginApkPath;
assetPaths[1] = application.getApplicationInfo().sourceDir;
addAssetPaths.invoke(assetMgr, new Object[] { assetPaths });
Resources mainRes = application.getResources();
Resources pluginRes = new PluginResourceWrapper(assetMgr, mainRes.getDisplayMetrics(),
mainRes.getConfiguration());
PaLog.d("create Plugin Resource from: ", assetPaths[0], assetPaths[1]);
return pluginRes;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Install the condom protection for current process if it is not the default process.
*
* <p>This method must be called in {@link Application#onCreate()} to eliminate potential leakage.
*/
public static void installExceptDefaultProcess(final Application app, final CondomOptions options) {
validateCondomOptions(options);
final String current_process_name = getProcessName(app);
if (current_process_name == null) return;
final String default_process_name = app.getApplicationInfo().processName;
if (! current_process_name.equals(default_process_name)) install(app, current_process_name, options);
}
/**
* Install the condom protection for current process if its process name matches. This method should be called in {@link Application#onCreate()}.
*
* @param process_names list of processes where Condom process should NOT be installed, in the form exactly as defined
* by <code>"android:process"</code> attribute of components in <code>AndroidManifest.xml</code>.
* <b>BEWARE: Default process must be explicitly listed here if it is expected to be excluded.</b>
*/
public static void installExcept(final Application app, final CondomOptions options, final String... process_names) {
if (process_names.length == 0) throw new IllegalArgumentException("At lease one process name must be specified");
validateCondomOptions(options);
final String current_process_name = getProcessName(app);
if (current_process_name == null) return;
for (final String process_name : process_names)
if (! current_process_name.equals(getFullProcessName(app, process_name))) {
install(app, current_process_name, options);
return;
}
if ((app.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) validateProcessNames(app, process_names);
}
/**
* Install the condom protection for current process if it is not the default process.
*
* <p>This method must be called in {@link Application#onCreate()} to eliminate potential leakage.
*/
public static void installExceptDefaultProcess(final Application app, final CondomOptions options) {
validateCondomOptions(options);
final String current_process_name = getProcessName(app);
if (current_process_name == null) return;
final String default_process_name = app.getApplicationInfo().processName;
if (! current_process_name.equals(default_process_name)) install(app, current_process_name, options);
}
/**
* Install the condom protection for current process if its process name matches. This method should be called in {@link Application#onCreate()}.
*
* @param process_names list of processes where Condom process should NOT be installed, in the form exactly as defined
* by <code>"android:process"</code> attribute of components in <code>AndroidManifest.xml</code>.
* <b>BEWARE: Default process must be explicitly listed here if it is expected to be excluded.</b>
*/
public static void installExcept(final Application app, final CondomOptions options, final String... process_names) {
if (process_names.length == 0) throw new IllegalArgumentException("At lease one process name must be specified");
validateCondomOptions(options);
final String current_process_name = getProcessName(app);
if (current_process_name == null) return;
for (final String process_name : process_names)
if (! current_process_name.equals(getFullProcessName(app, process_name))) {
install(app, current_process_name, options);
return;
}
if ((app.getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) validateProcessNames(app, process_names);
}
public static void checkAppSupportsRtl() {
Application application = ApplicationProvider.getApplicationContext();
ApplicationInfo info = application.getApplicationInfo();
boolean supportsRtl = (info.flags & ApplicationInfo.FLAG_SUPPORTS_RTL) != 0;
assertThat(supportsRtl).isTrue();
assertThat(info.targetSdkVersion).isGreaterThan(16);
}
public static boolean checkLoadKernalDebugPatch(Application application) {
if (Build.VERSION.SDK_INT < 21) {
//暂时只支持art设备的debug调试
return false;
}
boolean loadKernalPatch = false;
try {
ApplicationInfo app_info = application.getApplicationInfo();
boolean debug = (app_info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
if (debug) {
File debugBundleDir = new File(KernalConstants.baseContext.getExternalFilesDir("debug_storage"), KERNAL_BUNDLE_NAME);
File patchFile = new File(debugBundleDir, "patch.zip");
if (patchFile.exists()) {
loadKernalPatch = true;
KernalBundle bundle = new KernalBundle();
//DexFile dexFile = (DexFile) KernalConstants.dexBooster.loadDex(KernalConstants.baseContext, KernalConstants.baseContext.getApplicationInfo().sourceDir,
// new File(patchFile.getParent(), "base.dex").getAbsolutePath(), 0, true);
File internalDebugBundleDir = new File(new File(application.getFilesDir(), "debug_storage"), KERNAL_BUNDLE_NAME);
internalDebugBundleDir.mkdirs();
DexFile patchDexFile = (DexFile) DexFile.loadDex(patchFile.getAbsolutePath(),new File(internalDebugBundleDir, "patch.dex").getAbsolutePath(), 0);
if (bundle.needReplaceClassLoader(application)) {
NClassLoader loader = new NClassLoader(".", KernalBundle.class.getClassLoader().getParent());
try {
NClassLoader.replacePathClassLoader(KernalConstants.baseContext, KernalBundle.class.getClassLoader(), loader);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
bundle.installKernalBundle(KernalConstants.baseContext.getClassLoader(), patchFile, new DexFile[]{patchDexFile/*, dexFile*/}, null,
true /*(app_info.flags & ApplicationInfo.FLAG_VM_SAFE_MODE) != 0*/);
bundle.prepareRuntimeVariables(application);
Class DelegateResourcesClazz = application.getClassLoader().loadClass("android.taobao.atlas.runtime.DelegateResources");
DelegateResourcesClazz.getDeclaredMethod("addApkpatchResources", String.class)
.invoke(DelegateResourcesClazz, patchFile.getAbsolutePath());
Toast.makeText(KernalConstants.baseContext, "当前处于DEBUG调试状态,不支持动态更新,清除数据可恢复", Toast.LENGTH_LONG).show();
}
}
} finally {
return loadKernalPatch;
}
}
public static boolean isDebugMode(Application application){
final ApplicationInfo app_info = application.getApplicationInfo();
return (app_info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
}