馨晴 發表於 2022-8-11 13:07:00

Android模块化开发实例

<p>第一部分 :设计项目架构,我这边创建了三个模块,app模块为项目的主界面,上面有两个按钮,分别来调用另外两个模块,通过按钮实现</p>
<p>主要项目结构为</p>
<p><img src="https://img2022.cnblogs.com/blog/1629802/202208/1629802-20220811110000293-946883361.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;这个界面是app的发布,两个按钮分别调用另外两个模块,在debug版另外两个模块是独立板块,可以运行。但是在整个项目的发布的时候,我们需要将另外的两个模块打包为library,统一通过app模块进行一个调用。<img src="https://img2022.cnblogs.com/blog/1629802/202208/1629802-20220811110106992-1597561788.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;我们需要新建一个gradle文件,进行一个测试版和发布板的控制以及第三方库依赖的一个管理,我们将这些模块的第三库抽离出来,模块进行调用,这样我们就能够更好的管理三方库的一个版本问题,避免了代码冗余和一个循环依赖的问题。新建的gradle文件如下。</p>
<pre>ext{<br>    isRelease=false<br><br>    androidx=[<br>            ktx:"androidx.core:core-ktx:1.7.0",<br>            appcompat:"androidx.appcompat:appcompat:1.3.0",<br>            material:"com.google.android.material:material:1.4.0",<br>            constraintlayout:"androidx.constraintlayout:constraintlayout:2.0.4"<br><br>    ]<br>    test=[<br>            junit: "junit:junit:4.13.2",<br>            junit_android:"androidx.test.ext:junit:1.1.3",<br>            espresso:"androidx.test.espresso:espresso-core:3.4.0"<br>    ]<br>}<br><br><br>我们需要用这个gradle必须通过项目的gradle进行引入,在项目的gradle文件中加上你想要引入的gradle文件,如下所示</pre>
<pre>apply from:'xlc.gradle'<br><br></pre>
<p>在app-setting模块和vedio模块的gradle文件中,我们会利用是否是发布坂本进行一个判断。如下所示</p>
<p>这部分判断该模块是测试版还是发布版本,如果是发布板,该模块就是一个lib,不能独立运行,可以通过app模块进行一个统一的调用,如果该模块是一个测试版,他就是一个独立的应用,这个模块就可以单独的去运行,方便我们进行一个模块间的一个调试</p>
<pre>plugins.apply('org.jetbrains.kotlin.android')<br>if (isRelease){<br>    plugins.apply("com.android.library")<br>}else {<br>    plugins.apply('com.android.application')<br>}<br><br><br>这个地方是安卓的默认配置,但是在独立模块中他不需要就行判断,当他是一个发布版本,他的应用id就不能跟app模块的应用id有一个重复,也可以这样理解,一个完整的应用只能有一个应用id号码。</pre>
<pre>android {</pre>
<pre>    defaultConfig {<br>      if (!isRelease){<br>            applicationId "com.example.app_setting"<br>            versionCode 1<br>            versionName "1.0"<br>      }<br>    }<br>}<br><br><br>这个地方我们需要进行一个判断,因为当项目为发布版本的时候,其他的两个模块将会变成两个lib,供app模块进行一个调用,故我们引入这两个依赖的时候也要进行一个判断,我们将在app的gradle文件中<br>进行一个依赖的判断,如果是发布版本,就依赖这两个库,如果不是,就不进行一个引用。</pre>
<pre>dependencies {<br>    dependencies {<br>      implementation androidx.ktx<br>      implementation androidx.appcompat<br>      implementation androidx.material<br>      implementation <span style="color: rgba(0, 0, 0, 1)">androidx.constraintlayout</span><br>      testImplementation test.junit<br>      androidTestImplementation test.junit_android<br>      androidTestImplementation test.espresso<br>    }<br><span style="color: rgba(255, 0, 255, 1)">if (isRelease){</span><br><span style="color: rgba(255, 0, 255, 1)">      implementation project(':app-setting')</span><br><span style="color: rgba(255, 0, 255, 1)">      implementation project(':app-video')</span><br><span style="color: rgba(255, 0, 255, 1)">    }</span><br>}<br><br></pre>
<p>我们只需要更改gradle的isRelease的属性就可以进行一个版本控制。测试版和发布版的区别如下</p>
<img src="https://img2022.cnblogs.com/blog/1629802/202208/1629802-20220811112735750-368829104.png">
<p>&nbsp;</p>
<p>&nbsp;<img src="https://img2022.cnblogs.com/blog/1629802/202208/1629802-20220811112814136-653353509.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>一个比较关键的地方,当我们修改了gradle的配置信息,我们一定记得同步,不然配置的信息无法生效,项目的版本控制到这里结束啦。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>第二部分,实现第三方依赖的统一管理,我们还是在刚刚的那个配置文件里面进行配置</p>
<pre>androidx=[<br>      ktx:"androidx.core:core-ktx:1.7.0",<br>      appcompat:"androidx.appcompat:appcompat:1.3.0",<br>      material:"com.google.android.material:material:1.4.0",<br>      constraintlayout:"androidx.constraintlayout:constraintlayout:2.0.4"<br><br>]<br>test=[<br>      junit: "junit:junit:4.13.2",<br>      junit_android:"androidx.test.ext:junit:1.1.3",<br>      espresso:"androidx.test.espresso:espresso-core:3.4.0"<br>]<br>这是项目默认的七个三方库,我们将他们写到gradle中,其他模块的gradle进行调用,注意这是一个依赖的分类,分为Androidx和test两个大类,这两个大类都是map的结构。<br>我们将app-setting的gradle的依赖进行一个更改,使他能够应用到我们配置的gradle文件。三个模块的依赖部分大致相同,我们举例一个。</pre>
<pre>dependencies {<br>    implementation androidx.ktx<br>    implementation androidx.appcompat<br>    implementation androidx.material<br>    implementation androidx.constraintlayout<br>    testImplementation test.junit<br>    androidTestImplementation test.junit_android<br>    androidTestImplementation test.espresso<br>}<br>这样我们通过类型名加上map的key就能够取到依赖了<br><br></pre>
<p>&nbsp;第三部分,我们会发现setting模块和vedio模块的gradle大致相同,要是模块多起来也会造成大量的冗余,所以我们需要提取相同的一个部分,抽离成一个gradle,保留不同的部分,后续我们如果需要进行一个项目配置的更改,我们修改这一个gradle文件即可。这个gradle命名2为common.gradle,因为这是一个公共的gradle。</p>
<pre>plugins.apply('org.jetbrains.kotlin.android')<br>if (isRelease){<br>    plugins.apply("com.android.library")<br>}else {<br>    plugins.apply('com.android.application')<br>}<br>android {<br>    compileSdk 32<br><br>    defaultConfig {<br>      minSdk 28<br>      targetSdk 33<br>      testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"<br>    }<br><br>    buildTypes {<br>      release {<br>            minifyEnabled false<br>            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'<br>      }<br>    }<br>    compileOptions {<br>      sourceCompatibility JavaVersion.VERSION_1_8<br>      targetCompatibility JavaVersion.VERSION_1_8<br>    }<br>    kotlinOptions {<br>      jvmTarget = '1.8'<br>    }<br>}<br><br>dependencies {<br>    implementation androidx.ktx<br>    implementation androidx.appcompat<br>    implementation androidx.material<br>    implementation androidx.constraintlayout<br>    testImplementation test.junit<br>    androidTestImplementation test.junit_android<br>    androidTestImplementation test.espresso<br>}</pre>
<p>setting模块的gradle和video模块的gradle如下所示。</p>
<pre>apply from:'../x.gradle'<br>android {<br>    defaultConfig {<br>      if (!isRelease){<br>            applicationId "com.example.app_setting"<br>            versionCode 1<br>            versionName "1.0"<br>      }<br>    }<br>}<br>dependencies {<br>}</pre>
<pre>apply from:'../x.gradle'<br>android {<br>    defaultConfig {<br>      if (!isRelease){<br>            applicationId "com.example.app_video"<br>            versionCode 1<br>            versionName "1.0"<br>      }<br>    }<br>}<br>dependencies {<br>}</pre>
<p>&nbsp;</p>
<p>最后,这个分模块开发的一些步骤如上,如果出现问题,可能是<em id="__mceDel" style="font-family: &quot;Courier New&quot;; font-size: 12px">compileSdk的版本有问题,如遇到了不可解决的问题:可咨询笔者的QQ:2644277747.</em></p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/smile908/p/16575704.html
頁: [1]
查看完整版本: Android模块化开发实例