一個存在多個模塊(包含Native)的工程的gradle構建的事例
簡介
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 下載:
- 點擊下載
-
掃碼下載APK:
-
運行工程:
- 使用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工程。
特別說明
- 本文檔只是重點介紹整個項目的工程架構,對于具體的語法沒有做說明,后續會逐步整理增加到博客。
- 目前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