结合网上查阅,目前使用稳定了的MultiDex

来源:互联网 发布:原油库存数据公布时间 编辑:程序博客网 时间:2024/06/06 08:55
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 ;    }   }
0 0