ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Android 组件化实战,蚂蚁金服内推四面

2021-09-05 13:58:41  阅读:272  来源: 互联网

标签:img 金服 project 面试 组件 Android com android


(1) 区分 application 还是 library


if (isApplicationModule1.toBoolean()){

    apply plugin: 'com.android.application'

}else{

    apply plugin: 'com.android.library'

}





(2) 增加 applicationId


 defaultConfig {

        if (isApplicationModule1.toBoolean()){

            applicationId "com.demo.myapplication.module1"

        }

    }





(3) AndroidManifest 启动入口


 sourceSets {

        main {

            if (isApplicationModule1.toBoolean()) {

                manifest.srcFile 'src/main/module/AndroidManifest.xml'

            } else {

                manifest.srcFile 'src/main/AndroidManifest.xml'

            }

        }

    }





4. 在主 app module 中引入其他Module

要注意的一点是每个组件如果是独立运行的话,那它是不能作为依赖库供app模块使用的,所以在app模块下的build.gradle文件中需要进行依赖判断


    if (!isApplicationModule1.toBoolean()){

        implementation project(':module1')

    }



    if (!isApplicationModule2.toBoolean()){

        implementation project(':module2')

    }

    if (!isApplicationModule3.toBoolean()){

        implementation project(':module3')

    }



    implementation project(':common')





在模块 Module中引入 common module


    implementation project(':common')





至此通过修改配置,每个Module就可以单独运行。

5. 引入Arouter

由于需要模块之间的解耦,平时的Intent跳转需要导包,而Arouter引入之后,就能在跳转的同时不用导包。

集成Arouter

(1) 引入依赖

common中添加


    api("com.alibaba:arouter-api:$rootProject.ext.arouterLibVersion") { exclude group: 'com.android.support' }

    annotationProcessor "com.alibaba:arouter-compiler:$rootProject.ext.arouterAnnotationLibVersion"





在每个Module下都需要添加注解


annotationProcessor "com.alibaba:arouter-compiler:$rootProject.ext.arouterAnnotationLibVersion"





(2) 每个引入Arouter的Module的build.gradle中加入下面代码


defaultConfig {



        ...



        //arouter

        javaCompileOptions {

            annotationProcessorOptions {

                arguments = [moduleName: project.getName()]

            }

        }

    }



(3) 在Application中进行初始化


       if (isDebug) {

            ARouter.openLog();

            ARouter.openDebug();

        }

        ARouter.init(this);



(4)使用Arouter跳转

定义路由


@Route(path = "/app/main")

public class MainActivity extends AppCompatActivity {

...

}



跳转路由


ARouter.getInstance().build("/app/main").navigation();



6. ButterKnife 的坑

单工程使用这个库是没有问题的,但是在组件化使用的时候就报错了。 除了一系列的配置之外,还有个难受的地方就是需要把Library中的R改成R2,但当你想把Library改成Application时,又要将R2改成R,这岂不是很难受。

!!! 所以我目前放弃在Library中使用ButterKnife

7. switch (view.getId()) 的坑

由于 Library中的view.getId 可能是个变量,所以需要把 switch 改成 if。

快捷操作:

光标移至switch这行代码上,同时按下 alt + Enter, 此时点击 Replace switch to if

8. 资源重复的坑


 No static field XXX of type I in class Lcom/XXX/R$id错误





出现这个问题是layout 和 主布局名字重复了,养成习惯,在Library中资源文件前加上标识,比如 library_layout

另外有一种方法只是帮忙增加约束,提醒。


android {

    compileSdkVersion rootProject.ext.compileSdkVersion

    buildToolsVersion rootProject.ext.buildToolsVersion



    // 增加资源的约束,提醒

    if (toolsIsLibrary.toBoolean()) {

       resourcePrefix "${project.name}_"

    }

}





为了保证不与其他module冲突,建议在string、style、color、dimens 等资源文件都加上前缀。

六、踩坑

1. ARouter 组件化打包不成功

出现问题:Program type already present: com.alibaba.android.arouter.routes.ARouterGroupGroupservice

在ModuleA 和 ModuleB 中不能使用相同的 Group。

根据提示报错 service 就是重复的Group,全局搜索,于是发现在ModuleA 和 ModuleB中都存在以下代码。


package com.bp.tech.common.util;



import android.content.Context;



import com.alibaba.android.arouter.facade.annotation.Route;

import com.alibaba.android.arouter.facade.service.SerializationService;



import java.lang.reflect.Type;



@Route(path = "/service/json")

public class JsonServiceImpl implements SerializationService {



    @Override

    public void init(Context context) {



    }



    @Override

    public <T> T json2Object(String text, Class<T> clazz) {

        return GsonUtils.parseObject(text, clazz);

    }



    @Override

    public String object2Json(Object instance) {

        return GsonUtils.toJsonString(instance);

    }



    @Override

    public <T> T parseObject(String input, Type clazz) {

        return GsonUtils.parseObject(input, clazz);

    }
# 结尾

- 腾讯T4级别Android架构技术脑图;查漏补缺,体系化深入学习提升

![img](https://www.icode9.com/i/ll/?i=img_convert/bf440fcd5a63c0cc2fe7ee9afb017f25.png)

- **一线互联网Android面试题含详解(初级到高级专题)**

> 这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

![img](https://www.icode9.com/i/ll/?i=img_convert/9f1f4e6d0c6429753c283b37a27ca3cd.png)

> 有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

**[CodeChina开源项目:《Android学习PDF+架构视频+面试文档+源码笔记》](https://codechina.csdn.net/m0_60958482/android_p7)**



**《Android学习PDF+架构视频+面试文档+源码笔记》来获取学习资料提升自己去挑战一下BAT面试难关吧**

**为什么免费分享?**

技术脑图;查漏补缺,体系化深入学习提升

[外链图片转存中...(img-8NNL4Sak-1630821113365)]

- **一线互联网Android面试题含详解(初级到高级专题)**

> 这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中...(img-Kd40bPjF-1630821113367)]

> 有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

**[CodeChina开源项目:《Android学习PDF+架构视频+面试文档+源码笔记》](https://codechina.csdn.net/m0_60958482/android_p7)**



**《Android学习PDF+架构视频+面试文档+源码笔记》来获取学习资料提升自己去挑战一下BAT面试难关吧**

**为什么免费分享?**

> 如果设置门槛,很多开发者朋友会因此错过这套高级架构资料,错过提升成为架构师的可能。这就失去了我们的初衷;让更多人都能通过高效高质量的学习,提升自己的技术和格局,升职加薪。

标签:img,金服,project,面试,组件,Android,com,android
来源: https://blog.csdn.net/m0_61068496/article/details/120114145

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有