android模块化

android studio模块化开发 当多个人同时开发一个中大型的安卓项目   为了分工明确  避免代码的耦合性   就要进行模块化开发  在模块化开发的过程中  我们项目组遇到了很多的问题  接下来我将一一阐述以及说明解决方法 1:首先要做架构   建立几个模块 主模块:项目的核心模块  由它来主导程序的走向以及引入各个子模块 接口模块:作为主模块和子模块的交互存在的模块 各个子模块:通用工具类,以及项目的各个部分功能都可 阅读详情

一、前言

万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。” 由此可见模块化之于软件工程领域的重要性。

从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大;为了降低大型软件复杂性和耦合度,同时也为了适应模块重用、多团队并行开发测试等等需求,模块化在 Android 平台上变得势在必行。阿里 Android 团队在年初开源了他们的容器化框架 Atlas 就很大程度说明了当前 Android 平台开发大型商业项目所面临的问题。

二、什么是模块化

那么什么是模块化呢?《 Java 应用架构设计:模块化模式与 OSGi 》一书中对它的定义是:模块化是一种处理复杂系统分解为更好的可管理模块的方式。

上面这种描述太过生涩难懂,不够直观。下面这种类比的方式则可能加容易理解。

我们可以把软件看做是一辆汽车,开发一款软件的过程就是生产一辆汽车的过程。一辆汽车由车架、发动机、变数箱、车轮等一系列模块组成;同样,一款大型商业软件也是由各个不同的模块组成的。

汽车的这些模块是由不同的工厂生产的,一辆 BMW 的发动机可能是由位于德国的工厂生产的,它的自动变数箱可能是 Jatco(世界三大变速箱厂商之一)位于日本的工厂生产的,车轮可能是中国的工厂生产的,最后交给华晨宝马的工厂统一组装成一辆完整的汽车。这就类似于我们在软件工程领域里说的多团队并行开发,最后将各个团队开发的模块统一打包成我们可使用的 App 。

一款发动机、一款变数箱都不可能只应用于一个车型,比如同一款 Jatco 的 6AT 自动变速箱既可能被安装在 BMW 的车型上,也可能被安装在 Mazda 的车型上。这就如同软件开发领域里的模块重用。

到了冬天,特别是在北方我们可能需要开着车走雪路,为了安全起见往往我们会将汽车的公路胎升级为雪地胎;轮胎可以很轻易的更换,这就是我们在软件开发领域谈到的低耦合。一个模块的升级替换不会影响到其它模块,也不会受其它模块的限制;同时这也类似于我们在软件开发领域提到的可插拔。

三、模块化分层设计

上面的类比很清晰的说明的模块化带来的好处:

  • 多团队并行开发测试;
  • 模块间解耦、重用;
  • 可单独编译打包某一模块,提升开发效率。

在《安居客 Android 项目架构演进》这篇文章中,我介绍了安居客 Android 端的模块化设计方案,这里我还是拿它来举例。但首先要对本文中的组件和模块做个区别定义

  • 组件:指的是单一的功能组件,如地图组件(MapSDK)、支付组件(AnjukePay)、路由组件(Router)等等;

  • 模块:指的是独立的业务模块,如新房模块(NewHouseModule)、二手房模块(SecondHouseModule)、即时通讯模块(InstantMessagingModule)等等;模块相对于组件来说粒度更大。

具体设计方案如下图:

 

整个项目分为三层,从下至上分别是:

  • Basic Component Layer: 基础组件层,顾名思义就是一些基础组件,包含了各种开源库以及和业务无关的各种自研工具库;
  • Business Component Layer: 业务组件层,这一层的所有组件都是业务相关的,例如上图中的支付组件 AnjukePay、数据模拟组件 DataSimulator 等等;
  • Business Module Layer: 业务 Module 层,在 Android Studio 中每块业务对应一个单独的 Module。例如安居客用户 App 我们就可以拆分成新房 Module、二手房 Module、IM Module 等等,每个单独的 Business Module 都必须准遵守我们自己的 MVP 架构。

我们在谈模块化的时候,其实就是将业务模块层的各个功能业务拆分层独立的业务模块。所以我们进行模块化的第一步就是业务模块划分,但是模块划分并没有一个业界通用的标准,因此划分的粒度需要根据项目情况进行合理把控,这就需要对业务和项目有较为透彻的理解。拿安居客来举例,我们会将项目划分为新房模块、二手房模块、IM 模块等等。

每个业务模块在 Android Studio 中的都是一个 Module ,因此在命名方面我们要求每个业务模块都以 Module 为后缀。如下图所示:

对于模块化项目,每个单独的 Business Module 都可以单独编译成 APK。在开发阶段需要单独打包编译,项目发布的时候又需要它作为项目的一个 Module 来整体编译打包。简单的说就是开发时是 Application,发布时是 Library。因此需要在 Business Module 的 build.gradle 中加入如下代码:

if(isBuildModule.toBoolean()){
    apply plugin: 'com.android.application'
}else{
    apply plugin: 'com.android.library' } 

isBuildModule 在项目根目录的 gradle.properties 中定义:

isBuildModule=false

同样 Manifest.xml 也需要有两套:

sourceSets {
   main {
       if (isBuildModule.toBoolean()) {
           manifest.srcFile 'src/main/debug/AndroidManifest.xml'
       } else {
           manifest.srcFile 'src/main/release/AndroidManifest.xml'
       }
   }
}

如图:

debug 模式下的 AndroidManifest.xml :

<application
   ...
   >
   <activity android:name="com.baronzhang.android.newhouse.NewHouseMainActivity" android:label="@string/new_house_label_home_page"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> 

realease 模式下的 AndroidManifest.xml :

<application
   ...
   >
   <activity android:name="com.baronzhang.android.newhouse.NewHouseMainActivity" android:label="@string/new_house_label_home_page"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <action android:name="android.intent.action.VIEW" /> <data android:host="com.baronzhang.android.newhouse" android:scheme="router" /> </intent-filter> </activity> </application> 

同时针对模块化我们也定义了一些自己的游戏规则:

  • 对于 Business Module Layer,各业务模块之间不允许存在相互依赖关系,它们之间的跳转通讯采用路由框架 Router 来实现(后面会介绍 Router 框架的实现);
  • 对于 Business Component Layer,单一业务组件只能对应某一项具体的业务,个性化需求对外部提供接口让调用方定制;
  • 合理控制各组件和各业务模块的拆分粒度,太小的公有模块不足以构成单独组件或者模块的,我们先放到类似于 CommonBusiness 的组件中,在后期不断的重构迭代中视情况进行进一步的拆分;
  • 上层的公有业务或者功能模块可以逐步下放到下层,合理把握好度就好;
  • 各 Layer 间严禁反向依赖,横向依赖关系由各业务 Leader 和技术小组商讨决定。

四、模块间跳转通讯(Router)

对业务进行模块化拆分后,为了使各业务模块间解耦,因此各个 Bussiness Module 都是独立的模块,它们之间是没有依赖关系。那么各个模块间的跳转通讯如何实现呢?

比如业务上要求从新房的列表页跳转到二手房的列表页,那么由于是 NewHouseModule 和 SecondHouseModule 之间并不相互依赖,我们通过想如下这种显式跳转的方式来实现 Activity 跳转显然是不可能的实现的。

Intent intent = new Intent(NewHouseListActivity.this, SecondHouseListActivity.class);
startActivity(intent);

有的同学可能会想到用隐式跳转,通过 Intent 匹配规则来实现:

Intent intent = new Intent(Intent.ACTION_VIEW, "<scheme>://<host>:<port>/<path>");
startActivity(intent);

但是这种代码写起来比较繁琐,且容易出错,出错也不太容易定位问题。因此一个简单易用、解放开发的路由框架是必须的了。

 

 我自己实现的路由框架分为 路由(Router)和 参数注入器(Injector)两部分:

Router 提供 Activity 跳转传参的功能;Injector 提供参数注入功能,通过编译时生成代码的方式在 Activity 获取获取传递过来的参数,简化开发。

4.1 Router

路由(Router)部分通过 Java 注解结合动态代理来实现,这一点和 Retrofit 的实现原理是一样的。

首先需要定义我们自己的注解(篇幅有限,这里只列出少部分源码)。

用于定义跳转 URI 的注解 FullUri:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FullUri {
    String value(); } 

用于定义跳转传参的 UriParam( UriParam 注解的参数用于拼接到 URI 后面):

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface UriParam {
    String value(); } 

用于定义跳转传参的 IntentExtrasParam( IntentExtrasParam 注解的参数最终通过 Intent 来传递):

@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface IntentExtrasParam {
    String value(); } 

然后实现 Router ,内部通过动态代理的方式来实现 Activity 跳转:

public final class Router { ... public <T> T create(final Class<T> service) { return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class[]{service}, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { FullUri fullUri = method.getAnnotation(FullUri.class); StringBuilder urlBuilder = new StringBuilder(); urlBuilder.append(fullUri.value()); //获取注解参数 Annotation[][] parameterAnnotations = method.getParameterAnnotations(); HashMap<String, Object> serializedParams = new HashMap<>(); //拼接跳转 URI int position = 0; for (int i = 0; i < parameterAnnotations.length; i++) { Annotation[] annotations = parameterAnnotations[i]; if (annotations == null || annotations.length == 0) break; Annotation annotation = annotations[0]; if (annotation instanceof UriParam) { //拼接 URI 后的参数 ... } else if (annotation instanceof IntentExtrasParam) { //Intent 传参处理 ... } } //执行Activity跳转操作 performJump(urlBuilder.toString(), serializedParams); return null; } }); } ... } 

上面是 Router 实现的部分代码,在使用 Router 来跳转的时候,首先需要定义一个 Interface(类似于 Retrofit 的使用方式):

public interface RouterService {

    @FullUri("router://com.baronzhang.android.router.FourthActivity") void startUserActivity(@UriParam("cityName") String cityName, @IntentExtrasParam("user") User user); } 

接下来我们就可以通过如下方式实现 Activity 的跳转传参了:

 RouterService routerService = new Router(this).create(RouterService.class);
 
 User user = new User("张三", 17, 165, 88); routerService.startUserActivity("上海", user); 

4.2 Injector

通过 Router 跳转到目标 Activity 后,我们需要在目标 Activity 中获取通过 Intent 传过来的参数:

getIntent().getIntExtra("intParam", 0);

getIntent().getData().getQueryParameter("preActivity");

为了简化这部分工作,路由框架 Router 中提供了 Injector 模块在编译时生成上述代码。参数注入器(Injector)部分通过 Java 编译时注解来实现,实现思路和 ButterKnife 这类编译时注解框架类似。

首先定义我们的参数注解 InjectUriParam :

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.CLASS)
public @interface InjectUriParam {
    String value() default ""; } 

然后实现一个注解处理器 InjectProcessor ,在编译阶段生成获取参数的代码:

@AutoService(Processor.class)
public class InjectProcessor extends AbstractProcessor { ... @Override public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) { //解析注解 Map<TypeElement, TargetClass> targetClassMap = findAndParseTargets(roundEnvironment); //解析完成后,生成的代码的结构已经有了,它们存在InjectingClass中 for (Map.Entry<TypeElement, TargetClass> entry : targetClassMap.entrySet()) { ... } return false; } ... } 

使用方式类似于 ButterKnife ,在 Activity 中我们使用 Inject 来注解一个全局变量:

@Inject User user;

然后 onCreate 方法中需要调用 inject(Activity activity) 方法实现注入:

RouterInjector.inject(this);

这样我们就可以获取到前面通过 Router 跳转的传参了。

由于篇幅限制,加上为了便于理解,这里只贴出了极少部分 Router 框架的源码。希望进一步了解 Router 实现原理的可以到 GiuHub 去翻阅源码,Router 的实现还比较简陋,后面会进一步完善功能和文档,之后也会有单独的文章详细介绍。源码地址:https://github.com/BaronZ88/Router

五、问题及建议

5.1 资源名冲突

对于多个 Bussines Module 中资源名冲突的问题,可以通过在 build.gradle 定义前缀的方式解决:

defaultConfig {
   ...
   resourcePrefix "new_house_"
   ...
}

而对于 Module 中有些资源不想被外部访问的,我们可以创建 res/values/public.xml,添加到 public.xml 中的 resource 则可被外部访问,未添加的则视为私有:

<resources>
    <public name="new_house_settings" type="string"/> </resources> 

5.2 重复依赖

模块化的过程中我们常常会遇到重复依赖的问题,如果是通过 aar 依赖, gradle 会自动帮我们找出新版本,而抛弃老版本的重复依赖。如果是以 project 的方式依赖,则在打包的时候会出现重复类。对于这种情况我们可以在 build.gradle 中将 compile 改为 provided,只在最终的项目中 compile 对应的 library ;

其实从前面的安居客模块化设计图上能看出来,我们的设计方案能一定程度上规避重复依赖的问题。比如我们所有的第三方库的依赖都会放到 OpenSoureLibraries 中,其他需要用到相关类库的项目,只需要依赖 OpenSoureLibraries 就好了。

5.3 模块化过程中的建议

对于大型的商业项目,在重构过程中可能会遇到业务耦合严重,难以拆分的问题。我们需要先理清业务,再动手拆分业务模块。比如可以先在原先的项目中根据业务分包,在一定程度上将各业务解耦后拆分到不同的 package 中。比如之前新房和二手房由于同属于 app module,因此他们之前是通过隐式的 intent 跳转的,现在可以先将他们改为通过 Router 来实现跳转。又比如新房和二手房中公用的模块可以先下放到 Business Component Layer 或者 Basic Component Layer 中。在这一系列工作完成后再将各个业务拆分成多个 module 。

模块化重构需要渐进式的展开,不可一触而就,不要想着将整个项目推翻重写。线上成熟稳定的业务代码,是经过了时间和大量用户考验的;全部推翻重写往往费时费力,实际的效果通常也很不理想,各种问题层出不穷得不偿失。对于这种项目的模块化重构,我们需要一点点的改进重构,可以分散到每次的业务迭代中去,逐步淘汰掉陈旧的代码。

各业务模块间肯定会有公用的部分,按照我前面的设计图,公用的部分我们会根据业务相关性下放到业务组件层(Business Component Layer)或者基础组件层(Common Component Layer)。对于太小的公有模块不足以构成单独组件或者模块的,我们先放到类似于 CommonBusiness 的组件中,在后期不断的重构迭代中视情况进行进一步的拆分。过程中完美主义可以有,切记不可过度。

以上就是我在模块化探索实践方面的一些经验,不住之处还望大家指出。

android模块化开发 android模块化开发,模块之间服务的调用,数据通信,插拔式模块 立即下载

相关推荐

校招总结—FPGA从入门到放弃

校招总结—FPGA从入门到放弃 感谢咸鱼FPGA的授权转发,原文地址为https://www.cnblogs.com/xianyufpga/ 其实 offer 早就定下来了,最近忙着入党考试,现在才腾出时间来写个总结。我校招开始于 7 月底,算是比较晚了,后面加了各大校招交流群,发现很多同学都是过完年后就开始打磨项目、复习基础、寻找实习。对比之下我这准备确实仓促,不过结果还算满意。 ...

qq_31515205的博客 8605

Android 模块化探索与实践

本文首发于《程序员》杂志五月刊,此版本有部分纠错与调整 一、前言 万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石;分布式和容错性是互联网的生命。” 由此可见模块化之于软件工程领域的重要性。 从 2016 年开始,模块化在 Android 社区越来越多的被提及。随着移动平台的不断发展,移动平台上的软件慢慢走向复杂化,体积也变得臃肿庞大;为了降低...

weixin_34290000的博客 206

USB3.0/3.1信号完整性分析仿真

• 1.了解USB3.0通路的互连关系,解读原理图接口电路和PCB的互连电路。对USB布线的通路及阻抗进行检查和分析。 • 2.使用USB3.0实例文件提取互连线的S参数,选择SSRX+,SSRX-,SSTX+,SSTX-,D+,D-组的互连线,使用PowerSI,Clarity,3DFEM等工具提起关键网络的S参数。提取S参数以后需要分析S参数的互连特征,对S参数的结果开展评价。 • 3.使用SYSTEM SI USB3 Compliance工程向导模型,建立USB仿真实例框架,在框架BOLCK中带入S参

小猪配齐电子设计 1万+

Android模块化开发架构

安卓模块化开发架构

Manly_Ford 1257

微信DAT图片恢复全攻略:从文件路径到批量解密(附最新工具下载)

本文详细介绍了微信DAT图片恢复的全过程,从文件路径定位到批量解密操作,帮助用户高效恢复加密存储的图片。文章涵盖新旧版本微信的存储结构差异,推荐使用专业解密工具进行批量转换,并提供了提升恢复成功率的实用技巧和常见问题解决方案。

weixin_29325007的博客 455

极验第四代滑块验证码破解(三):滑块轨迹构造

极验第四代滑块验证码破解(三):滑块轨迹构造声明 声明 原创文章,请勿转载! 本文内容仅限于安全研究,不公开具体源码。维护网络安全,人人有责。 本文关联文章超链接:

帯泪的鱼的博客 8624

Android应用模块化开发指南

Android 模块化指南,模块化优点、模块化原则、模块类型及最佳实践。

虎哥LoveDroid 1847

VSCode 远程开发:实现服务器图形化界面(GUI)的高效操作指南

本文详细介绍了如何通过VSCode远程开发实现服务器图形化界面(GUI)操作,包括X11转发原理、完整配置指南和实战测试。通过安装Xming、配置SSH连接和服务器端设置,开发者可以高效地在本地显示远程GUI应用,提升开发效率。

weixin_29245767的博客 292

Android 模块化开发

概述 单独开发每个模块,用集成的方式把他们组合起来,拼出一个app。如通用的模块,自动更新的模块,反馈模块,推送模块都可以单独以模块来开发,最后进行集成。我们可以通过一个壳来包含很多个模块。 好处 可以单独升级模块。耦合度低。同时,也很好地解决了“牵一发而动全身”的问题。方便分工。与其他团队合作时,如外包的团队,可以很好的地将核心代码与外包部分隔离开,不用和他们分享核心代码,让他们去做独立的功能,...

weixin_40763897的博客 3988

【ROS机器人系统】自主导航+YOLO目标检测+语音播报

完成自主导航功能,并在小车移动至指定地点的过程中,通过机器人的摄像头检测导航途中所见物体,识别出物体的种类(框选出不同物体并标注识别结果),结合科大讯飞语音合成模块对识别结果进行语音播报。..............................

南京大学软件工程硕士在读 2万+

实现敌人跟随玩家。(Unity)

首先和玩家设置一模一样,给敌人添加一个刚体,设置一个碰撞器,并设置一个触发器。然后在对场景里面的组件添加导航网格代理并且进行bake烘焙,那样的话敌人就可以在进行烘焙的位置进行移动。创建脚本,并且挂载脚本到敌人的组件上,用代码进行实现效果,并且要挂载目标对象。

weixin_57813136的博客 1869

Android模块化开发

组件化开发项目搭建 1.为什么要组件化开发 随着APP版本不断的迭代,新功能的不断增加,业务也会变的越来越复杂,APP业务模块的数量有可能还会继续增加,而且每个模块的代码也变的越来越多,这样发展下去单一工程下的APP架构势必会影响开发效率,增加项目的维护成本,每个工程师都要熟悉如此之多的代码,将很难进行多人协作开发,而且Android项目在编译代码的时候电脑会非常卡,又因为单一工程下代码耦合严重,每修改一处代码后都要重新编译打包测试,导致非常耗时,最重要的是这样的代码想要做单元测试根本无从下手,所以必须

MMsmileNN的博客 1621

第229篇 轨迹时间参数化——TOPP-RA和速度约束处理

本文介绍了时间最优路径参数化(TOPP)问题及其解法。TOPP研究如何在给定空间路径上分配时间,使机器人运动时间最短且不超速,需满足速度、加速度和力矩约束。经典解法采用相平面法,通过前向和后向扫描确定最优速度曲线。TOPP-RA改进了数值稳定性,支持多约束处理。文章对比了TOPP与轨迹优化的区别,列举了开源工具,并解答了面试常见问题,指出TOPP广泛应用于机械臂、AGV等领域。TOPP不改变路径形状,仅优化速度分配,其最优解具有bang-bang特性。

郑伟强dev的专栏 321

Android模块化

标题重点内容 二维火Android云收银模块化实践 总结一波安卓组件化开源方案 标题

ThePromonkeyOf_HeLuo的博客 431

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

安卓APP模块化开发指南

本文讨论手机开发的模块化问题,模块化的优点与缺点,是否适合我们等。

红孩儿编程大师 774

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

安卓开发之模块化、组件化设计

/ 执行跳转 } });if (rootProject.ext.isModule) { apply plugin: 'com.android.application' //指定为独立运行的应用 } else { apply plugin: 'com.android.library' //库 } defaultConfig { if (rootProject.ext.isModule) { applicationId "com.ls.fuser"//如果独立运行 需要提供applicationId } }

qq_62618558的博客 1489

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

推荐文章:探索未来安卓开发新境界 —— Android模块化的深度实践《关于Android模块化我有一些话不知当讲不当讲》

推荐文章:探索未来安卓开发新境界 —— Android模块化的深度实践《关于Android模块化我有一些话不知当讲不当讲》 随着移动应用的日益复杂,开发者们越来越关注如何让代码更加高效、维护更便捷。而Android平台上的模块化实践,无疑是通往这一目标的重要途径之一。今天,我们要深入探讨的是一个以此为核心理念的开源项目——《关于Android模块化我有一些话不知当讲不当讲》,由开发者“Liushu...

gitblog_00527的博客 969

关于Android模块化开发介绍及使用

模块化浅谈: 1、安卓模块化开发介绍: 模块化开发思路就是:单独开发每个模块,用集成的方式把他们组合起来,就能拼出一个app。app可以理解成很多功能模块的组合,而且有些功能模块是通用的,必备的,像自动更新,反馈,推送,都可以提炼成模块,和搭积木很像,由一个壳包含很多个模块。 2、模块化开发的好处: 我们的应用在更新的时候有时候并不需要整个应用一起更新,这样为了一个很小的更新,却要动辄修改整个项...

怪咖小白的博客 3134

安卓模块化开发

上一篇讲了这4年来对安卓兼各种容性的看法及解决方法,下面讲一下安卓项目的架构。 注明:这里说的架构只是项目级别的不涉及代码 这个开发框架适用于中大型项目基于模块式开发,各个模块相互独立互相不影响。 在思想上主要分三步: 抽离公共数据抽离公共View抽离功能模块 公共数据(CommonLib)包含BaseActivity BaseModel BaseFragement Base

taojinsha的专栏 441

LSPatch终极指南:无需Root权限的安卓模块化神器

在安卓应用开发领域,模块化扩展一直是开发者追求的目标。传统的Xposed框架需要Root权限,这让很多普通用户望而却步。现在,一个革命性的解决方案出现了——LSPatch,它完美实现了无需Root权限的模块化功能扩展。 ## 为什么选择LSPatch?核心优势解析 LSPatch的最大亮点在于它彻底摆脱了Root权限的限制。通过创新的技术手段,它能够将模块代码直接注入到目标应用中,实现功能的动

gitblog_00315的博客 412

安卓常见面试题知乎,一文理解模块化,Android多线程断点续传

这里我特地整理了一份《Android开发核心知识点笔记》,里面就包含了自定义View相关的内容除了这份笔记,还给大家分享Android学习PDF+架构视频+面试文档+源码笔记,高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。非常适合近期有面试和想在技术道路上继续精进的朋友。分享上面这些资源,希望可以帮助到大家提升进阶,如果你觉得还算有用的话,不妨把它们推荐给你的朋友~喜欢本文的话,给我点个小赞、评论区留言或者转发支持一下呗~本文已被。

m0_74931167的博客 434

安卓android编译,安卓Android模块化编译的方法详解介绍

1、我们平常在编译Android源码,有时并不需要编译整个Android源码,而只需要编译模个模块,这是可以使用mmm工具来编译。其使用方法是:mmm ,如编译frameworks下的所有文件,则可以这样子:. build/envsetup.sh && choosecombo 1 1 2 3 &&export ANDROID_JAVA_HOME=$JAVA_HOME...

weixin_29120409的博客 633

Android 模块化

1、 创建项目、创建几个模块,比如下面几个模块 common_core创建是androidlib类型的,它是核心模块比如你封装的网络请求,还有通用的工具类,common_bussiness也是androidlib类型的,这里是你的业务模块公共的部分,而index_module是module类型的,是具体的业务模块这里只是举个例子,像常见的有用户模块(注册登录)我的模块(用户信息、设置等) 2、 ...

danfengw的博客 920

Android组件化、模块化、插件化

将一个完整的工程,按业务划分为不同的插件,都是分治法的一种体现。组件更多的是从自下而上的视角,按照技术实现的思维划分实现代码,并将这些代码组装成一个app。本来就是不同的apk, 你把微信的朋友圈,聊天,通讯录单独做一个完全独立的app, 需要微信的时候插在一起,就是一个大型的app了。模块化编程是一种软件设计技术,强调将程序的功能分离为独立的可互换模块,因此每个模块都包含仅执行所需功能的一个方面所需的一切。能做的只是, 朋友圈已经有了,我想单独调试,维护,和别人不耦合,但是和整个项目还是有关联的。

lhm1124的博客 1307

安卓 AAC 框架,全 Kotlin 开发,模块化。

qsos-aac 项目地址:hslooooooool/qsos-aac 简介: 安卓 AAC 框架,全 Kotlin 开发,模块化。 更多:作者提 Bug 标签: 项目介绍 安卓 AAC 框架,完全由 Kotlin 编写、模块化。 集成 RxJava、Retrofit、ARouter、Room、Lifecycle 等常用框架。 已有业务 图虫 待加入业务 二维...

未来很长,但我会努力的走下去。 534

Android 架构 - 模块化 Modularization

模块指 Android 项目中的 module,通常会包含 Gradle 构建脚本、源代码、资源等,模块可以独立构建和测试。相反,如果一个模块的两个部分不经常交互,它们可能应该是单独的模块。:数据模块的公共 API 应该是 Repository,因为它们负责将数据公开给 App 的其余部分。:工具类,也称为帮助类,通常是在应用程序中重用的小段代码。:网络库模块,通常是对三方网络库(如 OhHttp)的封装,简化自定义配置时,减少不必要的重复代码。也称为核心模块或者基础模块,包含其他模块经常使用的代码。

HugMua的博客 1187
上一篇: 自定义Toas
下一篇: 计算apk的启动时间并且进行优化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值