<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                文檔當前狀態:**beta0.4** * [x] 選題收集:2017/11/21 * [x] 初稿整理: * [ ] 補充校對: * [ ] 入庫存檔: --- 之前已經整體的對組件化框架進行了概述,這篇文章只針對組件化的編譯腳本的配置進行詳述。 在概覽的時候,我們提出了幾個目標:可復用、熱插拔、靈活發布。 那么,如何才能算是可靈活發布呢? 1、組件可以獨立運行 2、組件可以獨立發布 3、組件有獨立的版本 ### 組件可以獨立運行 組件可以獨立運行,就是說在有時候 Module 可以以libary運行,有時候可以以application運行,為了實現這些目標,以下的這些使我們需要改動的。 * 自動選擇android plugin——application或libary * 自動引入ApplicationId * 自動匹配不同環境時的AndroidMenifest文件 * 代碼隔離:組件在單獨運行時的測試代碼以及資源等應該與核心發布代碼進行隔離 * 自動匹配依賴項 首先,為了區分不同運行環境:Application或Libary,我們需要在build.gradle 引入一個布爾值 **isApp**。 最開始,我們添加了兩個配置文件 config.gradle和configpersonal.gradle: * **config.gradle**:主要對各個模塊的依賴版本號進行 統一管理,團隊的全體成員應該同一份該文件; * **configpersonal.gradle**:主要是對不同模塊 進行 模式切換的統一配置文件,方便管理。初始化后,不應再commit該文件的改動,以避免不必要的沖突; 此外,因為settings.gradle 是gradle run最先運行的幾個文件之一,暫時沒有發現可以通過在其他文件中 配置一個布爾值,來自動 include對應的module,只能手動開關注釋來處理。 好啦現在我們通過一份具體的build.gradle 里了解我們所需要的解決的問題。完整版本的build.gradle 可以查看最下面的build.gradle. 為了獲取configpersonal.gradle中 指定module的運行模式,這里定義了 isApp的全局變量,用于獲取configpersonal中的值。后續moudle的build.gradle都會依賴這個布爾值。 ~~~ def isApp = rootProject.isApplication_ModuleD ~~~ 首先,我們通過isApp 來選擇對應的 android plugin: ~~~ if (isApp) { apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' } ~~~ 接著處理 在libary中不能使用applicationId的問題: ~~~ ... android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion defaultConfig { if (isApp) applicationId "com.example.app.moduled" ... } } ~~~ 再來處理 不同狀態時,AndroidMenifest.xml和java、res的配置: ~~~ //***************************不同build下,Module代碼文件 sourceSets { main { if (isApp) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' java.srcDirs = ['src/main/java', 'src/main/java-debug'] res.srcDirs = ['src/main/res', 'src/main/res-debug'] } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' } } } ~~~ 相關說明: * java文件夾存放Module的正常源代碼文件 * java-debug存放Module單獨運行時的額外源代碼文件 * res存放Module的正常資源文件 * res-debug存放Module單獨運行時的額外資源文件 * release/AndroidManifest.xml存放Module的正常配置信息 * debug/AndroidManifest.xml存放Module單獨運行的配置信息,要包括AndroidManifest.xml的所有內容。 需要特別注意的地方: 1. java文件夾中的類不能調用java-debug中的類,因為java-debug中的類在作為library發布的時候是非源碼文件夾,不參與編譯,編譯時會報錯。而java-debug文件夾的類可以隨意引用java中的類。java文件夾與java-debug文件夾不能出現重復的類。 2. res文件夾中的資源不能引用res-debug文件夾中的資源,原因同上,并且不能出現重復的資源。 3. debug/AndroidManifest.xml中必須包含所有release/AndroidManifest.xml中的配置信息,并且可以隨意添加其他信息。原因同上。 最后我們在java-debug中添加我們的測試入口類TestActivity.java,在res-debug中添加測試layout文件activity_test.xml,在debug/AndroidManifest.xml中設置TestActivity為Main入口。 最后,不用狀態時,依賴關系也需要分別處理 ,比如Arouter插件的問題: ~~~ if(isApp) compile 'com.alibaba:arouter-api:x.x.x' annotationProcessor 'com.alibaba:arouter-compiler:x.x.x' ~~~ ## 參考: * [組件化開發:build.gradle配置](http://www.jianshu.com/p/9620a40c203f) * [android模塊化簡單教程](http://www.wxdroid.com/index.php/4048.html) 和java、res的配置: ~~~ ~~~ --- ## 附件: settings.gradle ~~~ //根據自己的需要打開/關閉對應的module //used for team release //include ':app', ':ModuleA', ':ModuleB', ':ModuleC', ':ModuleD' // only for ModuleD debug used include ':ModuleD' ~~~ --- config.gradle ~~~ //公共配置信息,依賴版本,統一管理 ext { //通用build 版本 android = [ compileSdkVersion: 26, buildToolsVersion: "26.0.2", minSdkVersion : 21, targetSdkVersion : 22, versionCode : 10, versionName : "6.0" ] //公共依賴 supportV4_Ver = "25.2.0" supportV7_Ver = "25.2.0" supportV13_Ver = "25.2.0" constraint_layout_Ver = "1.0.2" leakcanary_Ver = "1.5" okhttp3_Ver = "3.8.0" gson_Ver = "2.3.1" glide_Ver = "3.7.0" eventbus_Ver = "3.0.0" rxjava_Ver = "2.0.8" rxandroid_Ver = "2.0.1" retrofit_Ver = "2.2.0" alibaba_arouter_Ver ="1.2.1.1" alibaba_arouter_compiler_Ver ="1.1.2.1" } ~~~ --- configpersonal.gradle ~~~ //個人配置項,用于個人定制項目 ext { /** * 移除不必要的gradle task ,加快build速度 */ isRemoveSomeTask = true /** * 本地編譯 配置項目 * isApplication_Main = true 表示 將 main Module 編譯為application * 1.main 為false時,需要注釋applicationid(調試自己module時,最后setting注釋掉) * 2.main 為ture時,其依賴的子module 不能為true, 如libary、baseModule(緣由-application 不能依賴 application) * 3.子module為Application時,最后在setting中把 不必要的給注釋掉 */ modulesBuildMode = [ isApplication_app = true, isApplication_ModuleA = false, isApplication_ModuleB = false, isApplication_ModuleC = false, isApplication_ModuleD = false, ] } ~~~ 項目的root build.gradle ~~~ // Top-level build file where you can add configuration options common to all sub-projects/modules. apply from: "config.gradle" apply from: "configpersonal.gradle" buildscript { repositories { //maven 私服地址,如不能使用,嘗試切換到maven.aliyun maven { url 'http://10.10.4.43:8083/repository/maven-public/' } // maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } } dependencies { classpath 'com.android.tools.build:gradle:3.0.1' } } allprojects { repositories { //maven 私服地址,如不能使用,嘗試切換到maven.aliyun maven { url 'http://10.10.4.43:8083/repository/maven-public/' } // maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } flatDir { dirs '../Library/libs' dirs '../FingerPrintModule/libs' dirs '../UpdateLib/libs' } } //全局配置,移除不必要的gradle task,加快編譯 if (rootProject.ext.isRemoveSomeTask) gradle.taskGraph.whenReady { tasks.each { task -> if (task.name.contains("lint") //如果instant run不生效,把clean這行干掉 //||task.name.equals("clean") //如果項目中有用到aidl則不可以舍棄這個任務 || task.name.contains("Aidl") //用不到測試的時候就可以先關閉 || task.name.contains("mockableAndroidJar") || task.name.contains("UnitTest") || task.name.contains("AndroidTest") //用不到NDK和JNI的也關閉掉 || task.name.contains("Ndk") //|| task.name.contains("Jni") ) { task.enabled = false } } } } ~~~ ModuleD的build.gradle ~~~ def isApp = rootProject.isApplication_ModuleD if (isApp) { apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' } android { compileSdkVersion rootProject.ext.android.compileSdkVersion buildToolsVersion rootProject.ext.android.buildToolsVersion defaultConfig { if (isApp) applicationId "com.example.app.moduled" minSdkVersion rootProject.ext.android.minSdkVersion targetSdkVersion rootProject.ext.android.targetSdkVersion versionCode rootProject.ext.android.versionCode versionName rootProject.ext.android.versionName //項目只是使用armeabi情況下,為避免產生不必要的.so文件夾 //在gradle.properties中添加 android.useDeprecatedNdk=true,并在defaultConfig中添加以下代碼 // 如支持更多平臺,abiFilters "armeabi", "armeabi-v7a", "x86" ndk { abiFilters "armeabi-v7a" } javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } //自定義BuildConfig,添加一個 字段 IS_DEBUG //主要是為了處理gradle插件2.x module中的BuildConfig.DEBUG 值異常的bug,3.0修復了這個問題 //gradle插件 2.x使用以下進行依賴 //debugCompile project(path: ':GlxssModule', configuration: 'debug') //releaseCompile project(path: ':GlxssModule', configuration: 'release') //gradle插件 3.0 后,僅使用一行即可,implementation或api //api project(':GlxssModule') publishNonDefault true buildTypes { debug { minifyEnabled false buildConfigField "boolean", "IS_DEBUG", "true" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } release { minifyEnabled false buildConfigField "boolean", "IS_DEBUG", "false" proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } //***************************不同build下,Module代碼文件 sourceSets { main { if (isApp) { manifest.srcFile 'src/main/debug/AndroidManifest.xml' java.srcDirs = ['src/main/java', 'src/main/java-debug'] res.srcDirs = ['src/main/res', 'src/main/res-debug'] } else { manifest.srcFile 'src/main/release/AndroidManifest.xml' } } } //資源文件名前綴約束,避免發布release時可能重名的問題 resourcePrefix "glxss_" } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile "com.android.support:appcompat-v7:$rootProject.ext.supportV7_Ver" compile "com.android.support.constraint:constraint-layout:$rootProject.ext.constraint_layout_Ver" compile "org.greenrobot:eventbus:$rootProject.ext.eventbus_Ver" if(isApp) compile 'com.alibaba:arouter-api:x.x.x' annotationProcessor 'com.alibaba:arouter-compiler:x.x.x' } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看