`
chroya
  • 浏览: 661503 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android开发减少方法数的建议

阅读更多

     现在的Android应用越来越庞大,开发者越来越能感受到方法数限制带来的影响。这里简单讲几个减少方法数的小建议。

 

1.什么是方法数?为什么它这么重要?

    这要从dex的文件格式说起,在把源码编译、转化为dex文件格式时,dex文件中会有一个区域包含了所有源码中定义或引用的方法列表。这个区域中所有方法项的总数就是方法数。

很遗憾,Android在刚开始被设计的时候,这一区域的方法数量不能超过65536个,也就是2个字节表示的范围。当源码定义或引用的方法数量超过了这个限制的话,就会导致编译不成功,你说重要不重要呢? 

 

2.如何查看这些方法?

    可以使用修改过的dexdump。标准的dexdump可以解析方法列表,但无法打印出来,修改版的dexdump可以打印这些信息

如下是一个简单类LogicActivity中使用的方法

Class: Lcom/xxx/activity/LogicActivity; 18

Method: <init> ()V

Method: access$000 (Lcom/xxx/activity/LogicActivity;)Lcom/xxx/app/AppInterface;

Method: access$100 (Lcom/xxx/activity/LogicActivity;)Lcom/xxx/app/AppInterface;

Method: addFriend (Ljava/lang/String;ILjava/lang/String;)V

Method: addObserver (Lcom/xxx/app/BusinessObserver;)V

Method: finish ()V

Method: getIntent ()Landroid/content/Intent;

Method: getString (I)Ljava/lang/String;

Method: getTitleBarHeight ()I

Method: joinTroop ()V

Method: onActivityResult (IILandroid/content/Intent;)V

Method: onCreate (Landroid/os/Bundle;)V

Method: onDestroy ()V

Method: removeObserver (Lcom/xxx/app/BusinessObserver;)V

Method: setLastActivityName ()Ljava/lang/String;

Method: setResult (ILandroid/content/Intent;)V

Method: startActivity (Landroid/content/Intent;)V

Method: startActivityForResult (Landroid/content/Intent;I)V

可以看出,这里面的方法是包含代码中引用的方法的,如finish(),getIntent()这些方法。

 

3.减少方法数的办法

    以下所介绍的方法都可以在修改后,用dexdump –j来观察、比较所修改的方法以及验证减少的效果。

方法1 避免在内部类中访问外部类的私有方法/变量

当在Java内部类(包括内部匿名类)中访问外部类的私有方法/变量时,编译器会生成额外的方法,这也会增加方法数,建议编码时尽量避免。

 

具体原因:

考虑如下的代码

publicclassFoo{
    privateclassInner{
        void stuff(){
            Foo.this.doStuff(Foo.this.mValue);
        }
    }

    privateint mValue;

    publicvoid run(){
        Innerin=newInner();
        mValue =27;
        in.stuff();
    }

    privatevoid doStuff(int value){
        System.out.println("Value is "+ value);
    }
}

 

虽然Java语言允许内部类直接访问外部类的方法,但是虚拟机却认为Foo和Foo$Inner是两个不同的类,为了支持Foo$Inner访问Foo的private成员,编译器会生成两个额外的方法,而生成的这些方法也算在方法总数里面

 

/*package*/staticintFoo.access$100(Foo foo){
    return foo.mValue;
}
/*package*/staticvoidFoo.access$200(Foo foo,int value){
    foo.doStuff(value);
}
 

 

具体可以参考:http://developer.android.com/training/articles/perf-tips.html#PackageInner

 

解决办法:

很简单,把mValue和doStuff()的private修饰符去掉就好了,这样它的默认访问域为包级,编译器就不需要生成额外的代码。

 

方法2 避免调用派生类中的未被覆盖(override)的方法

考虑下面的代码

 

publicclass DemoActivity extends Activity {
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        if (intent.getAction().equals("add")) {
            finish();
        }
        else {
            setContentView(R.id.background);
        }
    }
}
 

 

实际上它会生成5个方法,除了定义的onCreate和构造函数之外,还有setContentView、getIntent()和finish()。因为按照java的语义,如果有覆盖父类的方法,则会直接调用覆盖的方法。

Class: Lcom/xxx/activity/DemoActivity; 5

Method: <init> ()V

Method: finish ()V

Method: getIntent ()Landroid/content/Intent;

Method: onCreate (Landroid/os/Bundle;)V

Method: setContentView (I)V

 

解决办法:

对于不需要被override的方法,显式的改成调用父类的方法,如下所示

 

publicclass DemoActivity extends Activity {
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = super.getIntent();
        if (intent.getAction().equals("add")) {
            super.finish();
        }
        else {
            super.setContentView(R.id.background);
        }
    }
}
 

 

则实际在方法数列表中它只占2个方法

Class: Lcom/tencent/mobileqq/activity/DemoActivity; 2

Method: <init> ()V

Method: onCreate (Landroid/os/Bundle;)V

 

其实减少方法数还有很多办法,比如插件化之类的,后面有空再介绍。

 

另外,手机QQ空间长期招聘Android开发,有意者可以直接发送简历到邮箱 chroya.v@gmail.com,或者联系QQ 115818782,注明来意。

 

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=5bex9jk0h28x

 

分享到:
评论

相关推荐

    阿里Android开发手册最新版

    《阿里巴巴Android开发手册》是Android开发者们不可或缺的参考资料,它汇集了阿里巴巴集团在Android开发领域的最佳实践和规范,旨在提升代码质量、优化开发流程、确保软件稳定性和性能。本手册覆盖了从编码风格、...

    阿里Android开发手册.pdf

    《阿里巴巴Android开发手册》是Android开发者们不可或缺的参考资料,它由阿里巴巴集团精心编撰,旨在为开发者提供一套完整的Android开发规范和技术指南。手册涵盖了从基础编程到高级优化的多个方面,帮助开发者提升...

    阿里巴巴Android开发手册 (规约)

    《阿里巴巴Android开发手册》是阿里巴巴集团为Android开发者制定的一套规范和最佳实践,旨在提高代码质量和团队协作效率。这份手册涵盖了编码规约、异常处理、性能优化、安全指南等多个方面,是Android开发者不可或...

    阿里巴巴Android开发手册

    《阿里巴巴Android开发手册》是阿里巴巴集团旗下的Android开发规范指南,其目的是为了引导开发者编写高质量、高效率、稳定性和安全性强的Android应用程序。手册是基于集团内部多款应用如淘宝、天猫、闲鱼、钉钉等...

    史上最全Android开发环境搭建-Android

    在进入Android开发的世界之前,首先需要搭建一个完整的开发环境。这个环境包括了各种必要的软件工具,使得开发者能够编写、编译、调试以及运行Android应用程序。本文将详细介绍如何一步步搭建史上最全的Android开发...

    阿里巴巴Android开发手册 高清 带书签

    《阿里巴巴Android开发手册》是一本深受开发者欢迎的指南,它为Android应用开发提供了一套全面且严谨的编码规范。这份高清版本带有书签,便于读者快速定位和查阅,尤其适合初学者和有经验的开发者用来提升开发质量和...

    阿里巴巴Android开发规范手册

    《阿里巴巴Android开发规范手册》是阿里巴巴集团为Android开发者提供的一份详尽的开发指南,旨在提升团队协作效率,保证代码质量,以及优化软件性能。这份规范涵盖了从编码风格、命名规则到项目结构、异常处理等多个...

    Android开发环境.ppt

    Android开发环境安装配置方法 Android开发环境的安装配置方法是Android应用程序开发的基石。掌握Android开发环境的安装配置方法是每个Android开发者的必备技能。本章学习目标是掌握Android开发环境的安装配置方法,...

    Android开发规范

    Android开发规范是一套为Android应用开发所制定的内部编码和编程规范。它旨在减少维护成本,提高代码的可读性,加速开发人员之间的工作交接,并减少命名冲突和缺陷引入的风险。以下是根据提供的文件内容总结出的相关...

    阿里巴巴Android开发手册1.0.pdf

    《阿里巴巴Android开发手册1.0》是一份专为Android开发者准备的详尽指南,由阿里巴巴集团内部专家编纂,旨在提升Android应用的质量和开发效率。这份手册覆盖了多个关键领域,包括但不限于编程规范、架构设计、性能...

    A10 android开发环境文档

    ### A10 Android开发环境构建指南 #### 一、概览 本文档旨在详细介绍如何在Linux环境下为A10开发板构建一个完整的Android开发环境。该文档特别关注于Ubuntu平台上的环境搭建,并提供了详细的步骤说明及注意事项。...

    阿里android开发手册.pdf

    ### 阿里巴巴Android开发手册关键知识点解析 #### 一、引言 《阿里巴巴Android开发手册》旨在汇集阿里巴巴集团旗下各个Android开发团队的经验与智慧,包括但不限于淘宝、天猫、闲鱼、钉钉等知名应用程序的开发实践...

    阿里巴巴Android开发手册pdf版本

    《阿里巴巴Android开发手册》是一本全面且深入的指南,旨在帮助Android开发者,无论新手还是资深工程师,提升开发质量和效率。这份PDF版本包含了丰富的知识内容,目录结构清晰,方便读者快速定位所需信息。以下是对...

    android webview中使用Java调用JavaScript方法并获取返回值

    同时,根据Android开发文档,从Android 4.2(Jelly Bean)开始,使用addJavascriptInterface()方法时需要特别注意,因为这个方法可能会引入安全风险,尤其是当JavaScript代码来自不可信的源时。如果应用的targetSdk...

    分享40条Android开发的优化建议

    以上40条建议涵盖了Android开发中的多个方面,从屏幕适配、性能优化到代码质量和用户体验,都是提高Android项目质量的关键点。在实际开发中,根据项目需求和具体情况灵活运用这些技巧,将有助于打造出高效、稳定且...

    移动开发之Android开发的十七条建议.docx

    ### 移动开发之Android开发的十七条建议 #### 1. 不要重复造轮子 在Android开发过程中,经常会遇到一些常见的需求或功能实现。为了避免重复劳动,我们应该充分利用已有的开源库和技术成果。例如,当你需要实现网络...

    基于Android Studio开发的答题APP

    综上所述,基于Android Studio开发答题APP涵盖了从UI设计、数据管理、用户交互到性能优化等多个方面,是一个综合性的Android开发实践。通过这个项目,开发者可以深入理解Android应用开发的全过程,提升自己的技能...

    Android开发问题集锦 情人节特刊

    根据提供的文件信息,我们可以梳理出关于Android开发的一系列知识点。首先,文件中提到“Android开发问题集锦 情人节特刊”,表明这是一份集合了多个Android开发问题和解答的特辑,旨在帮助开发者在情人节这一天提升...

    Android Studio开发显示网络图片

    Android Studio作为官方推荐的Android开发集成环境,提供了丰富的工具和技术支持来实现这一功能。以下将详细介绍如何在Android Studio中进行网络图片的加载与显示。 首先,我们需要理解HTTP协议的基础。HTTP(超...

Global site tag (gtag.js) - Google Analytics