结合网上查阅,目前使用稳定了的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
- 结合网上查阅,目前使用稳定了的MultiDex
- 面试总结+网上查阅的智力题
- 结合网上的知识,用c++实现了specification模式
- j2ee初学者FAQ-近来解决了一个大的问题,目前网上没有解决方案
- matlab find用法 可以说是目前网上最全的,大家可以学习了
- Android中Multidex的使用
- 常用的正则表达式.网上拷贝,方便自己查阅.
- 今天做的内核升级,花了好几个小时,结合网上资料,学习了一下
- 使用tcmalloc后的MySQL服务器变稳定了
- 目前debian lenny 5.0速度最快最稳定的源
- 因工作需要,结合网上的算法,写了个身份证号码升位函数
- Android的multidex使用及优化
- 解决使用multidex分包后找不类的问题
- 修改了webcore 使用wininet的问题,现在应该很稳定了
- C#中的委托,事件,回调函数综合总结:结合了网上几位大神的例子
- Javascript 获得元素位置&&获得元素样式值-网上找的,方便以后查阅
- 串口中断结合定时器实现稳定可靠的串口接收
- asp 收集的资料了,为了方便查阅。
- 1.4 复合数据类型和枚举类型
- 谈谈cout的执行顺序
- (二叉)堆排序
- 使用DatePickerDialog制作日期选择器
- Centos 安装 retext
- 结合网上查阅,目前使用稳定了的MultiDex
- 从SHAttered事件谈安全
- javaMal(二)-------如何通过java来发送简单的邮件
- 支持Vulkan的移动GPU
- node.js
- 神兵利器Dagger2
- VXLAN学习
- android 圆角图片
- sublime 文本格式化方法(自定义方法)