一個存在多個模塊(包含Native)的工程的gradle構建的事例

jopen 10年前發布 | 19K 次閱讀 Gradle Java 安卓開發 Android Studio開發工具

簡介

An Android Project with more than one module,the app module(some api developed by jni) depend on an Android Library which has native so.

該項目是一個使用Android Studio創建的,通過gradle編譯的,存在多個模塊的工程的gradle構建的事例。其中存在多個模塊的工程中包含:

  • 一個Android Library的模塊,該模塊使用了第三方的jar和so
  • 一個Android Application模塊,該模塊引用上面的Android Library,自身包含jni的接口調用。

代碼地址:

Github: https://github.com/bihe0832/Android-gradle-jni-so

體驗方式

  • Demo 下載:
  • 運行工程:

    • 使用Android Studio 逐個導入
    • 直接在根目錄運行build.sh

工程介紹

在項目中存在兩個Android Studio的工程

GradleTest

GradleTest是核心工程,它里面包含了一個Android Library的模塊gradletestlibrary和一個Android Application的模塊app。

  • gradletestlibrary

    一個Android Library的模塊,他引入了第三方的so和jar(MD5工程的編譯產出),并對第三方的jar和so做了封裝和調用。

  • app

    一個Android Application的模塊,他引用gradletestlibrary,同時里面包含jni的代碼,通過native的方式調用gradletestlibrary提供的方法。

MD5

一個普通的Android 工程,他包含java和jni代碼,最終打包后對外提供jar包和so。模擬第三方的jar和so提供給GradleTest使用。

關鍵代碼結構

Android-gradle-jni-so
    │
    ├─── build.sh 生成最終產出物的簡單構建腳本,直接運行會生成最終的資源、apk和核心文件
    │
    ├─── GradleTest 核心工程,一個存在多個Module的Android工程
    │     │
    │     ├── app 基于Android Application的模塊,引用gradletestlibrary,通過native的方式調用接口。
    │     │
    │     └── gradletestlibrary 基于Android Library的模塊,引入MD5提供的jar和so
    │     
    ├─── MD5 普通Android工程,他包含java和jni代碼,最終打包后對外提供jar包和so
    │
    └─── README.md 項目工程介紹

接口調用

下面用圖示簡單梳理demo中獲取大寫md5值的函數調用流程

使用場景

說實話,這么設計一個工程是有點復雜,但是卻存在實實際際的使用場景。上面的工程是自己根據一直以來SDK開發時實際經驗總結,下面對該事例中的兩個工程以及對應模塊做個現實中的身份映射。

一點說明

首先、這個完整的架構是主要是提供給SDK的開發者或者大型項目存在公共代碼庫的情況下使用的。如果項目代碼很少,確實不用搭建如此復雜的框架。

具體身份映射

  • MD5 ———— 映射SDK開發者或者項目公共庫依賴的第三方庫,例如SDK的開發者會用到一些第三方的數據統計、賬號登陸SDK等
  • GradleTest ———— SDK開發者或者項目的工程
    • gradletestlibrary SDK的具體實現,或者公共庫的具體實現,最終可能也會以jar、甚至so的方式對外提供
    • app 具體的應用工程,可能是SDK的開發者對外提供的配套demo,也可能是具體的開發者的應用工程,這就是一個普通的Android工程。

特別說明

  1. 本文檔只是重點介紹整個項目的工程架構,對于具體的語法沒有做說明,后續會逐步整理增加到博客。
  2. 目前gradle支持native構建需要使用特定的gradle版本和gradle tools版本,因此不要修改項目build.gradle中buildscript內對于gradle tools的版本的聲明以及根目錄gradle下gradle-wrapper.properties中對于gradle版本的說明。也就是說:
    • 必須使用gradle-2.5-all 和 com.android.tools.build:gradle-experimental:0.2.+
    • build.gradle 代碼如下:

        buildscript {
            repositories {
                maven { url 'http://maven.oschina.net/content/groups/public/' }
                jcenter()
            }
            dependencies {
                classpath "com.android.tools.build:gradle-experimental:0.2.+"
            }
        }
    • gradle-wrapper.properties 內容如下:

        #Tue Dec 15 16:08:58 CST 2015
        distributionBase=GRADLE_USER_HOME
        distributionPath=wrapper/dists
        zipStoreBase=GRADLE_USER_HOME
        zipStorePath=wrapper/dists
        distributionUrl=http\://services.gradle.org/distributions/gradle-2.5-all.zip

來自: http://blog.bihe0832.com/gradle-test.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!