By
Mingming
更新日期:
整理 Gradle 工程模板的目的
我之前公司是一家 soc 公司,有下面几个特点:
- 本地电脑不能上外网,只能上内网
- 有 app 开发,但是不是移动互联网公司那种大型的,基本是就是系统自带的一些基础应用
- 系统编译、打包在内网编译服务器
我想达到下面几个目的,提升开发效率:
- 方便新的同事(或是不熟悉 app 开发的同事)无门槛快速搭建 app 开发环境
- 能在本地 PC 使用 Android Studio 开发调试 app
- app 工程可以不用修改直接在编译服务器编译集成
- app 工程可以不用修改直接在本地 PC 编译、调试
因此我需要做到:
- 搭建一个内网离线 maven 仓库,定时维护更新大家需要的 libs。
- 搭建统一版本工具链的本地 PC Android Studio 开发环境
- 搭建统一的 gradle 工程模块,能在本地 PC 导入 Android Studio 开发调试;也能在服务器上使用 mk 编译、集成。
本地 PC 环境搭建
这里本地的 PC 是 window 的环境,所有的工具都在官网有下载:
安装 jdk
安装 jdk-8u112-windows-x64.exe
在 系统变量 Path 中添加 jdk 的安装路径,如果默认安装c盘就是:C:\Program Files\Java\jdk1.8.0_112\bin。在 cmd 中输入 java -version 能正确显示 jdk 版本号就表示配置好了。
安装 Android Studio
安装 android-studio-ide-193.6626763-windows.exe
打开 Android Sutido: File->Settings->Appearance & Behavior -> System Settings -> Android SDK:编辑 Android SDK Location: 将 2.2 中 sdk 解压的路径填上。
安装 Gradle
在本地的用户目录(一般在C盘,例如:C:\Users\zhouyuchen\)找到文件夹 .gradle(安装 Android Studio 会自动创建,如果没有可以手动创建,注意如果要手动创建 . 开头的文件夹,需要后结尾加 “.”,例如创建 .gardle,需要输入 “.gradle.”)。
copy gradle\wrapper\dists\ 下面的 zip 包到本地 .gradle\ 的相同路径,例如服务器上的是 gradle\wrapper\dist\gradle-5.1.1-all.zip 就 copy 到本地 .gradle\wrapper\dist\gradle-5.1.1-all.zip。然后再本地再 dist 目录下解压 zip 包。注意解压后的路径为:.gradle\wrapper\dist\gradle-5.1.1-all\
Gradle 工程模板
(1). 模板工程结构介绍(一般没在下面结构的都是编译生成的中间文件,不要编译中间文件上传到代码仓库中):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| app_template: | |----- Android.mk: android 系统环境make脚本 |----- settings.gradle: gradle 配置项,可以配置编译的模块(module) |----- build.gradle: 工程顶级 gradle 脚本 |----- gradlew: linux gradle 编译bin命令 |----- gradlew.bat: window gradle 编译bin命令 |----- gradle/ | |---- wrapper/ | |---- gradle-wrapper.jar | |---- gradle-wrapper.properties gradle 属性配置,一般配置 gradle 的版本 | | app/: apk主工程(本质上主工程属于一个 module) | |----- build.gradle | |----- src/ | |---- main/ | |---- Android.mk: android 系统环境make脚本 | |---- AndroidManifest.xml | |---- java: java 代码 | |---- res: 资源文件 | |---- libs: 引用的第三方 jar 库 | |---- jniLibs: jni 编译后打包的 so 路径 | |---- proguard-project.txt: proguard 混淆配置文件 | |---- jni: jni 代码 | |---- Application.mk: jni 编译配置文件 | |---- Android.mk: jni make脚本 | | module1/ | |---- build.gradle | | module2/ | |---- build.gradle |
|
(2). 配置 sdk 路径:copy local.properties 到顶级 build.gradle 同级,配置:
1 2 3
| # 这里配置的是 sdk 的解压路径 sdk.dir=D:\\android\\android-sdk-windows ndk.dir=D:\\android\\android-sdk-windows\\ndk-bundle
|
(3). 配置 gradle 版本:gradle-wrapper.properties 配置:
1 2
| distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip
|
(4). 配置 sdk、依赖库的版本:顶层build.gradle 配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| ext { buildToolsVersion = '28.0.3' compileSdkVersion = 28 minSdkVersion = 19 targetSdkVersion = 28 versionCode = 1 versionName = '1.0.0' libs = [ appcompat: 'com.android.support:appcompat-v7:25.0.0', recyclerview: 'com.android.support:recyclerview-v7:25.0.0', ] } buildscript { repositories { maven() {url 'file://\\192.168.200.10\\swc_apd\\offline_maven_repo\\repository'} mavenLocal() } dependencies { classpath 'com.android.tools.build:gradle:3.4.0' } } allprojects { repositories { maven() {url 'file://\\192.168.200.10\\swc_apd\\offline_maven_repo\\repository'} mavenLocal() } }
|
(5). jni 配置(如果有的话):按照工程实际的情况,配置 Application.mk 和 Android.mk
本地编译 App 工程
如果有 jni 的话,先编译 jni:cmd 进入 jni 目录,输入 ndk-build.cmd 编译通过后,会在 jni 同级目录 libs 目录下生成编译的 so。
将编译生成的 so copy 到 jniLibs 下,好打包到 apk 中。采用手动编译 jni 的方式,可以避免每次 build apk 都会改变生成的 so。
cmd 进入工程顶级目录,执行 gradlew.bat build 编译 App 工程。
如果 cmd 编译没有错误,就可以使用 Android Studio 的 Import Gradle 工程的功能导入到 Android Studio IDE 中,使用 IDE 进行调试、开发。
本地 App 开发工具版本信息
Jdk: 1.8.0
Android Studio: 4.0.1
Android Sdk: 19, 24, 27, 28, 29
Android Ndk: 19.2.5345600
Android build tools: 28.0.3
Gradle: 5.1.1-all
Gradle build tools: 3.4.0
Android Support: 自行去服务器maven仓库路径 offline_maven_repo\repository\com\android\support 下查看包含的版本
编译服务器集成环境配置
App 工程 make 脚本
(1). 顶级 Android.mk 包含 app 主工程模块和 jni 模块(如果有的话):
1 2 3 4 5 6 7 8 9 10
| LOCAL_PATH_PRIVATE := $(call my-dir) $(info building jni ... ) include $(LOCAL_PATH_PRIVATE)/app/src/main/jni/Android.mk $(info building apk ... ) include $(LOCAL_PATH_PRIVATE)/app/src/main/Android.mk
|
(2). jni Android.mk(如果有的话):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)
LOCAL_MODULE := libjni
LOCAL_SRC_FILES := \ JavaApi.cpp \ JniApi.cpp LOCAL_LDLIBS := -lm -llog
LOCAL_PRODUCT_MODULE := true include $(BUILD_SHARED_LIBRARY)
|
(3). app(main) Android.mk:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) $(info local_path $(LOCAL_PATH)) LOCAL_STATIC_ANDROID_LIBRARIES := \ android-support-v7-recyclerview \ android-support-v7-appcompat LOCAL_SRC_FILES := $(call all-java-files-under, java) LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res LOCAL_SDK_VERSION := current LOCAL_AAPT_FLAGS := --auto-add-overlay LOCAL_JNI_SHARED_LIBRARIES := libjni LOCAL_PACKAGE_NAME := AppTemplate LOCAL_MODULE_TAGS := optional LOCAL_PROGUARD_ENABLED := disabled LOCAL_CERTIFICATE := platform LOCAL_PRODUCT_MODULE := true include $(BUILD_PACKAGE)
|
(4). 把 App 工程放到 android/vendor/xx/public/package/apk 目录下,在完整编译了一次 android 之后,就可以进入 App 工程目录 mm 编译 apk 了。
待改进
maven仓库可以在内网架设本地镜像仓库。
本地 jni 编译可以采用更先进的 CMake 编译。
编译服务器的编译可以采用更先进的 Android.bp 编译。
后续根据需求持续更新 sdk 版本。