Android 组件化实战

转载请注明链接:https://blog.csdn.net/feather_wch/article/details/82706899

Android 组件化实战

版本号: 2019/2/2-1(0:14)



不论述组件化的基本功能。

利用ARouter框架来实现项目的组件化。

项目模块的拆分

1、项目拆分为三大部分

  1. 第一部分:app,也就是壳工程。
  2. 第二部分:通用library,这里拆分为两个。
    1. lib_base: 通用模块,一些封装好的通用接口。
    1. lib_res: 资源库。放置通用图片、assets、xml等通用的资源文件。
  3. 第三部分: 组件,根据业务进行划分。
    1. module_remind: 直播提醒、订阅、预约等。
    1. module_home: 首页相关业务

项目模块的详细拆分

1、项目最外层下的gradle.properties来控制整个项目编译和独立测试的开关

  1. 需要通过开关,来进行各个模块、通用库的独立测试
#是否需要测试通用lib库,true-开启独立测试 false-不开启
isTesting_lib_base = true

#是否测试直播提醒、追剧预约、新片预约等相关功能。
isTesting_module_remind = true

lib_base

1、lib_base的作用和需要配置的内容

  1. lib_base所有Module需要用的基本库
  2. 用于提供基本的接口、通用工具等内容。
  3. 引入并且配置ARouter(路由框架)

2、lib_base的build.gradle

1-通过开关来选择是application模式,还是library模式。

// 开启测试,就采用application进行独立运行
if(isTesting_lib_base.toBoolean()){
    apply plugin: 'com.android.application'
}else{
    // 没有开启测试就作为library
    apply plugin: 'com.android.library'
}

2-需要和主app选择一致的API版本和库的版本

android {
    // 需要和app一致
    compileSdkVersion 23
    buildToolsVersion '25.0.0'

    // 需要和app一致
    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 28
        //...

    }
}
dependencies {
    // 需要和app一致
    compile 'com.android.support:appcompat-v7:24.0.0'
    //...
}

AS3.3需要使用api

3、Android Studio 3.3中lib引用的基础库需要使用api才能被其他module引用这些基本库

// 例如
    api 'androidx.appcompat:appcompat:1.1.0-alpha01'
    api 'androidx.constraintlayout:constraintlayout:1.1.3'

module

module_remind

1、module_remind需要如何配置?

  1. 配置build.gradle
  2. 配置AndroidManifest
  3. 创建TestActivity,用于独立测试时运行。

2、module的build.gradle

1-通过开关来选择是application模式,还是library模式。

// 开启测试,就采用application进行独立运行
if (isTesting_module_remind.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    // 没有开启测试就作为library
    apply plugin: 'com.android.library'
}

2-参考lib_base,需要和主app一致。

compileSdkVersion 23
buildToolsVersion '25.0.0'

minSdkVersion 17
targetSdkVersion 28

compile 'com.android.support:appcompat-v7:24.0.0'

Module如何能独立运行?

Module的独立运行,需要去额外配置。

1、Module能独立运行需要配置哪几个东西?

  1. 创建TestActivity,用于测试盒独立运行。
  2. 配置AndroidManifest,让TestActivity作为启动的Activity
  3. gradle.build需要正确配置开关、API版本

2、新建TestActivity

package com.zte.iptvclient;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.zte.iptvclient.module_remind.R;

public class TestActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}

3、AndroidManifest配置Activity和Theme

  1. Activity设置为LAUNCHER activity
  2. Theme要指定为@style/Theme.AppCompat.Light.NoActionBar,不然会崩溃。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.zte.iptvclient.module_remind">
    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name=".TestActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
            <intent-filter>
                <category android:name="android.intent.category.LAUNCHER"/>
                <action android:name="android.intent.action.VIEW"/>
                <action android:name="android.intent.action.MAIN"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

4、build.gradle的配置

// 开启测试,就采用application进行独立运行
if (isTesting_module_remind.toBoolean()) {
    apply plugin: 'com.android.application'
} else {
    // 没有开启测试就作为library
    apply plugin: 'com.android.library'
}

android {
    compileSdkVersion 23
    buildToolsVersion '25.0.0'

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.0.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
    compile project(':lib_res')
}
module_home

报错/故障

No resource found that matches the given name

错误信息:

Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.

原因:

新建的Module里面采用了高版本的API, 如下:

compile 'com.android.support:appcompat-v7:28.+'

解决办法:

选择低API版本的库

compile 'com.android.support:appcompat-v7:24.0.0'

You need to use a Theme.AppCompat theme

错误信息:

Caused by: java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity.

应用安装后具有多个图标

1、应用安装后app+4个lib,正常情况是1个图标,结果有5个图标

1-需要将AndroidManifest分为两个
2-src/main/debug 下放置module独立编译时的AndroidManifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hao.lib_base">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".TestActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

3-src/main/ 下放置统一构建使用的AndroidManifest(移除LAUNCHER相关部分)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.hao.lib_base">

    <application android:theme="@style/AppTheme">
        <activity android:name=".TestActivity">
        </activity>
    </application>
</manifest>

4-修改build.gradle,选择合适的AndroidManifest.xml(记住debug目录不允许为src/debug会导致exclude失效,我将其放置到main文件夹中src/main/debug才能有效地清除)

    sourceSets {
        main {
            if (isTestingLibBase.toBoolean()) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/AndroidManifest.xml'
                java {
                    //全部Module一起编译的时候剔除debug目录
                    exclude 'src/main/debug/'
                }
            }
        }
    }

ARouter::There is no route match the path

解决办法:

  1. 不同Module的一级目录(group)不能相同

Fragment前后覆盖多层,都可以看见。

解决办法:

  1. 系统默认Fragment背景为透明
  2. add多个Fragment后会依次按顺序展示,需要给Fragment主动设置背景色。

参考资料

  1. 使用阿里ARouter路由实现组件化(模块化)开发流程
  2. ARouter组件化项目-源码参考
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猎羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值