Linux上如何编译android apk——jdk、gradle、android sdk的安装与使用

背景

Jenkins上目前需要增加对安卓流水线的支持,研究了下,发现核心流程就是通过gradle命令,来调用android sdk生成apk包,再把apk作为制品放到Jenkins上即可。

环境准备

主要就三个,jdk、gradle和android sdk。

jdk

gradle要依赖jdk才能运行,如果图省事,直接让gralde调用Jenkins宿主机上jdk就行,但我Jenkins宿主机的JDK是OpenJDK 1.8的,因为不知道哪天gradle会抛弃jdk 1.8,所以我用adoptopenjdk:8-jdk-hotspot 作为Docker基础镜像来调用gradle,这样哪天要升级jdk,换一个基础镜像即可。

gradle

gradle的作用类似于maven,搞安卓开发的同学肯定或多或少会了解过它,每次要生成apk时,就在AS的界面上点一下clean、assemble、assembleDebug、assembleRelease的按钮。

在这里插入图片描述

其实AS在你点击之后,也是调用的你电脑上的gradle来对项目进行清理和打包。具个调用哪个gradle呢?如果你是AS新建的安卓工程,那么在你的工程目录下肯定有几个名称带有gradle的文件:

在这里插入图片描述

build.gradle中指定了你所需要的gradle插件版本(图中3.6.3),gradlew和gradlew.bat分别是linux和windows下的gradle可执行脚本,你点击AS界面上的asseble按钮时,其实就是执行的就是这个脚本里的内容。这个脚本会去调用gradle/wrapper目录下的文件,来下载与gradle插件版本对应的gradle工具,工具的版本是在gradle-wrapper.properties中指定的,但这个版本不是想写啥就是啥,它与gradle插件版本有个对应关系,见gradle插件与gradle工具版本对应关系

这里展开讲一下gradle-wrapper.properties这个文件,如图

在这里插入图片描述

当你使用gradle打包过几次apk后,可以找一下你的gradle的目录下,会有个wrapper/dists目录,里面有跟你在gradle-wrapper.properties里面指定的版本一样的gradle目录

在这里插入图片描述

关于gradle插件和gradle工具之间的版本,也可以在AS的界面上进行调整

在这里插入图片描述

看到这里,大家应该也就明白了,gradle其实是不需要像maven那样单独安装的,因为AS已经把gradle事合到了android的工具目录里,只要你提交的代码中把图中的几个目录一起上传到git就行。

其实这是gradle的一个功能特性,为了避免不同项目依赖的gradle版本有冲突,gradle对自己进行了一层封装gradlew。gradlew具备gradle一样的功能,AS实际上是调用的项目下的gradlew。

android sdk

android sdk才是重头戏。在AS里安装android sdk很容易,直接在界面上勾上你所需要的安卓版本的sdk platform就行,但到了CentOS上,没有了AS的IDE环境,咋安装android sdk法?
在这里插入图片描述
其实在安卓开发者官网上,是可以单独下载android sdk的,称之为Command line tools。
在这里插入图片描述

这个文件是用来管理android sdk的,可以通过命令行来下载、更新、删除sdk platform

2023-12-18更新:官方下的最新版需要使用JDK17才能正常运行,如需要旧版本,可去一文了解:Android cmdline-tools 版本与其最小JDK关系 下载历史版本,下图来源上述文档,侵删
在这里插入图片描述

将Linux版本的这个zip文件下载、上传、解压到CentOS的目录中,我这里是放到了/home/android/sdk/cmdline-tools/latest目录下:

在这里插入图片描述

这个工具要求必须是放在以 /cmdline-tools/latest 命名的目录下才行,不然在执行的过程中会弹错要求你指定sdk_root。换言之,如果你是放在 /cmdline-tools/latest目录下,那么cmdline-tools的上一级目录就是sdk_root。

进入bin目录,执行./sdkmanager --list,可以列出来所有可以安装的android platform及其它工具

在这里插入图片描述

我们需要的一般只是build-tool和platforms,这里安装最新版的安卓sdk,执行 ./sdkmanager “build-tools;32.0.0” “platforms;android-32” ,如果要安装其它版本依次往后加即可,注意用 " 括起来。安装完成后还需要执行 ./sdkmanager --licenses 授权sdk的license,一路y下去即可,如果不这样后面编译apk时会提示license没授权。后续如果要安装其它版本的sdk,可以回到这里添加其它版本即可,注意每添加一个版本都需要重新授权,另外如果要更新/删除某个版本,执行./sdkmanager --update或者–uninstall。

安装完之后,回到sdk目录(我这里是/home/android/sdk),可以发现多了几个文件夹,各个文件夹中的作用见Android SDK Tools,Platform-tools,Build-tools分别有什么作用?,我们主要是会用到tools文件夹下的工具。

在这里插入图片描述

到这一步基本上就完成了android sdk的安装,可以开始使用Jenkins来进行安卓的编译了。

这里先回到Android Studio工程下的一个文件local.properties,它指定了你的系统sdk的安装目录,在我windows下是D:\android\sdk,但是刚才在CentOS下这里需要改成/home/android/sdk。可是我们肯定不能指望整个公司的程序员每次提交代码的时候去手动修改这里,所以需要在服务器上去调整。
在这里插入图片描述

Jenkins流水线

拉代码

这里就不展开说了,用的Jenkins的gitlab插件去拉

checkout([$class: 'GitSCM', branches: [[name: "{{BUILD_GITSCM_DATA_BRANCH}}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "{{BUILD_GITSCM_DATA_CREDENTIALID}}", url: "{{BUILD_GITSCM_DATA_GITURL}}"]]])

打包

所谓打包,其实就是执行gradle clean assemb命令。但上文我提过我不准备直接调用Jenkins自带的jdk,而是转用Docker,所以我做了一个带jdk的Docker image来执行gradlew,dockerfile如下:

FROM adoptopenjdk:8-jdk-hotspot

RUN echo "Asia/Shanghai" > /etc/timezone

RUN set -o errexit -o nounset \
    && echo "Adding gradle user and group" \
    && groupadd --system --gid 1000 gradle \
    && useradd --system --gid gradle --uid 1000 --shell /bin/bash --create-home gradle \
    && mkdir /home/gradle/.gradle \
    && chown --recursive gradle:gradle /home/gradle \
    && echo "Symlinking root Gradle cache to gradle Gradle cache" \
    && ln -s /home/gradle/.gradle /root/.gradle \
    && echo "install dos2unix and vim" \
    && apt-get update \
    && apt-get install --yes --no-install-recommends \
    dos2unix \
    vim \
    && rm -rf /var/lib/apt/lists/*

# 这个docker需要外挂宿主机三个目录
# 这个里面是android sdk生成的一些文件,例如debug.keystore等,必须挂载
VOLUME /root/.android
# 这个是安卓sdk的目录,必须挂载
VOLUME /home/android/sdk
# 这个里面是gradlew工具,不挂也行,但是不挂的话就每次都需要重新下载gradlew工具,影响打包速度
VOLUME /home/gradle/.gradle

WORKDIR /home/application

# 以下部分做了两件事,1是使用dos2unix将用户提交的gradlew脚本改成linux能识别的格式(主要是换行符),2是修改local.properties中的sdk路径
RUN echo "#!/bin/bash" > /home/assemb.sh \
    && if [ -f /home/application/local.properties ];then echo "sed -i 's/sdk\.dir=.*/sdk\.dir=\/home\/android\/sdk/g' local.properties" >> /home/assemb.sh ;else echo "echo sdk.dir=/home/android/sdk > /home/application/local.properties">> /home/assemb.sh;fi \
    && echo 'dos2unix ./gradlew && chmod +x ./gradlew && ./gradlew clean assemb' >> /home/assemb.sh && chmod +x /home/assemb.sh
CMD ["/bin/bash","/home/assemb.sh"]

在Jenkins里调用这个镜像的方法如下

sh 'docker run --rm -v $(你的安卓工程目录,也就是gradlew所在的目录):/home/application -v /root/.android:/root/.android -v /home/gradle/.gradle/wrapper:/home/gradle/.gradle/wrapper -v /home/android/sdk:/home/android/sdk -w /home/application --privileged=true ' + "${docker_server}/androidadoptjdk:1.8 | tee build_log.log"

结合刚才的dockerfile,实际上执行的就是gradlew clean assemb。此时gradlew会自动去下载所需要的gradle工具,并调用androidsdk对代码进行打包apk。

这一步结束其实apk就已经生成了,而且会同时生成debug和release版本(如果在build.gradle中指定了的话),如果只要debug/release版本,可以在dockerfile中调整一下gradlew clean assembleDebug或者gradlew clean assembleRelease。

获取apk版本

gradle很坑的一点,是不能像maven命令一样去获取安卓项目的应用名和版本号,因此只能通过安卓的apkanalyzer工具来反向分析apk。在Jenkins中的命令如下:

# 应用名
sh 'docker run --rm -v $(你的安卓工程目录,也就是gradlew所在的目录):/home/application -v /root/.android:/root/.android -v /home/gradle/.gradle/wrapper:/home/gradle/.gradle/wrapper -v /home/android/sdk:/home/android/sdk -w /home/application --privileged=true ' + "${docker_server}/androidadoptjdk:1.8 " + 'sh -c "find ./  -name  *.apk|head -1|xargs -i /home/android/sdk/tools/bin/apkanalyzer manifest application-id {}|xargs -i echo {} > app_name"'

# 应用版本
sh 'docker run --rm -v $(你的安卓工程目录,也就是gradlew所在的目录):/home/application -v /root/.android:/root/.android -v /home/gradle/.gradle/wrapper:/home/gradle/.gradle/wrapper -v /home/android/sdk:/home/android/sdk -w /home/application --privileged=true ' + "${docker_server}/androidadoptjdk:1.8 " + 'sh -c "find ./  -name  *.apk|head -1|xargs -i /home/android/sdk/tools/bin/apkanalyzer manifest version-code {}|xargs -i echo {} > app_version"'

收集制品

Jenkins自带的archive命令,收集所有目录下的所有apk结尾的文件即可。

archiveArtifacts '**/*.apk'

效果

流程:

在这里插入图片描述

制品:

在这里插入图片描述

### 回答1: 要将GDAL编译为适用于Android的共享库(.so),可以按照以下步骤进行操作: 1. 确保你已经具备了进行Android开发的环境,包括Android Studio和SDK。 2. 下载GDAL源代码,可以从官方网站或GitHub获取最新的GDAL源代码。 3. 在下载的GDAL源代码目录中找到`android`文件夹,这个文件夹包含了编译所需的相关配置和脚本。 4. 进入`android`文件夹,并在终端中运行`./build.py`命令,这个命令将使用脚本自动编译GDAL为Android的共享库。 5. 等待编译过程完成,这可能需要一些时间。如果一切顺利,编译过程会生成共享库文件(.so)和其他所需的库文件。 6. 将生成的共享库文件(.so)复制到你的Android项目中,并在项目的`jniLibs`文件夹中创建对应的架构文件夹(如armeabi-v7a、arm64-v8a等),将库文件分别放入各自的文件夹中。 7. 在Android项目的`gradle.build`文件中添加相应的NDK配置,以确保Android系统能够正确加载并使用GDAL共享库。配置示例: ```groovy android { // ... defaultConfig { // ... ndk { abiFilters 'armeabi-v7a', 'arm64-v8a' // 添加所需的架构 } } // ... } ``` 8. 然后就可以在你的Android项目中使用GDAL库了。你可以根据GDAL的文档和API参考来编写自己的代码,并通过JNI接口调用GDAL库中的功能。 这些步骤可以帮助你将GDAL编译为适用于Android的共享库,供你的Android项目使用。记得遵循GDAL和Android的相关开发规范,并根据你的项目的需求进行适当的配置和调整。 ### 回答2: 要将GDAL编译成可以在Android使用的.so库,您可以按照以下步骤进行操作: 1. 在编译GDAL之前,您需要准备好Android NDK(Native Development Kit),它包含了用于编译C/C++代码的工具链和库。 2. 下载GDAL的源代码,并解压缩到一个目录中。 3. 打开终端(或命令提示符),进入GDAL源代码目录。 4. 创建一个用于构建Android库的文件夹,可以命名为"android-build"。 5. 在终端中切换到"android-build"文件夹,并运行以下命令: ``` $ /path/to/android-ndk/ndk-build -C /path/to/gdal/source ``` 其中"/path/to/android-ndk"是Android NDK的安装路径,"/path/to/gdal/source"是GDAL源代码的路径。 6. 等待编译完成,成功后会在"android-build"文件夹中生成一个".so"文件,该文件即为可用于Android的GDAL库。 7. 将生成的".so"文件复制到您的Android项目中的"libs"文件夹。 8. 在您的Android项目的build.gradle文件中,添加以下代码: ``` android { // ... sourceSets { main { jniLibs.srcDirs = ['libs'] } } } ``` 这会告诉Android构建系统在编译时将so库打包到apk文件中。 9. 使用GDAL功能的代码中,可以加载并使用GDAL库了。您可以在代码中使用`System.loadLibrary("gdal")`来加载库。 10. 现在,您可以在Android应用程序中使用GDAL库了,通过调用GDAL函数进行地理数据处理和分析。 以上是将GDAL编译成可以在Android使用的.so库的基本步骤。根据您的具体编译环境和需求,可能需要进行一些额外的配置和调整。 ### 回答3: 为了将GDAL编译成适用于Android的.so库,您可以按照以下步骤进行操作: 1. 下载GDAL源代码:您可以从GDAL官方网站(https://gdal.org/)下载最新的GDAL源代码压缩包。 2. 配置Android开发环境:确保您的系统配置了适用于Android开发的环境,包括安装了Java JDKAndroid SDK和NDK。 3. 解压GDAL源代码压缩包:将下载的GDAL源代码压缩包解压到您的计算机上的一个目录中。 4. 打开终端:在终端中进入GDAL源代码的根目录。 5. 设置编译参数:使用以下命令设置编译参数: ``` export CC=<在NDK中找到您的工具链的绝对路径> export CXX=<在NDK中找到您的工具链的绝对路径> export AR=<在NDK中找到您的工具链的绝对路径> export CFLAGS="-fPIC" export ANDROID_NDK=<您的NDK安装路径> export ANDROID_SDK=<您的SDK安装路径> ``` 6. 配置编译选项:使用以下命令配置编译选项: ``` ./configure \ --host=arm-linux-androideabi \ --with-android=yes \ --prefix=/usr/local \ --with-jpeg=internal \ --with-png=internal \ --with-geotiff=internal \ --with-libtiff=internal \ --with-curl=no \ --with-pcraster=no \ --with-gif=no \ --with-ogr=no \ --with-php=no \ --with-xml2=no \ --with-expat=no \ --with-sqlite3=no \ --with-spatialite=no ``` 7. 编译安装:运行以下命令编译安装.so库: ``` make sudo make install ``` 8. 生成.so库:编译完成后,在你的目录中会生成一个.libs文件夹,在该文件夹中可以找到所需的.so文件。 现在,您已经成功地将GDAL编译Android可用的.so库。您可以将这些.so库添加到您的Android项目中,并在代码中使用GDAL的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值