我对androidannotations库的看法

原创 2016年08月31日 12:23:48

最近才发现项目的代码中方法数已经有6万多,很吃惊,觉得项目貌似没有那么大,怎么会有那么多的代码量。但是我马上就想到了项目中用了androidannotation库,他会在编译时生成很多的代码。

其实我本人特别讨厌使用这个库,虽然他没用反射,在编译时生成的代码,对效率也许没什么影响,并且感觉少些了一些findViewById,传参数啊,启动Activity啊之类代码。但是,我特别特别讨厌类后面还要加个_ !!!特别特别讨厌在项目中写带_后缀的类 这样看代码时,来回点很麻烦!!!并且如果有关androidannotation的代码写错了,根本找不到错误的地方,stuido会提示所有的带后缀的文件找不到了!!!并且现在如果要在项目中去掉这个库,改动量非常多,就像豆腐里混进了沙子,上了贼船就下不来了。特别讨厌这样被捆绑的感觉。


下面就来详细的分析一下,代码中方法数是怎么变多的。
android studio新建一个项目,MainActivity是这样子的

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

然后看一下dex中的方法数为16846

再建一个项目,在gradle中添加androidannotation依赖,MainActivity改为下面这样,其他的不变

@EActivity(R.layout.activity_main)
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

这时dex中的方法数为17258 方法多了412
方法并没多多少,基本上是androidannotation jar包中多出的方法

所以我反编译了一下项目
空项目的时候,目录是这样的
空项目

而用了androidannotation时,目录是这样的
加入框架
他会在再自动生成一个ManActivity_.java
并且这个类代码还是很多的

public final class MainActivity_extends MainActivityimplements HasViews
{
    private final OnViewChangedNotifier onViewChangedNotifier_ = new OnViewChangedNotifier();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        OnViewChangedNotifier previousNotifier = OnViewChangedNotifier.replaceNotifier(onViewChangedNotifier_);
        init_(savedInstanceState);
        super.onCreate(savedInstanceState);
        OnViewChangedNotifier.replaceNotifier(previousNotifier);
        setContentView(layout.activity_main);
    }
    private void init_(Bundle savedInstanceState) {
    }
    @Override
    public void setContentView(int layoutResID) {
        super.setContentView(layoutResID);
        onViewChangedNotifier_.notifyViewChanged(this);
    }
    @Override
    public void setContentView(View view, LayoutParams params) {
        super.setContentView(view, params);
        onViewChangedNotifier_.notifyViewChanged(this);
    }
    @Override
    public void setContentView(View view) {
        super.setContentView(view);
        onViewChangedNotifier_.notifyViewChanged(this);
    }
    public static MainActivity_.IntentBuilder_ intent(Context context) {
        return new MainActivity_.IntentBuilder_(context);
    }
    public static MainActivity_.IntentBuilder_ intent(android.app.Fragment fragment) {
        return new MainActivity_.IntentBuilder_(fragment);
    }
    public static MainActivity_.IntentBuilder_ intent(android.support.v4.app.Fragment supportFragment) {
        return new MainActivity_.IntentBuilder_(supportFragment);
    }
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (((SdkVersionHelper.getSdkInt()< 5)&&(keyCode == KeyEvent.KEYCODE_BACK))&&(event.getRepeatCount() == 0)) {
            onBackPressed();
        }
        return super.onKeyDown(keyCode, event);
    }
    public static class IntentBuilder_ {

        private Context context_;
        private final Intent intent_;
        private android.app.Fragment fragment_;
        private android.support.v4.app.Fragment fragmentSupport_;
        public IntentBuilder_(Context context) {
            context_ = context;
            intent_ = new Intent(context, MainActivity_.class);
        }
        public IntentBuilder_(android.app.Fragment fragment) {
            fragment_ = fragment;
            context_ = fragment.getActivity();
            intent_ = new Intent(context_, MainActivity_.class);
        }
        public IntentBuilder_(android.support.v4.app.Fragment fragment) {
            fragmentSupport_ = fragment;
            context_ = fragment.getActivity();
            intent_ = new Intent(context_, MainActivity_.class);
        }
        public Intent get() {
            return intent_;
        }
        public MainActivity_.IntentBuilder_ flags(int flags) {
            intent_.setFlags(flags);
            return this;
        }
        public void start() {
            context_.startActivity(intent_);
        }
        public void startForResult(int requestCode) {
            if (fragmentSupport_!= null) {
                fragmentSupport_.startActivityForResult(intent_, requestCode);
            } else {
                if (fragment_!= null) {
                    fragment_.startActivityForResult(intent_, requestCode);
                } else {
                    if (context_ instanceof Activity) {
                        ((Activity) context_).startActivityForResult(intent_, requestCode);
                    } else {
                        context_.startActivity(intent_);
                    }
                }
            }
        }
    }
}

这样Activity,Fragment等都会多生成一套代码,随着页面数量的增加,就会导致dex中的类多了很多。


最后,对新开发项目的小伙伴们的建议,不要用androidannotations库,不要用androidannotations库,不要用androidannotations库。当然听不听随你。

版权声明:本文为博主原创文章,未经博主允许不得转载。

AndroidAnnotations开发框架使用详解

AndroidAnnotations是一个能够让你快速进行Android开发的开源框架,它能让你专注于真正重要的地方。使代码更加精简,使项目更容易维护。下面给出GitHub地址: https://gi...
  • shineflowers
  • shineflowers
  • 2016年03月28日 17:13
  • 3592

AndroidAnnotations 注解框架的优势对比、配置及使用教程

AndroidAnnotations 是一个开源注解框架,旨在加快 Android 开发的效率,其区别于其他基于反射的注解框架,使用 jdk 1.6引入的 Java Annotation Proces...
  • My_TrueLove
  • My_TrueLove
  • 2016年04月27日 18:27
  • 3755

Android之注解框架Annotations从配置到简单一个demo

Android Annotations配置1.首先,一个框架需要有它的依赖包,Annotations框架需要使用两个jar包,我已经上传在了我的资源上, Annotations框架下载2.在新建的普...
  • song_shui_lin
  • song_shui_lin
  • 2016年11月09日 14:21
  • 1151

AndroidAnnotations库的使用

AndroidAnnotations(Code Diet) android快速开发框架简介: 项目地址:https://github.com/excilys/androidannotations ...
  • ChangHuiYuanH
  • ChangHuiYuanH
  • 2015年07月21日 20:00
  • 1752

Android快速开发必备——依赖注入(DI)类库的选择ButterKnife,AndroidAnnotations,RoboGuice

现在做移动端开发的开发者,不管是Android和IOS,公司一般都是喜欢那种具备独立开发能力的人,因为APP项目相对较小,有时候一个人完全可以单独胜任一个项目。所以如果我们要能够具备独立开发的能力,快...
  • finddreams
  • finddreams
  • 2015年05月05日 16:21
  • 2532

关于将SDL及其扩展库移植到Android平台的一些看法

关于将SDL及其扩展库移植到Android平台的一些看法 从SDL1.3开始,已经官方支持SDL到Android移植,一个显著的标志是提供了可以通过NDK编译的Android.mk文件。文件中指明了S...
  • zyzzate
  • zyzzate
  • 2013年08月30日 00:44
  • 481

jsp页面中使用JSTL标签库的<c:redirect>的一些看法和疑问?

我在jsp页面中使用JSTL标签库的的一些疑问? 直接看代码 goodsList.jsp商品列表页面 ...
  • czh500
  • czh500
  • 2018年01月06日 18:31
  • 64

我对游戏UI库的看法

从开发中发现保存格式xml是最方便开发,当然可以在发布的时候采用二进制,但是需要维护成本。xml是文本格式,且扩展性强,尤其文本格式你可以全局搜索定位到那个界面,因为UI在一个游戏里面至少有几十个,且...
  • zmy12007
  • zmy12007
  • 2011年03月05日 00:02
  • 1643

winform:无法引用其他类库,dll,using等个人看法

在项目类库中已经引用了相关了类库,生成解决方案也没问题,但是到了后置代码,通过using引用其他类库的时候,再生成解决方案或者生成单个类库,就会报“未能找到类型或命名空间“xxx"(是否缺少using...
  • heeye
  • heeye
  • 2014年04月29日 15:43
  • 435

17.[开源][安卓]androidannotations-develop

  • 2015年03月01日 10:46
  • 5.37MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:我对androidannotations库的看法
举报原因:
原因补充:

(最多只允许输入30个字)