- 目的
为了避免在windows端多用户同时登陆打包时的抢占断开连接操作,将安卓App打包环境在Linux环境下也配置一份,可以实现多用户同时打包互不影响。
- 实现机制
将打包工具gradle , 安卓linux环境SDK,jdk, 签名key以及框架源码在Linux固定目录下配置好,然后编写脚本来实现流程操作:
- 获取命令行运行参数,例如项目名称,首页地址,app名称;
- 判断参数是否符合要求,否则退出;
- 拷贝源码放入使用当前时间命名的文件夹中;
- 对于拷贝源码中的首页地址,app名称信息进行替换;
- 编译;
- 将生成的apk拷贝到项目名称命名的文件夹;
- 删除因为编译而生成的整个目录的临时文件;
具体脚本代码如下:
#!/bin/sh
if [ $# -ne 3 ];then
echo "请输入正确的参数 1:项目名称 2:首页地址 3:App名称 "
exit 1
fi
project_name=$1
first_page_url=$2
appName=$3
tempDir=$(date "+%Y%m%d%H%M%S")
cp AppFramework/ ${tempDir} -R
echo "拷贝源代码结束."
sed -i "s/<string name=\"app_name\">.*<\/string>/<string name=\"app_name\">${appName}<\/string>/" ./${tempDir}/app/src/main/res/values/strings.xml
sed -i "s~<first_page_url url=.*\/>~<first_page_url url=\"${first_page_url}\"\/>~" ./${tempDir}/app/src/main/assets/app_config.xml
echo "替换app名称和首页地址结束"
cd ${tempDir}
../gradle-4.4/bin/gradle clean
../gradle-4.4/bin/gradle assembleDebug
echo "编译结束"
cd ..
rm -rf ${project_name}
mkdir ${project_name}
cp ${tempDir}/app/build/outputs/apk/debug/app-debug.apk ${project_name}/${project_name}.apk
echo "拷贝apk结束"
cd ${project_name}
output=`pwd`
cd ..
rm -rf ${tempDir}
echo "删除临时文件目录结束"
echo "生成apk目录位于${output},快去看看吧"
关于android 在linux 环境下的SDK 单独安装的问题说明一下:
1、去官网下载linux环境的的SDK安装工具包
https://developer.android.google.cn/studio
提供了独立于android studio ide 的单独安装包
2、进入tools/bin 目录,运行sdkmanager 命令, ./sdkmanager --list 会列出所有的需要安装的文件和版本:
3、根据 https://www.cnblogs.com/tsingke/p/9054044.html
说明来选择安装下载文件,build-tool, platform, source 这三个应该是都要搞一个的,直接使用命令./sdkmanager "XXXX",
例如 ./sdkmanager "build-tools;29.0.1"
最终的目录结果如下:
Linux 环境部署
为了避免其他用户在打包时对于编译环境的误操作破坏,所以不能给root账号来进行操作,需要新增其他账号来进行权限管理。关于Linux 新建用户和权限分组管理好久没有接触了,这个要追溯到七八年前刚毕业的时候,在第一家公司还是有弄过,现在对于概念还是有的,只是具体指令的用法早已经烟消云散,抛之脑后了,犹记得当年有一本 《鸟哥的私房菜》很受大家追捧,对于我们当时那帮初出校园的毛头小伙来说,算是一本绝好的步入工作的武林秘籍。
在新建用户的时候就遇到了第一个问题,将新增用户的登入目录设置到了root的子目录,导致使用ssh登录无法登入的问题,后来才明白/root目录应该就是root账号独有的目录,新增用户应该独立门户,自己在跟目录下新建一个,至少不能用到root目录下的目录。
useradd -d 分配目录 -m 用户
例如 useradd -d /androidPack -m androidPack
passwd 设置密码
例如 passwd androidPack 123456
接着就是将某个目录分配给某个用户了,我这边的/androidPack 目录就专门为androidPack 而生,所以全给它了
chown -R user:group file一般为整个分配的目录
例如 chown -R androidPack:androidPack /androidPack
chmod 使用root账号给 ugo 分配权限
权限分配这个是最重要的, 对于ls 命令列出来的信息,要明白权限有三部分,文件拥有者,同一个分组,其他用户 三部分,
https://www.runoob.com/linux/linux-comm-chmod.html
我这边在搭建部署编译环境时都是在root账号下操作,因此文件拥有者就是root
因为这些文件都是root 创建的,虽然他们在/androidPack目录下,当然这个目录的拥有者还是androidPack 用户,但是这个用户和root用户又不在同一个分组group ,所以对于androidPack来说,他属于O,也就是others其他用户,权限就在第三部分,默认的是可读和可执行,即不能进行写操作,符合我们的需求。
通过命令cat /etc/passwd 或者 cat /etc/group 命令可以查看各个用户的信息:
root:x:0:0:root:/root:/bin/bash
androidPack:x:1001:1001::/androidPack:/bin/bash
另外还有个需求就是部署环境的编译工具,SDK这些虽然一般不用动,但是框架源代码会需要更新,因此使用了Jenkins 来检测框架SVN 代码提交,自动拷贝更新的功能,所以需要对部署环境的源码目录有一个具有写入权限的用户,所以根据如上理解,新增了Jenkins用户,并且将其分组设置成和root同一个,然后将框架代码目录的权限第二部分中增加了写权限来实现此需求。
useradd -g root jenkins
passwd jenkins 123456
最终可以使用androidPack 安全愉快地打包apk, 使用jenkins账号及时地更新框架源码,以及多用户同时操作的效果,收工。