我对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 开发的效率,其区别于其他基于反射的注解框架,使用 jdk 1.6引入的 Java Annotation Proces...

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

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

AndroidAnnotations库的使用

AndroidAnnotations(Code Diet) android快速开发框架简介: 项目地址:https://github.com/excilys/androidannotations ...

我对游戏UI库的看法

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

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

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

Android框架AndroidAnnotations

  • 2017-04-08 16:03
  • 1.13MB
  • 下载

androidannotations-3.1

  • 2015-03-09 17:03
  • 660KB
  • 下载

Android开发框架androidannotations使用初步

一.简介 我们在开发J2EE项目的时候,经常感觉Spring很方便,因此,当我们开发android的时候,自然而然会想有没有类似的框架。本次博客主要讲一下比较流行的android开发框架Androi...

androidannotations-3.2

  • 2015-10-31 10:44
  • 2.55MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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