基于VSTS的Xamarin.Android持续集成步骤详解

目录
  • Build Agent 环境需求
  • Build的部分分为以下步骤
    • 1. 还原NuGet包
    • 2. 替换版本号
    • 3. 编译Android程序
    • 4. 获取编译Andorid的AndroidManifest数据
    • 5. 对编译好的Android apk进行签名
    • 6. 删除多余的文件
    • 7. 生成 ReleaseNotes
    • 8. 生成预发布脚本

这些天做了一个,这里分享下

Build Agent 环境需求

DotNetFramework

msbuild

visualstudio

AndroidSDK

JDK

Xamarin.Android

Build的部分分为以下步骤

1. 还原NuGet包

a. 这步之所以存在,原因为我使用了Xamarin.Android进行编译,而没有直接对解决方案使用MSBUILD进行编译,所以需要单独还原一下NuGet包

b. 解决方案路径填写 **\*.sln 即可

2. 替换版本号

a. Xamarin.Android的版本号与AndroidManifest.xml中的versionName与versionCode有关,我在这里使用Powershell将版本号替换成了新的

b. 此脚本传递参数为当前源代码路径,$(Build.SourcesDirectory)

c. 脚本代码:

param(
        [string]$path
    )
    if([String]::IsNullOrEmpty($path)){
        $path= $($MyInvocation.MyCommand.Definition.Replace("build\changeVersion.ps1" ,""))
    }
    write $path
    $pattern='android:versionName="[^"]+"'
    $version=[String]::Format('android:versionName="{0}.{1}"',[DateTime]::Now.Year-2013,[DateTime]::Now.ToString("M.d.H"))
    $filePath = [System.IO.Path]::Combine($path,"source\AndroidAppProject\Properties")
    write $filePath
    ls $filePath *.xml | %{sc -Path $_.FullName -Value $($(gc $_.FullName) -replace $pattern,$version) }

3. 编译Android程序

a. 使用TSTS自带的Xamarin.Android进行编译

b. 输出目录我设定在了$(Agent.BuildDirectory)\bin$(BuildConfiguration)

c. 配置使用用户入队时的配置$(BuildConfiguration)

4. 获取编译Andorid的AndroidManifest数据

例如 packagename/label/versionName等

a. 这个是我自己写的一个VSTS扩展,用于获取一些应用的基本信息,并存储在对应的变量中,以备后续步骤使用(生成ReleaseNote时)

b. https://github.com/chsword/zou-vsts-tasks

5. 对编译好的Android apk进行签名

a. 使用 VSTS自带的Android签名 功能进行签名

b. 需要勾选 为APK签名,并填入Keystore密码、Keystore别名,密钥密码

c. Jarsigner 参数: -verbose -sigalg MD5withRSA -digestalg SHA1

d. 勾选Zipalign

6. 删除多余的文件

a. 因为编译时 DLL 也会被复制过来,所以需要删除下多余的文件,只留APK

7. 生成 ReleaseNotes

a. 使用的是 rfennell 的生成ReleaseNote的VSTS扩展

https://github.com/rfennell/vNextBuild/tree/master/Extensions/GenerateReleaseNotes

b. 我这里将 ReleaseNotes,生成了一个 MarkDown :ReleaseNotes.md,以备发布时使用

8. 生成预发布脚本

a. 我提前写了一个预发布Powershell脚本用于将APK发布到Bugly,主要是调用 CURL,这里就不详述了

这样,就可以进行 手动或自动集成的操作

小技巧:

关于敏感数据,一些敏感数据,比如签名时的密码、其实可以在 生成定义 的 变量 中进行定义,并设置为加密变量 ,这样在传输或编辑时,都将无法查看此变量

引用:

Vsts build 中可以使用的变量:

https://www.visualstudio.com/zh-cn/docs/build/define/variables

Bugly api文档

https://bugly.qq.com/docs/user-guide/api-beta/?v=20160824161206

获取 Xamarin.Android AndroidManifest 信息

https://github.com/chsword/zou-vsts-tasks

以上就是基于VSTS的Xamarin.Android持续集成步骤详解的详细内容,更多关于VSTS的Xamarin.Android持续集成的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android将Xamarin For VS升级为4.1.0.530版教程

    一.Xamarin for VS的版本简介 下面是Xamarin for VS发布的版本简介: --更早的版本(略) 2015年11月发布:Xamarin for VS 4.0.0.1717 Stable版(收费) 2016年3月发布:Xamarin for VS 4.0.1.145 Stable版(收费) 2016年5月发布:Xamarin for VS 4.0.4.4 Stable版(企业版,免费) 2016年6月发布:Xamarin for VS 4.1.0.530 Stable版(企业版

  • 详解xamarin Android 实现ListView万能适配器

    详解xamarin Android 实现ListView万能适配器 早些时候接触xamarin Android 的列表,写了很多ListView的Adapter,建一个ListView就写一个Adapter,每一个Adapter里面还有去写一个ViewHolder的类来优化,自从看了hongyang博客的listview万能适配器的文章,学习良多,所以就写篇关于xamarin android ListView通用适配器的文章. 本章主要分为以下三点: 打造通用的ViewHolder优化ListV

  • 详解Xamarin.Android 利用Fragment实现底部菜单

    本篇文章主要介绍了详解Xamarin.Android 利用Fragment实现底部菜单,分享给大家,具体如下: 效果图: 第一步:添加引用 引用 Crosslight.Xamarin.Android.Support.v7.AppCompat 这个包. 第二步:绘制Main和Fragment界面 fg_home.axml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:androi

  • 基于VSTS的Xamarin.Android持续集成步骤详解

    目录 Build Agent 环境需求 Build的部分分为以下步骤 1. 还原NuGet包 2. 替换版本号 3. 编译Android程序 4. 获取编译Andorid的AndroidManifest数据 5. 对编译好的Android apk进行签名 6. 删除多余的文件 7. 生成 ReleaseNotes 8. 生成预发布脚本 这些天做了一个,这里分享下 Build Agent 环境需求 DotNetFramework msbuild visualstudio AndroidSDK JD

  • 如何利用Jenkins + TFS为.Net Core实现持续集成/部署详解

    前言 在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次在本地发布之后还需要打包,上传,部署,十分繁琐.故这里采用了比较成熟的Jenkins 作为持续部署环境. 为了方便安装,我们这里使用了 Docker 来进行安装,至于 Docker 安装的步骤这里不在赘述,详情可以参考这一篇博文. 上面安装的是一个较老的版本,这里推荐参考Docker 官方文档来进行安装. 安装好 Docker 之后,拉取 Jenkins

  • 基于Python的Android图形解锁程序详解

    安卓手机的图形锁是3x3的点阵,按次序连接数个点从而达到锁定/解锁的功能.最少需要连接4个点,最多能连接9个点.网上也有暴力删除手机图形锁的方法,即直接干掉图形锁功能.但假如你想进入别人的手机,但又不想引起其警觉的话--你可以参考一下本文(前提条件:手机需要root,而且打开调试模式.一般来讲,如果用过诸如"豌豆荚手机助手"."360手机助手"一类的软件,都会被要求打开调试模式的.如果要删除手机内置软件,则需要将手机root). 首先科普一下,安卓手机是如何标记这9

  • Android几种多渠道打包的步骤详解

    1.什么是多渠道打包 在不同的应用市场可能有不同的统计需求,需要为每个应用市场发布一个安装包,这里就引出了Android的多渠道打包.在安装包中添加不同的标识,以此区分各个渠道,方便统计app在市场的各种. 2.几种打包方式 友盟 UMeng Android Studio自带 美团 Walle 3.开始使用 3.1 友盟UMeng 第一步:在AndroidManifest中添加 <meta-data android:name="UMENG_CHANNEL" android:val

  • Android Studio 3.6安装全过程及AVD安装运行步骤详解

    1.安装JDK1.7以上版本,Android Studio集成开发环境 (1)安装并检查JDK1.8,如图1.1所示 图1.1 配置完成的验证 (2)开始安装Android Studio集成开发环境,安装允许以管理员模式运行,如图1.2所示 图1.2 安装界面 (3)安装位置为F:\Studio\ android-studio-ide-192.6200805-windows,进行安装,如图1.3所示 图1.3 安装位置 (4)Android Studio集成开发环境安装完成,如图1.4所示 图1

  • 基于mybatis逆向工程的使用步骤详解

    使用mybatis生成逆向工程的详细步骤,我个人感觉这个是最简单的一个了,虽然网上有很多种的方法来生成逆向工程,可是这个方法最简单.在这里我是使用maven搭建的环境,但是在正常的环境下也是一样的. 步骤: 1.创建一个genreatorConfig.xml文件,这个文件的名字可以任意.我创建的时候是将它放在了src/main/resources下,这个文件的内容并不需要去记,只需要去网上找就可以了.我们要做的只是对配置文件当中的一些部分做修改,修改成自己的数据就可以了. <?xml versi

  • Android Studio 生成自定义jar包的步骤详解

    想要将一个项目导出为jar包,供其它项目使用,在eclipse中可以直接导出该项目为jar包,而 在AS中可以通过修改gradle才处理. 接下来就介绍下具体的步骤: 1.新建一个项目,项目名随意,eg:MakeJarApplication,在项目中新建一个module类型为android-library ,命名为testLibrary.如图: 项目结构图 2.让app依赖这个库,在app下的build.gradle文件中添加compile project(':testlibrary') dep

  • 基于Android RxCache使用方法详解

    前言 我为什么使用这个库? 事实上Android开发中缓存功能的实现选择有很多种,File缓存,SP缓存,或者数据库缓存,当然还有一些简单的库/工具类,比如github上的这个: [ASimpleCache]:a simple cache for android and java 但是都不是很好用(虽然可能学习成本比较低,因为它使用起来相对简单),我可能需要很多的静态常量来作为key存储缓存数据value,并设置缓存的有效期,这可能需要很多Java代码去实现,并且过程繁琐. 如果您使用的网络请求

  • Android Studio将程序打包成APK的步骤详解

    第一步:先点击Build选择GenerateSigned APK 第二步:如果之前有编译成APK的话,就直接选择Choose existing已经存在的key:如果没有编译成APK那就选择Create new创建一个新的key的存放路径,然后填上密码,其中First and Last Name填一下,其他的无所谓.如图 尽量保证图中所指的两处密码相同,这样可以避免混淆,然后点击ok.下图的红圈之内填的是存储key的文件名. 做完上述的操作,会返回下图,然后点击next 接下来,一定要点击下图标记

  • 基于Android FileProvider 属性配置详解及FileProvider多节点问题

    众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.0+的机型需要这样写: 1:代码适配 if (Build.VERSION.SDK_INT > 23) {// intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); Uri contentUri = FileProvider.getUriForFile(context, SysInfo.packageN

随机推荐