任务目标:将内网APK打包后最新下载链接、更新时间、更改日志显示在一个我自己制作的APP里

任务作用:我们在内网测试时更新下载APK更加便捷,并且能够清楚目标APK的版本情况,回归、验证做到有的放矢

实现原理:

APK下载部分

使用Jenkins打包APK后执行shell将最新打包的APK复制到Nginx配置的根目录

cp -f $APK_BUILD_HOME/passenger-smzcself-release.apk /usr/local/nginx/html

Nginx配置:

/usr/local/nginx/conf/nginx.conf 添加一个9000端口的server

这样在网页上请求"http://192.168.3.151:9000/passenger-smzcself-release.apk"就可以下载都更新后的最新APK

APK更新时间部分

echo 更新时间 > /usr/local/nginx/html/passenger.html
echo $CURRENT_TIME >> /usr/local/nginx/html/passenger.html

shell将 APK打包时间写入到passenger.html文件,网页请求http://192.168.3.151:9000/passenger.html显示打包更新时间

APK更新日志部分

Jenkins每次打包成功后都会根据git或者svn提交注释生成修改日志

这个变更日志保存在Jenkins工作文件夹jobs下builds/lastSuccessfulBuild/changelog.xml里面,这个文件的XML格式,我需要将它简单切割后内容发送到/usr/local/nginx/html/passenger_log.html,最终访问http://192.168.3.151:9000/passenger_log.html这个页面就可以显示我们的APK上一次打包更新到了什么内容

切割脚本如下:

 #!/bin/sh
function funAWK()
{
out=`awk '/./ {print}' $`
out1=`echo $out | awk '
{
alen=split($,a,"committer");
for(k=;k<=alen;k++)
{
print a[k];
}
}'`
echo "$out1" > .log
out2=`cat .log | while read line
do
echo ${line%%*}
done`
echo "$out2" > .log
out3=`cat .log | while read line
do
echo ${line%%This reverts*}
done`
echo "$out3" > .log
out4=`cat .log | while read line
do
echo ${line%%Change-Id*}
done`
echo "$out4" > .log
sed -i "s/+0800/提交/g" .log
cat .log > $
}
funAWK /var/lib/jenkins/jobs/Android_Passenger_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/passenger_log.html
funAWK /var/lib/jenkins/jobs/Android_Taxi_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/taxi_log.html
funAWK /var/lib/jenkins/jobs/Android_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/driver_log.html

最终集成

我将这几个网页集成在同一个网页上一个网页显示下载链接另外两个网页作为整个网页的iframe显示,创建一个APP工程,这个工程非常的简单只有一个webview控件,这个控件显示了我制作了的那个网页,更新APK信息后在APP端只用下拉刷新网页就会显示最新的更新信息

最终效果

安卓布局代码:

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.smzc_apk_update">
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/smzc"
android:label="神马APK升级"
android:roundIcon="@mipmap/smzc"
android:supportsRtl="true"
android:usesCleartextTraffic="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity> </application>
</manifest>

操作代码:

 package com.example.smzc_apk_update;

 import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebView; public class MainActivity extends AppCompatActivity {
private WebView webview; SwipeRefreshLayout swipeRefreshLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
webview = (WebView) findViewById( R.id.webView );
webview.loadUrl( "http://192.168.3.151:9000/" );
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
//重写这个布局的下拉功能
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
webview.clearCache( true);
//webview.reload();
webview.loadUrl( "http://192.168.3.151:9000/" );
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
},
2000);
}
});
}
}

结语

又到了大家喜闻乐见的血泪总结时间,本次任务耗时4天,其中对更改日志的切割耗时1天半,总结的坑点如下:

1.在shell脚本中 echo $a 和echo “$a” 是不一样的,不加引号时输出会自动合并到一行里,我反反复复在这个问题里面饶了1天才明白过来

2.在安卓里

23                 //webview.reload();
24 webview.loadUrl( "http://192.168.3.151:9000/" );是不一样的,
webview.reload()不会刷新 网页的iframe
												

最新文章

  1. JupyterNotebook如何添加table of content
  2. HTTP/TCP
  3. JavaScript滚动条插件源码
  4. [Xamarin] 關於Internal Storage ,存取App內部使用資料 (转帖)
  5. 转:LIRE的使用
  6. Java 两个变量交换值
  7. POJ3485 区间问题
  8. Android(java)学习笔记73:线程组的概述和使用
  9. hdu 3093 动态规划
  10. USACO月赛数据
  11. SparkMLlib-----GMM算法
  12. Ubuntu中使用iptables
  13. class AClass&lt;E extends Comparable&gt;与class AClass&lt;E extends Comaprable&lt;E&gt;&gt;有什么区别?
  14. java安装及设置环境变量
  15. 网络层和arp协议
  16. iOS坐标转换失败?
  17. 性能测试-----monkey稳定性测试
  18. 【java】设计模式-单例设计模式
  19. 解决CIFilter滤镜后图片大小和方向发生变化
  20. 『C++』Temp_2019_03_14 不同类的循环引用

热门文章

  1. 可编程实验板EPM1270T144C5蜂鸣器音调频率选择
  2. nginx和swoole怎么混合使用
  3. angular cli + primeNG
  4. ksoap2 android 调用WebService
  5. PHP $_SERVER超全局变量详解
  6. 属性文件——Java&amp;Spring
  7. windows 下使用批处理执行 postgresql 命令行操作
  8. 搭建虚拟机+静态IP+XShell管理虚拟机+jdk+tomcat热部署
  9. [转载]&mdash;&mdash;Automatic Tuning of Undo_retention Causes Space Problems (文档 ID 420525.1)
  10. (转)Ioc控制反转和依赖注入