日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器

發布時間:2025/3/20 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.背景介紹

??在移動端項目功能不斷完善和豐富的過程中我們一直在尋找一種可以高效開發且復用率高的開發模式,特別是多應用同步開發、管理。

??在開發過程中你是否遇到需要發布影子工程?新建項目是否需要耗費大量時間將原有基類、工具類、第三方通用類庫逐個 copy 進新項目中?在項目不斷迭代后是否發現編譯時間不斷增加?

??組件化開發可以很好的解決上述問題,它實際是將一個完整的項目劃分為若干個模塊,過程類似搭積木,一個一個拼接,你可以單獨使用其中任意一個,也可以用多個拼接出各種形狀,達到高效開發,最大復用。

?在了解組件化開發之前我們需要先了解組件和模塊這兩個概念

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

  • 模塊:指的是獨立的業務模塊,如基類模塊(common-module)、商城模塊(mall-module)、會員模塊(member-module)等等;模塊相對于組件來說粒度更大。

2.系統架構圖

項目由主項目 app,商城模塊 mall-module,會員模塊 member-module,公共模塊 common-module 各個基類(BaseActivity/BaseApplication/BaseAdapter 等)、工具類、網絡、圖片等一些公共常用的第三方 sdk:

  • app:作為項目的主程序入口,生產環境時可以引入其他模塊如本項目的的 common-module、mall-modulem、member-module;開發調試不涉及到跨模塊調用業務時可以單獨引入 common-module 依賴運行。

  • mall-module:商城模塊,編寫完整的商城業務邏輯,生產環境作為 library 引入 app 主項目,開發階段可以 application 方式單獨運行,亦可作為商城應用獨立發布。

  • member-module:會員模塊,編寫完整的會員業務邏輯,生產環境作為 library 引入 app 主項目,開發階段可以 application 方式單獨運行,亦可作為會員獨立發布。

  • common-module:作為整個項目的基石,所有基類增加修改,均可以在引入項目中生效,達到最大復用率,提高開發效率。

3.實踐

mall-module、member-module、common-module 作為 library 被引入 app 中運行效果圖:

mall-module 作為應用單獨運行效果圖:

主項目 app 創建 項目 build.gradle 配置文件:

apply plugin: 'com.alibaba.arouter'

buildscript {

? ?repositories {

? ? ? ?google()

? ? ? ?jcenter()

? ?}

? ?dependencies {

? ? ? ?classpath 'com.android.tools.build:gradle:2.3.3'

? ? ? ?classpath "com.alibaba:arouter-register:1.0.2"

? ?}

}

allprojects {

? ?repositories {

? ? ? ?google()

? ? ? ?jcenter { url "http://jcenter.bintray.com/" }

? ?}

}

task clean(type: Delete) {

? ?delete rootProject.buildDir

}

項目 gradle.properties 全局配置文件:

#IS_MAIN_APP true主項目為應用 mall-module為library false mall-module為應用可單獨啟動

IS_MAIN_APP=true

#AS 編譯配置

COMPILE_SDK_VERSION=28

BUILDTOOLS_VERSION=28.0.3

MIN_SDK_VERSION=15

TARGET_SDK_VERSION=25

#版本號

APP_VERSION=1

APP_VERSION_CODE=1.0.1

app build.gradle 配置文件:apply plugin 根據 ISMAINAPP 值設置為 application 或 library

if (IS_MAIN_APP.toBoolean()) {

? ?apply plugin: 'com.android.application'

} else {

? ?apply plugin: 'com.android.library'

}

android {

? ?compileSdkVersion Integer.parseInt(COMPILE_SDK_VERSION)

? ?buildToolsVersion BUILDTOOLS_VERSION

? ?defaultConfig {

? ? ? ?if (IS_MAIN_APP.toBoolean()) {

? ? ? ? ? ?applicationId "com.fenlibao.arouter"

? ? ? ?}

? ? ? ?minSdkVersion Integer.parseInt(MIN_SDK_VERSION)

? ? ? ?targetSdkVersion Integer.parseInt(TARGET_SDK_VERSION)

? ? ? ?versionCode Integer.parseInt(APP_VERSION)

? ? ? ?versionName APP_VERSION_CODE

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

? ? ? ?javaCompileOptions {

? ? ? ? ? ?annotationProcessorOptions {

? ? ? ? ? ? ? ?arguments = [AROUTER_MODULE_NAME: project.getName(), AROUTER_GENERATE_DOC: "enable"]

? ? ? ? ? ?}

? ? ? ?}

? ?}

? ?buildTypes {

? ? ? ?release {

? ? ? ? ? ?minifyEnabled false

? ? ? ? ? ?proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

? ? ? ?}

? ?}

? ?sourceSets {

? ? ? ?main {

? ? ? ? ? ?if (IS_MAIN_APP.toBoolean()) {

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

? ? ? ? ? ?} else {

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

? ? ? ? ? ?}

? ? ? ?}

? ?}

}

dependencies {

? ?compile fileTree(dir: 'libs', include: ['*.jar'])

? ?annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

? ?compile project(':common-module')//公共方法 基類 放在該項目中

? ?if (IS_MAIN_APP.toBoolean()) {

? ? ? ?compile project(':mall-module')//商城模塊

? ? ? ?compile project(':member-module')//會員模塊

? ?}

}

創建 mall-module: mall-module build.gradle 配置文件 apply plugin 根據 ISMALLAPP 值設置為 application 或 library

if (IS_MALL_APP.toBoolean()) {

? ?apply plugin: 'com.android.application'

} else {

? ?apply plugin: 'com.android.library'

}

android {

? ?compileSdkVersion Integer.parseInt(COMPILE_SDK_VERSION)

? ?buildToolsVersion BUILDTOOLS_VERSION

? ?defaultConfig {

? ? ? ?if (IS_MALL_APP.toBoolean()) {

? ? ? ? ? ?applicationId "com.fenlibao.mall"

? ? ? ?}

? ? ? ?minSdkVersion Integer.parseInt(MIN_SDK_VERSION)

? ? ? ?targetSdkVersion Integer.parseInt(TARGET_SDK_VERSION)

? ? ? ?versionCode Integer.parseInt(APP_VERSION)

? ? ? ?versionName APP_VERSION_CODE

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

? ? ? ?resourcePrefix "mall_"

? ? ? ?javaCompileOptions {

? ? ? ? ? ?annotationProcessorOptions {

? ? ? ? ? ? ? ?arguments = [AROUTER_MODULE_NAME: project.getName()]

? ? ? ? ? ?}

? ? ? ?}

? ?}

? ?buildTypes {

? ? ? ?release {

? ? ? ? ? ?minifyEnabled false

? ? ? ? ? ?proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

? ? ? ?}

? ?}

? ?sourceSets {

? ? ? ?main {

? ? ? ? ? ?if (IS_MALL_APP.toBoolean()) {

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

? ? ? ? ? ?} else {

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

? ? ? ? ? ?}

? ? ? ?}

? ?}

}

dependencies {

? ?compile project(':common-module')

? ?compile 'com.android.support.constraint:constraint-layout:1.1.3'

? ?annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

}

common-module 創建: common-module build.gradle 配置文件 apply plugin 固定為'com.android.library'作為庫被其他項目引用

apply plugin: 'com.android.library'

android {

? ?compileSdkVersion Integer.parseInt(COMPILE_SDK_VERSION)

? ?buildToolsVersion BUILDTOOLS_VERSION

? ?defaultConfig {

? ? ? ?minSdkVersion Integer.parseInt(MIN_SDK_VERSION)

? ? ? ?targetSdkVersion Integer.parseInt(TARGET_SDK_VERSION)

? ? ? ?versionCode Integer.parseInt(APP_VERSION)

? ? ? ?versionName APP_VERSION_CODE

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

? ? ? ?javaCompileOptions {

? ? ? ? ? ?annotationProcessorOptions {

? ? ? ? ? ? ? ?arguments = [ AROUTER_MODULE_NAME : project.getName() ]

? ? ? ? ? ?}

? ? ? ?}

? ?}

? ?buildTypes {

? ? ? ?release {

? ? ? ? ? ?minifyEnabled false

? ? ? ? ? ?proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

? ? ? ?}

? ?}

}

dependencies {

? ?compile fileTree(dir: 'libs', include: ['*.jar'])

? ?compile 'com.android.support:appcompat-v7:28.0.0'

? ?compile 'com.android.support:design:28.0.0'

? ?compile 'com.android.support.constraint:constraint-layout:1.1.3'

? ?testCompile 'junit:junit:4.12'

? ?androidTestCompile 'com.android.support.test:runner:1.0.2'

? ?androidTestCompile('com.android.support.test.espresso:espresso-core:3.0.2', {

? ? ? ?exclude group: 'com.android.support', module: 'support-annotations'

? ?})

? ?compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'

//該項目中suppourt包為25.2.0版本比較低 顧做排除處理

? ?compile('com.alibaba:arouter-api:1.4.1') {

? ? ? ?exclude group: 'com.android.support'

? ?}

? ?//Rxjava2

? ?compile 'io.reactivex.rxjava2:rxjava:2.2.6'

? ?compile 'io.reactivex.rxjava2:rxandroid:2.1.0'

? ?//Retrofit2

? ?compile 'com.squareup.retrofit2:retrofit:2.4.0'

? ?compile 'com.squareup.retrofit2:converter-gson:2.4.0'

? ?compile 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'

? ?//Okhttp-interceptor

? ?compile 'com.squareup.okhttp3:logging-interceptor:3.6.0'

}

4.注意事項

多個 module 間 Activity 如何跳轉?

由于模塊與模塊之間是相互獨立存在,因而不能使用項目內方式實現 Activity 跳轉,下面介紹兩種 Activity 跳轉方式,日常開發中推薦使用方式二,方式二不管如何修改類名包名都能保持與字符串常量映射關系,維護和使用更方便,更多 ARouter 高級用法請查閱相關資料。

通過反射方式:

try {

? ?Class clazz = Class.forName("com.fenlibao.member.MainActivity");

? ?Intent intent = new Intent(_activity, clazz);

? ?startActivity(intent);

} catch (ClassNotFoundException e) {

? ?e.printStackTrace();

}

使用 ARouter 注解方式,實現映射關系自動注冊:

/**

* ARouter在MyApplication中初始化

*/

public class MyApplication extends BaseApplication {

? ?@Override

? ?public void onCreate() {

? ? ? ?super.onCreate();

? ? ? ?init();

? ?}

? ?private void init() {

? ? ? ?if (isDebug()) {

? ? ? ? ? ?ARouter.openLog();

? ? ? ? ? ?ARouter.openDebug();

? ? ? ?}

? ? ? ?ARouter.init(this);

? ?}

? ?public boolean isDebug() {

? ? ? ?return getApplicationInfo() != null && (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;

? ?}

? ?@Override

? ?public void onTerminate() {

? ? ? ?super.onTerminate();

? ? ? ?ARouter.getInstance().destroy();

? ?}

}

/**

* 在常量類中定義靜態字符串常量

*/

public static final String MEMBER_1_URL_MAIN = "/member/MainActivity";

/**

* 在對應module Activity中使用@Route標簽進行綁定

*/

@Route(path = RoutePath.MALL_1_URL_MAIN)

public class MainActivity extends BaseActivity {

}

/**

* 在需要跳轉至該頁面build方法中傳入對應Activity字符串常量,即可實現跳轉

*/

ARouter.getInstance().build(RoutePath.MEMBER_1_URL_MAIN).navigation();

在 module 中如何獲取 Application 上下文對象?

在 common-module 中定義 BaseApplication 繼承 Application。

**

* 項目Application基類主項Application需集成此類

*/

public class BaseApplication extends Application {

? ?/**

? ? * 系統上下文

? ? */

? ?private static BaseApplication mAppContext;

? ?@Override

? ?public void onCreate() {

? ? ? ?super.onCreate();

? ? ? ?mAppContext = this;

? ?}

? ?/**

? ? * 獲取系統上下文單例

? ? */

? ?public static BaseApplication getInstance() {

? ? ? ?return mAppContext;

? ?}

}

在 app 項目中 MyApplication(上部分代碼示例中可以查看)繼承 BaseApplication,同時設置到 AndroidManifest.xml application 標簽下 name 屬性中。

在 app 及 module 中都可通過 BaseApplication.getInstance();方法即可獲取應用上下文對象,如下:

BaseApplication application = BaseApplication.getInstance();

如何將 module 作為應用單獨運行?

在項目 gradle.properties 全局配置文件中找到 ISMAINAPP 配置變量,設置為 ture 時為主項目啟動方式,設置為 false,脫離其他 mall-module 作為應用單獨啟動,設置完成之后重新編譯項目即可,開發測試階段推薦使用該方式,可縮短項目編譯時間,項目越大,縮短時間越明顯。

##IS_MAIN_APP true主項目為應用,mall-module為library;false mall-module為應用可單獨啟動

IS_MAIN_APP=true

應用主入口只能有一個,如何切換應用主入口?

根據 ISMAINAPP 設置值加載不同目錄下的 AndroidManifest.xml 文件,實現根據參數加載配置文件,下面是 app mall-module 的 build.gradle 配置。

#app build.gradle

android {

? ?sourceSets {

? ? ? ? ? ?main {

? ? ? ? ? ? ? ?if (IS_MAIN_APP.toBoolean()) {

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

? ? ? ? ? ? ? ?} else {

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ?}

? ? ? ?}

}

#mall-module build.gradle

android {

? ?sourceSets {

? ? ? ? ? ?main {

? ? ? ? ? ? ? ?if (!IS_MAIN_APP.toBoolean()) {

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

? ? ? ? ? ? ? ?} else {

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

? ? ? ? ? ? ? ?}

? ? ? ? ? ?}

? ? ? ?}

}

如何避免資源文件沖突覆蓋?

在組件化開發過程中經常會出現資源文件沖突覆蓋問題,主項目會覆蓋 module 項目資源文件。

在 module 項目中 build.gradle 配置文件中設置:

resourcePrefix "mall_"

  • 通過給模塊設置不同的前綴,避免資源文件重名覆蓋問題。

  • 良好的命名(資源文件/類文件)習慣,需以 module 前綴開頭,例如 mall-module 布局資源文件,采用 mallactivity_home,方式避免資源文件重名覆蓋問題,如果資源文件不按 resourcePrefix "mall" 定義前綴命名會有錯誤提示,例如以如下方式命名布局資源文件 activitymallhome.xml:

  • 組件化開發如何利用 Git 管理代碼,實現協同開發?

    項目中引用的 module 可能是其他組員負責開發,我們只負責調用傳遞數據,當 module 發生改變時,項目中需要可以獲取到最新的代碼,本項目中采用 git submodule 方式管理代碼,如下圖:

    1. 增加 git module 項目引用?采用 git submodule add [url][module-name] 命令增加 git 項目引用 url:git 項目完整路徑; module-name:為本地項目 module 名稱

    2. 導入完整 git submodule 項目?第一步初始化:git submodule init;第二步更新項目:git submodule update 引用至本地,如果遇到提示項目目錄已存在,將原有項目目錄刪除再執行更新命令即可。

    5.總結

    ??以上就是組件化開發的詳細步驟和相關注意事項,如果你面前是一個龐大的工程,建議你使用該方案,以最小的代價盡快開始實施組件化。如果你現在負責的是一個開發初期的項目,代碼量還不大,那么也建議盡快進行組件化的規劃,不要給未來的自己增加徒勞的工作量。 項目示例 Github 地址:https://github.com/guixia/Android-Submodule.git。

    - END -

    更多推薦內容

    《kubernetes 單master集群的搭建》

    總結

    以上是生活随笔為你收集整理的捷易拍sdk开发指南.doc_每个Android开发都必须知道的利器的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。