public class MyApplication extends Application { public static final String KEY_DEX2_SHA1 = "dex2-SHA1-Digest"; private static MyApplication instance; public static MyApplication getInstance() { if (null == instance) { instance = new MyApplication(); } return instance; } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); // Log.d( "loadDex", "App attachBaseContext "); if (!quickStart() && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {//>=5.0的系统默认对dex进行oat优化 if (needWait(base)){ waitForDexopt(base); } MultiDex.install (this ); } else { return; } } //neead wait for dexopt ? private boolean needWait(Context context){ String flag = get2thDexSHA1(context); SharedPreferences sp = context.getSharedPreferences( PackageUtil.getPackageInfo(context). versionName, MODE_MULTI_PROCESS); String saveValue = sp.getString(KEY_DEX2_SHA1, ""); return !TextUtils.equals(flag,saveValue); } public boolean quickStart() { return getCurProcessName(this).contains(":mini"); } @Override public void onCreate() { super.onCreate(); instance = this; if (quickStart()) { return; } initProgram(); } public void waitForDexopt(Context base) { Intent intent = new Intent(this, LoadResActivity.class); ComponentName componentName = new ComponentName("com.xxx.xxx", "com.xxx.xxx.LoadResActivity"); intent.setComponent(componentName); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); base.startActivity(intent); long startWait = System.currentTimeMillis (); long waitTime = 10 * 1000 ; if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR1 ) { waitTime = 20 * 1000 ;//实测发现某些场景下有些2.3版本有可能10s都不能完成optdex } while (needWait(base)) { try { long nowWait = System.currentTimeMillis() - startWait; if (nowWait >= waitTime) { return; } Thread.sleep(200 ); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * Get classes.dex file signature * @param context context * @return return */ private String get2thDexSHA1(Context context) { ApplicationInfo ai = context.getApplicationInfo(); String source = ai.sourceDir; try { JarFile jar = new JarFile(source); java.util.jar.Manifest mf = jar.getManifest(); Map<String, Attributes> map = mf.getEntries(); Attributes a = map.get("classes2.dex"); return a.getValue("SHA1-Digest"); } catch (Exception e) { e.printStackTrace(); } return null ; } // optDex finish public void installFinish(Context context){ SharedPreferences sp = context.getSharedPreferences( PackageUtil.getPackageInfo(context).versionName, MODE_MULTI_PROCESS); sp.edit().putString(KEY_DEX2_SHA1,get2thDexSHA1(context)).apply(); } private void initProgram() { refWatcher = LeakCanary.install(this); initTestIn(); } /** * 获得当前进程的名字 * * @param context 上下文 * @return 进程号 */ public static String getCurProcessName(Context context) { try { int pid = android.os.Process.myPid(); ActivityManager mActivityManager = (ActivityManager) context .getSystemService(Context. ACTIVITY_SERVICE); for (ActivityManager.RunningAppProcessInfo appProcess : mActivityManager .getRunningAppProcesses()) { if (appProcess.pid == pid) { return appProcess. processName; } } } catch (Exception e) { // ignore } return null ; } }
结合网上查阅,目前使用稳定了的MultiDex
最新推荐文章于 2021-02-03 19:58:15 发布