互联网网站如何做流量统计,龙华学校网站建设,太原市网站,好的php网站系列文章前言在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈#xff0c;通过IO操作将XML加载到内存中并进行解析和通过反射创建View。这里介绍一种避免运行时通过IO操作读取布局文件的“黑科技”—X2C。个人认为这个技术在实际项目中使用可能会需…系列文章前言在Android布局优化(一)从布局加载原理说起中我们说到了布局加载的两大性能瓶颈通过IO操作将XML加载到内存中并进行解析和通过反射创建View。这里介绍一种避免运行时通过IO操作读取布局文件的“黑科技”—X2C。个人认为这个技术在实际项目中使用可能会需要处理一些兼容性问题但是从技术人员的思维发散的角度我认为这其中的一些思想还是很值得学习和借鉴的背景一般大家在写页面时都是通过xml写布局通过setContentView、或LayoutInflater.from(context).inflate方法将xml布局加载到内存中优点可维护性好支持即时预览代码结构清晰缺点读取xml很耗时递归解析xml较耗时反射生成对象的耗时是new的3倍以上我们团队在这个问题上也探索过很多解决方案一度走到了另一个极端完全废弃xml所有控件通过java来new甚至直接在canvas里绘制这样虽然性能确实提升了但是代码已经没有了一丁点可读性可维护性。 我们后来反思代码到底是给机器看的还是给人看的也许X2C已经给了我们一个答案X2C为了即保留xml的优点又解决它带来的性能问题我们开发了X2C方案。即在编译生成APK期间将需要翻译的layout翻译生成对应的java文件这样对于开发人员来说写布局还是写原来的xml但对于程序来说运行时加载的是对应的java文件。 我们采用APT(Annotation Processor Tool) JavaPoet技术来完成编译期间【注解】-【解注解】-【翻译xml】-【生成java】整个流程的操作。性能对比在开发集成完之后我们做了简单的测试性能对比如下加载方式次数平均加载时间XML10030X2C10011集成使用1.导入依赖在module的build.gradle文件添加依赖annotationProcessor com.zhangyue.we:x2c-apt:1.1.2implementation com.zhangyue.we:x2c-lib:1.0.62.添加注解在使用布局的任意java类或方法添加注解即可Xml(layouts activity_main)3.配置自定义属性(没有可不配)在module下建立X2C_CONFIG.xml文件里面配置定义属性和方法的映射关系,如果接收者是view则写view.否则填params.4.通过X2C加载布局在原先使用setContentView或inflate的地方替换如下this.setContentView(R.layout.activity_main); -- X2C.setContentView(this, R.layout.activity_main);LayoutInflater.from(this).inflate(R.layout.activity_main,null); -- X2C.inflate(this,R.layout.activity_main,null);过程文件原始的xmlxmlns:apphttp://schemas.android.com/apk/res-autoxmlns:toolshttp://schemas.android.com/toolsandroid:layout_widthmatch_parentandroid:layout_heightmatch_parentandroid:paddingLeft10dpandroid:idid/headlayoutlayout/headandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_centerHorizontaltrue /android:idid/cccstylestyle/bbandroid:layout_belowid/head /生成的java文件/*** WARN!!! dont edit this file* translate from {link com.zhangyue.we.x2c.demo.R.layout.activity_main}* autho chengwei* email chengweizhangyue.com*/public class X2C_2131296281_Activity_Main implements IViewCreator {Overridepublic View createView(Context ctx, int layoutId) {Resources res ctx.getResources();RelativeLayout relativeLayout0 new RelativeLayout(ctx);relativeLayout0.setPadding((int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,10,res.getDisplayMetrics())),0,0,0);View view1 (View) new X2C_2131296283_Head().createView(ctx,0);RelativeLayout.LayoutParams layoutParam1 new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT);view1.setLayoutParams(layoutParam1);relativeLayout0.addView(view1);view1.setId(R.id.head);layoutParam1.addRule(RelativeLayout.CENTER_HORIZONTAL,RelativeLayout.TRUE);ImageView imageView2 new ImageView(ctx);RelativeLayout.LayoutParams layoutParam2 new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,(int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,res.getDisplayMetrics())));imageView2.setLayoutParams(layoutParam2);relativeLayout0.addView(imageView2);imageView2.setId(R.id.ccc);layoutParam2.addRule(RelativeLayout.BELOW,R.id.head);return relativeLayout0;}}生成的映射文件/*** WARN!!! dont edit this file** author chengwei* email chengweizhangyue.com*/public class X2C127_activity implements IViewCreator {Overridepublic View createView(Context context) {View view null ;int sdk Build.VERSION.SDK_INT;int orientation context.getResources().getConfiguration().orientation;boolean isLandscape orientation Configuration.ORIENTATION_LANDSCAPE;if (isLandscape) {view new com.zhangyue.we.x2c.layouts.land.X2C127_Activity().createView(context);} else if (sdk 27) {view new com.zhangyue.we.x2c.layouts.v27.X2C127_Activity().createView(context);} else if (sdk 21) {view new com.zhangyue.we.x2c.layouts.v21.X2C127_Activity().createView(context);} else {view new com.zhangyue.we.x2c.layouts.X2C127_Activity().createView(context);}return view;}}不支持merge标签 ,在编译期间无法确定xml的parent所以无法支持系统style,在编译期间只能查到应用的style列表无法查询系统style所以只支持应用内style支持兼容ButterKnifer兼容DataBinding各种系统控件、自定义控件include标签viewStub标签fragment标签应用style自定义属性系统属性属性名称属性名称android:textSizeapp:layout_constraintRight_toLeftOfandroid:textColorapp:layout_constraintBottom_toTopOfandroid:textapp:layout_constraintTop_toTopOfandroid:backgroundapp:layout_constrainedHeight