導航:首頁 > 操作系統 > android模塊開發教程

android模塊開發教程

發布時間:2023-04-19 21:55:08

android 模塊之旅:ARoutrer框架使用教程

隨著公司項目越來越大,人員增多,項目會出現難維護、新人入職後,需要花費很多時間去熟悉項目。最重要的是,每次編譯時間真的太久了!!!為了解決這個問題,項目重構、模塊化需要提上日程。項目拆分成模塊之後,頁面的跳轉就不能直接startActivity 調用具體的activity了,因為這個Activity已經在另外一個模塊中,直接用顯示引用是提示不出來的,這時需要通過藉助路由庫來實現頁面的跳轉,當然通過反射的方式也是可以跳轉到對應頁面的。通過這樣的路由跳轉,而不是顯示引用,就達到了模塊之間解耦的目的,在不需要的時候,可以不需要引入這個模塊編譯,提高開發速度,發布的時候又能很方便的集成進來,功能不受影響,這就實現了模塊化的第一步。路由框架推薦使用阿里開源的ARouter路由框架,畢竟是大廠開源的框架,穩定性、可靠性也相對較高。

路由路徑,我們可以封裝一個 RouterManger 工具類放在 moudle_base 模塊中,統一管理整個項目的 Path 及路由框架的初始化操作, 示例如下:

我們經常需要在目標頁面中配置一些屬性,比方說"是否需要登陸"之類的
可以通過 Route 註解中的 extras 屬性進行擴展,這個屬性是一個 int值,換句話說,單個int有4位元組,也就是32位,可以配置32個開關
剩下的可以自行發揮,通過位元組操作可以標識32個開關,通過開關標記目標頁面的一些屬性,在攔截器中可以拿到這個標記進行業務邏輯判斷

ARouter更加詳細的使用教程可以前往官方GitHub查閱,上述為個人使用過程中覺得需要記錄下來東西,不足之處,敬請見諒

❷ 如何使用ApkPlug進行Android平台下模塊化開發

可以敏圓看橋寬塌看網路的教程,內容很巧盯詳細!
http://jingyan..com/article/ca41422fc2ce471eae99ed3d.html

❸ Android硬體抽象層模塊編寫規范

硬體抽象層模塊編寫規范

硬體抽象層最終都會生成.so文件,放到系統對應的目錄中。在系統使用的時候,系統會去對應目錄下載入so文件,實現硬體抽象層的功能。因此硬體抽象層的載入過程就是我們使用so的一個介面。先了解載入大帆豎過程從源頭了解抽象層模塊兒的滾大編寫規范。

1、硬體抽象層載入過程

系統在載入so的過程中,會去兩個目錄下查找對應id的so文件。這兩個目錄分別是/system/lib/hw和/vendor/lib/hw。

so文件的名字分為兩個部分例如id.prop.so,第一部分是模塊id。第二部分是系統prop的值,獲取順序為「ro.hardware」、「ro.procat.board」、「ro.board.platform」、「ro.arch」,如果prop都找不到的話,就用default。(不是找不到prop的值,是找不到prop值對應的so文件)。

負責載入硬體抽象層模塊的函數是hw_get_mole,所在的文件是/hardware/libhardware/hardware.c如下:

/** Base path of the hal moles */

#if defined(__LP64__)

#define HAL_LIBRARY_PATH1 "/system/lib64/hw"

#define HAL_LIBRARY_PATH2 "/vendor/lib64/hw"

#else

#define HAL_LIBRARY_PATH1 "/system/lib/hw"

#define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

#endif

/**

 * There are a set of variant filename for moles. The form of the filename

* is ".variant.so" so for the led mole the Dream variants 

 * of base "ro.proct.board", "ro.board.platform" and "ro.arch" would be:

 *

 * led.trout.so

 * led.msm7k.so

 * led.ARMV6.so

 * led.default.so

 */

static const char *variant_keys[] = {

    "ro.hardware",  /* This goes first so that it can pick up a different

                       file on the emulator. */

    "ro.proct.board",

    "ro.board.platform",

    "ro.arch"

};

static const int HAL_VARIANT_KEYS_COUNT =

    (sizeof(variant_keys)/sizeof(variant_keys[0]));

/**

 * Load the file defined by the variant and if successful

 * return the dlopen handle and the hmi.

 * @return 0 = success, !0 = failure.

 */

static int load(const char *id,

        const char *path,

        const struct hw_mole_t **pHmi)

{

    int status;

    void *handle;

    struct hw_mole_t *hmi;

    /*

     * load the symbols resolving undefined symbols before

   轎孝  * dlopen returns. Since RTLD_GLOBAL is not or'd in with

     * RTLD_NOW the external symbols will not be global

     */

    handle = dlopen(path, RTLD_NOW);

    if (handle == NULL) {

        char const *err_str = dlerror();

        ALOGE("load: mole=%s\n%s", path, err_str?err_str:"unknown");

        status = -EINVAL;

        goto done;

    }

    /* Get the address of the struct hal_mole_info. */

    const char *sym = HAL_MODULE_INFO_SYM_AS_STR;

    hmi = (struct hw_mole_t *)dlsym(handle, sym);

    if (hmi == NULL) {

        ALOGE("load: couldn't find symbol %s", sym);

        status = -EINVAL;

        goto done;

    }

    /* Check that the id matches */

    if (strcmp(id, hmi->id) != 0) {

        ALOGE("load: id=%s != hmi->id=%s", id, hmi->id);

        status = -EINVAL;

        goto done;

    }

    hmi->dso = handle;

    /* success */

    status = 0;

    done:

    if (status != 0) {

        hmi = NULL;

        if (handle != NULL) {

            dlclose(handle);

            handle = NULL;

        }

    } else {

        ALOGV("loaded HAL id=%s path=%s hmi=%p handle=%p",

                id, path, *pHmi, handle);

    }

    *pHmi = hmi;

    return status;

}

/*

 * Check if a HAL with given name and subname exists, if so return 0, otherwise

 * otherwise return negative.  On success path will contain the path to the HAL.

 */

static int hw_mole_exists(char *path, size_t path_len, const char *name,

                            const char *subname)

{

    snprintf(path, path_len, "%s/%s.%s.so",

             HAL_LIBRARY_PATH2, name, subname);

    if (access(path, R_OK) == 0)

        return 0;

    snprintf(path, path_len, "%s/%s.%s.so",

             HAL_LIBRARY_PATH1, name, subname);

    if (access(path, R_OK) == 0)

        return 0;

    return -ENOENT;

}

int hw_get_mole_by_class(const char *class_id, const char *inst,

                           const struct hw_mole_t **mole)

{

    int i;

    char prop[PATH_MAX];

    char path[PATH_MAX];

    char name[PATH_MAX];

    char prop_name[PATH_MAX];

    if (inst)

        snprintf(name, PATH_MAX, "%s.%s", class_id, inst);

    else

        strlcpy(name, class_id, PATH_MAX);

    /*

     * Here we rely on the fact that calling dlopen multiple times on

     * the same .so will simply increment a refcount (and not load

     * a new of the library).

     * We also assume that dlopen() is thread-safe.

     */

    /* First try a property specific to the class and possibly instance */

    snprintf(prop_name, sizeof(prop_name), "ro.hardware.%s", name);

    if (property_get(prop_name, prop, NULL) > 0) {

        if (hw_mole_exists(path, sizeof(path), name, prop) == 0) {

            goto found;

        }

    }

    /* Loop through the configuration variants looking for a mole */

    for (i=0 ; i<HAL_VARIANT_KEYS_COUNT; i++) {

        if (property_get(variant_keys[i], prop, NULL) == 0) {

            continue;

        }

        if (hw_mole_exists(path, sizeof(path), name, prop) == 0) {

            goto found;

        }

    }

    /* Nothing found, try the default */

    if (hw_mole_exists(path, sizeof(path), name, "default") == 0) {

        goto found;

    }

    return -ENOENT;

found:

    /* load the mole, if this fails, we're doomed, and we should not try

     * to load a different variant. */

    return load(class_id, path, mole);

}

int hw_get_mole(const char *id, const struct hw_mole_t **mole)

{

    return hw_get_mole_by_class(id, NULL, mole);

}

找到so文件之後,調用方法load方法去載入對應的so文件,並返回hw_mole_t結構體。load方法源碼在上面程序中。

load方法首先調用dlopen載入對應的so文件到內存中。然後用dlsym方法找到變數HAL_MODULE_INFO_SYM_AS_STR符號對應的地址,這個地址也就是一個hw_mole_t結構體,然後從這個結構體中拿出id比對load方法出入的id是否一致,如果是的話表示打開成功。載入過程完成。

HAL_MODULE_INFO_SYM_AS_STR這個符號值為HMI,也就是必須要保證這個符號之後是一個hw_mole_t。接下來的規范中有這個要求。

到此,模塊載入完成

2、硬體抽象層模塊編寫規范

硬體抽象層有兩個結構體,一個是hw_mole_t和hw_device_t,定義在hardware.h中。

首先說一下hw_mole_t的編寫規范。

1、必須要有一個「自定義硬體抽象層結構體」,且結構體第一個變數類型要為hw_mole_t。

2、必須存在一個HARDWARE_MODULE_INFO_TAG的符號,且指向「自定義硬體抽象層結構體」。在載入的時候根據這個符號找到地址,並把地址的轉變為hw_mole_t,這也是為什麼第一條中hw_mole_t必須要在第一個的原因。

3、hw_mole_t的tag必須為HARDWARE_MODULE_TAG

4、結構體中要有一個方法列表,其中要有一個open方法。用open方法獲得hw_device_t

接下來說一下hw_device_t的編寫規范

1、必須要有一個「自定義硬體設備結構體」,且結構體第一個變數類型要為hw_device_t。

2、hw_device_t的tag必須為HARDWARE_DEVICE_TAG

3、要有一個close函數指針,來關閉設備

按照上面規范編寫的硬體抽象層就可以由系統載入並正確獲取到device。具體的應用層邏輯在device中實現。

❹ Android模塊化之MicroMole(微信Pins工程)

相信你看過微信關於模塊化的分享 《微信Android模塊化架構重構實踐》 ,也注意到裡面提到的pins工程結構。

作者是這樣描述的 ------「pins工程能在mole之畢模簡內再次構建完整的多子工程結構,通過project.properties來指定編譯依賴關系。通過依賴關系碼正在編譯時找到所有的資源和源碼路徑。」

仔細推敲這句話的意思,應該能知道它實現的基本原理------通過設置sourceSets指定手褲多個java、res等路徑.

有關sourceSets的介紹:
https://developer.android.com/studio/build/index.html#sourcesets
https://google.github.io/android-gradle-dsl/current/com.android.build.gradle.api.AndroidSourceSet.html

但是,有一個問題需要要知道的是,一個mole只能指定一個AndroidManifest文件,pins工程中包含了多個AndroidManifest,它是怎麼做到的?

研究過 com.android.tools.build:gradle ,會留意到它使用到一個子庫 com.android.tools.build:manifest-merger ,官方通過這個庫來合並多個AndroidManifest文件,或許pins工程也是用了這方式。

接下來,再它的基礎上,我做的一些改動,取了另一個名字叫 MicroMole ,先來看一下工程結構:

與pins工程的結構大致不變,增加了 androidTest 和 test ,以及將 project.properties 替換為 build.gradle 。

基本原理是不變的,與微信pins工程一樣配置 sourceSets 。AndroidManifest合並用了 com.android.tools.build:manifest-merger 。

在根項目的build.gradle中添加插件依賴:

在模塊的build.gradle中引用插件並配置 MicroMole:

MicroMole中的build.gradle:

為了使用上的更加方便,專門寫了Android Studio的插件,能快速的創建一個MicroMoudle.

插件安裝步驟 :

插件詳解 :
https://plugins.jetbrains.com/plugin/10785-micromole

插件項目地址 :
https://github.com/EastWoodYang/micro-mole-idea-plugin

MicroMole已經上傳至Github,歡迎star交流。
https://github.com/EastWoodYang/MicroMole

❺ 如何自學 Android 編程

1、學Java

目前,Java語言在Android開發中占據絕對統治地位,所以開發Android的第一步就是學好Java,建議至少完整的看一本Java入門書籍,推薦:

Java語言程序設計 (豆瓣):我原來看的入門書籍,我老師推薦的,分為《基礎篇》和《進階篇》。

Java編程思想 (第4版)
(豆瓣):從Java的基礎語法到最高級特性(深入的面向對象概念、多線程、自動項目構建、單元測試和調試等),更講述了java語言的前世今生,語言特性,設計理念等等,閱讀本書需要一定的java基礎,個人經驗,建議至少看完《Java語言程序設計-基礎篇》再看這本書。

2、學Android

第一行代碼
(豆瓣):郭霖大大編寫的Android入門書籍,推薦這本書的原因有兩個,一是郭霖大大的語言通俗易懂,二是這本書很新,是基於Android4.0的入門書籍,根據友盟指數的統計,Android4.0以下的設備已不足10%,所以,你現在入門,拋棄那些仍舊停留在Android2.x的入門書籍吧。

AndroidDevTools:從開發工具到入門教程,從代碼規范到版本控制工具,一切與android相關的都在這個網站上,Android入門請參考該網站的
Android Dev Tutorials 模塊。

Android學習之路:stormzhang大大編寫的Android入門文章,對於有一定java基礎的人來說,Android入門有這一篇文章就足夠了。(該文章同樣被收錄在AndroidDevTools中)

郭霖的專欄:郭霖大大CSDN專欄。

stormzhang.com 的頁面:stormzhang大大的個人博客。

3、遇到問題怎麼辦

Google:用google搜出來的結果比網路質量高。至於如何不翻·牆就使用google請自行知乎,但是作為一個Android開發者,你早晚要學會翻·牆。

博客園 - 開發者的網上家園

博客頻道 - CSDN.NET

Stack Overflow:國外的開發者問答社區,無需翻·牆。

GitHub · Build software better,
together.:國外的代碼託管平台,這里有很多Java/Android開源項目,無需翻·牆。

❻ 請問在Android開發中,怎麼利用APICloud的模塊進行開發

APICloud SDK工程目錄下,凡是以「uz_」前綴打頭命名的資源文件,請開發者不要隨意改動,保持其原狀,否則SDK可能在啟動過程中報找不到引擎資源的警告而強制退出。
PICloud模塊(Native Mole)擴展SDK(以下簡稱SDK)是柚子科技為滿足廣大開發者自定義擴展Native模塊的熱切需求,而推出的模塊擴展開發SDK,提供給有一定Android基礎的開發者,通過簡單的接友粗口實現,輕松接入APICloud平台,快速開發擴展模塊,自行實現對APICloud引擎基告能搏告明力的增強,提升App的質量及用戶體驗。

❼ 安卓軟體怎麼開發,安卓用什麼開發

1.安卓手機開發app的方法如下:第一,製作一款APP,必須要有相關的idea。 2.通過那些idea來進行APP的主要功能設計以及大概界面構思和設計。 3.大功能模塊代碼編寫以及大概的界面模塊編寫。 4.在界面模塊編寫之前,開發者可以在模擬器做大的功能開發。 5.把大概的界面和功能連接後,app的大致demo就出來了。 6.第三在app完成後,加入appicon等等UI元素。 7.反復測試無錯誤後上傳。 8.之後大概要花7到14天來等候審批。

❽ 安卓APP的主要開發原理以及其主要過程是什麼

開發原理:

Android應用程序是用Java語言編寫的。編譯過後的位元組碼,以及應用程序要求的其他數據和資源文件,通過aapt工具被綁定在一起,稱為 Android包,這是一個帶.apk後綴的檔案文件。這個文件也是用戶下載到他們設備上的文件。所有的代碼在一個單一的.apk文件中,組成一個「應用程序」。

主要過程:

1、需求分析:

大部分創業型項目在這個階段只是一些比較抽象的想法。有一份相對完善的需求文檔,不僅有助於創業者自身對項目的理解和周全性分析,如果項目是交由設計公司去完成的話,也更有利於對方准確把握項目的定位和商業模式,以便給出專業的建議和解決方案。

2、原型設計

接下來會根據上面提到的具體需求文檔,項目經理進行會進行原型圖的設計。

3、UI設計

原型圖經過反復推敲修正後,UI 設計師會進行UI界面相關的配色設計、功能具象化處理、交互設計、以及各種機型、系統的適配。UI 設計師經過多次與項目經理溝通修改後,最終的到定稿的高保真設計圖。

4、開發

經過以上幾個過程之後,會正式進入到開發階段。

5、測試調試

APP 功能開發完成之後,測試人員會對整項目進行系統性測試。這個環節會調動起項目組內所有人相關人員。而測試這個環節的重要性不亞於前期功能的規劃,如果團隊沒有經過專業系統性訓練的測試人員,很可能會導致項目出現與設計初衷存在落差,以及遺漏下一些邏輯上的坑。

6、發布app

經過至少兩輪的內部測試以及小范圍外測(或者完成滿足測試要求的周期)後,會進行最終版本的上架。

(8)android模塊開發教程擴展閱讀

APP開發工具

1、MOTODEV Studio for Android

MOTODEV Studio for Android,這是基於Android的開發環境,為開發者們提供新的MOTODEV App Accelerator Program使他們可以開發出更適合摩托羅拉Android手機的應用程序。

2、J2ME開發插件 Mobile Tools for Java

Mobile Tools for Java (MTJ) 是Nokia公司開發的一款 Eclipse插件,用於支持 Java 手機應用程序開發。其前身就是大名鼎鼎的 EclipseME。

3、apk文件修改工具 Root Tools

RootTools是一個新的工具軟體,Android開發者可以在這一工具軟體的支持下,對.apk格式的文件進行再次修改,讓程序表現更加出色,滿足用戶的需求。Root Tools裡面自帶有很多工具,比如BusyBox,它裡面集成壓縮了很多Linux的工具和命令,這樣軟體開發者在對....

4、IDEA的Android開發插件 idea-android

idea-android 是在 IDEA 集成開發環境中開發 Android 應用程序的插件。

參考資料

網路-app開發

❾ Android 開發有哪些新技術出現

1、開發工具

Android Studio: Google 官方放棄 Eclipse 和 Android Studio 普及。AS 雖然不算新,但是對 Android Studio 這個軟體的更新速度快的驚人,有大量的新功能發布。例如支持很多註解代碼提示註解、Live code template、支持自動生成 Parcelable 實現等等,作為開發者,持續關注這個更新列表 Recent Changes,一定會讓寫代碼的生活更加美好。

2、編程「語言」

Kotlin:作為 Android 領域的 Swift,絕對如沐新風。拋棄沉重的 Java 語法,Kotlin 融入了很多現代編程語言的思想,作為開發者,接受新的語言,了解新語言的發展趨勢,更有利於開闊你的思路和加深對語言的理解。在 Android 開發上,使用 Kotlin 並不會付出什麼代價,為什麼不來試試使用Kotlin進行Android開發。
React Nativ: 跨平台一直是程序員的夢想,而且移動應用的跨平台解決方案也很多,因為 Facebook 的參與和力推,讓這個解決方案帶上了光環。第一個用 React Native 開發的 App 已經在 Google Play 上架 Facebook 廣告管理工具,聽說 Android 的 SDK 也馬上會到來,React Native。
Sky:與 React Native 類似,使用 Web 開發語言來做移動平台的開發,雖然這個只是一個嘗試,但是這是 Google 自身推出的,特別是在 Java 語言的使用上敗訴之後,這可能會有一些作為呢,domokit/sky_sdk。

3、開發模式

Dagger 2:依賴注入並不是什麼新技術,但是使用在 Android 確實一個新的嘗試。Android App 越來越被當成嚴肅的大型項目來構建,很多在以前大型伺服器開發上使用的技術都被應用到了移動開發。Android 開發分模塊開發,使用 Dagger 來松耦合模塊。特別值得一體的是,Dagger 2 現在由 Google 親自接管。 Dagger ‡ A fast dependency injector for Android and Java。
MVP:因為 Android 並沒有嚴格的業務和界面區分,項目一復雜,就很容易使代碼陷入混亂。現在 Android 開發社區對 MVP 模式討論越來越熱,覺得 MVP 是非常適合 Android APP 開發。MVP for Android: how to organize the presentation layer。
RxAndroid:函數響應式編程(Functional Reactive Programming)也不是新內容,RxAndroid 把 RxJava 帶到 Android 環境中。很多時候,編寫 Android 程序,也可以看成是數據的處理和流動,換一種思想編程,曾經看起來很棘手的問題,瞬間就很優雅的解決了:ReactiveX/RxAndroid。
MVVM:這是因為開始官方支持 DataBinding,把 MVVM 直接帶到 Android 中。數據綁定在 Windows WPF 和 Web 已經非常常見,它非常高效的開發效率,只關心數據和業務。這也對 Android 開發來說,無疑是一個非常重大的影響:android UI設計MVVM設計模式討論?。
插件化:針對大型 Android 項目,很多 App 開始使用插件來分模塊構建相對獨立的功能。
Hybrid:完全使用 HTML 5 開發 App,目前還不成熟。但是折中方案在很多情況下是非常適合的,典型的就是微信,大部分信息展示都是通過 H5 來完成,同時通過 Hybird 方式,把 Web 和 Native 打通,提供給網頁訪問本地資源的能力。

4、UI設計

Material Design:已經紅遍了大江南北,這方面的討論實在太多了,而且各種支持庫都有了,特別是 Google 官方出了一個支持庫 Android Design Support Library。
Sketch 3:這是一個專為設計移動端 UI 的設計工具,作為開發者,不用懂那麼復雜的 PS 使用,也可以做非常專業設計。

❿ 安卓手機如何開發app

安卓手機開發app的方法如下:

1、首先,製作一款APP,必須要有相關的idea。

2、通過那些idea來進行APP的主要功能設計以及大概界面構思和設計。

3、大功能模塊代碼編寫以及大概的界面模塊編寫。在界面模塊編寫之前,開發者可以在模擬器做大的功能開發。

4、把大慧者彎概的界面和功能連接後,app的大致demo就出來了。

5、最後在app完成後,加入appicon等等UI元素。反復測試無前悶錯誤後上傳。之後大概要花7到14天來等嫌昌候審批。

閱讀全文

與android模塊開發教程相關的資料

熱點內容
閱讀app小說怎麼轉換成txt 瀏覽:65
c語言編程數字變時間 瀏覽:655
迷你編程第五天初級寶箱怎麼弄 瀏覽:839
刺激體驗服如何更新伺服器 瀏覽:934
怎麼把照片做成新的文件夾 瀏覽:466
安卓手機沒有聲音均衡器怎麼辦 瀏覽:506
吃雞國際服為什麼會伺服器匆忙 瀏覽:248
微信中如何打開定位伺服器 瀏覽:203
java並發編程書籍 瀏覽:280
android601源碼 瀏覽:788
程序員離職了還能幹嘛 瀏覽:156
少林功法pdf 瀏覽:471
安卓80版本小游戲怎麼玩 瀏覽:632
奇書pdf 瀏覽:836
伺服器的管理口有什麼用 瀏覽:643
澳洲加密資產新政策 瀏覽:157
哈利波特連接伺服器失敗什麼意思 瀏覽:234
提取手機上安裝的app並反編譯 瀏覽:966
人工智慧演算法書 瀏覽:604
安卓如何傳輸圖片給蘋果 瀏覽:829