APK更新集成實踐

任務目標:將內網APK打包後最新下載連接、更新時間、更改日誌顯示在一個我本身製做的APP裏html

任務做用咱們在內網測試時更新下載APK更加便捷,而且可以清楚目標APK的版本狀況,迴歸、驗證作到有的放矢android

實現原理nginx

APK下載部分git

使用Jenkins打包APK後執行shell將最新打包的APK複製到Nginx配置的根目錄web

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

Nginx配置:app

/usr/local/nginx/conf/nginx.conf 添加一個9000端口的serveride

 

這樣在網頁上請求"http://192.168.3.151:9000/passenger-smzcself-release.apk"就能夠下載都更新後的最新APKsvn

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上一次打包更新到了什麼內容

切割腳本以下:

 1 #!/bin/sh
 2 function funAWK()
 3 {
 4     out=`awk '/./ {print}' $1`
 5     out1=`echo $out | awk '
 6         {
 7         alen=split($0,a,"committer");
 8         for(k=2;k<=alen;k++)
 9             {
10                 print a[k];            
11             }
12         }'`
13     echo "$out1" > 001.log
14     out2=`cat 001.log | while read line 
15     do 
16     echo ${line%%100*} 
17     done`
18     echo "$out2" > 001.log
19     out3=`cat 001.log | while read line 
20     do 
21     echo ${line%%This reverts*} 
22     done`
23     echo "$out3" > 001.log
24     out4=`cat 001.log | while read line 
25     do 
26     echo ${line%%Change-Id*} 
27     done`
28     echo "$out4" > 001.log
29     sed -i "s/+0800/提交/g" 001.log
30     cat 001.log > $2
31 }
32 funAWK /var/lib/jenkins/jobs/Android_Passenger_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/passenger_log.html
33 funAWK /var/lib/jenkins/jobs/Android_Taxi_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/taxi_log.html
34 funAWK /var/lib/jenkins/jobs/Android_Driver_Release/builds/lastSuccessfulBuild/changelog.xml /usr/local/nginx/html/driver_log.html 

 

最終集成

我將這幾個網頁集成在同一個網頁上一個網頁顯示下載連接另外兩個網頁做爲整個網頁的iframe顯示,建立一個APP工程,這個工程很是的簡單隻有一個webview控件,這個控件顯示了我製做了的那個網頁,更新APK信息後在APP端只用下拉刷新網頁就會顯示最新的更新信息

最終效果

 

安卓佈局代碼:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.smzc_apk_update">
 4     <uses-permission android:name="android.permission.INTERNET"></uses-permission>
 5     <application
 6         android:allowBackup="true"
 7         android:icon="@mipmap/smzc"
 8         android:label="神馬APK升級"
 9         android:roundIcon="@mipmap/smzc"
10         android:supportsRtl="true"
11         android:usesCleartextTraffic="true"
12         android:theme="@style/AppTheme">
13         <activity android:name=".MainActivity">
14             <intent-filter>
15                 <action android:name="android.intent.action.MAIN" />
16 
17                 <category android:name="android.intent.category.LAUNCHER" />
18             </intent-filter>
19         </activity>
20 
21     </application>
22 </manifest>

操做代碼:

 1 package com.example.smzc_apk_update;
 2 
 3 import android.os.Handler;
 4 import android.support.v4.widget.SwipeRefreshLayout;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.os.Bundle;
 7 import android.webkit.WebView;
 8 
 9 public class MainActivity extends AppCompatActivity {
10     private WebView webview;    SwipeRefreshLayout swipeRefreshLayout;
11     @Override
12     protected void onCreate(Bundle savedInstanceState) {
13         super.onCreate( savedInstanceState );
14         setContentView( R.layout.activity_main );
15         webview = (WebView) findViewById( R.id.webView );
16         webview.loadUrl( "http://192.168.3.151:9000/" );
17         swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);
18         //重寫這個佈局的下拉功能
19         swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
20             @Override
21             public void onRefresh() {
22                 webview.clearCache( true);
23                 //webview.reload();
24                 webview.loadUrl( "http://192.168.3.151:9000/" );
25                 new Handler().postDelayed(new Runnable() {
26                                               @Override
27                                               public void run() {
28                                                   swipeRefreshLayout.setRefreshing(false);
29                                               }
30                                           },
31                         2000);
32             }
33         });
34     }
35 }

結語

又到了你們喜聞樂見的血淚總結時間,本次任務耗時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
相關文章
相關標籤/搜索