Jenkins中使用ant管理Android应用开发生命周期







http://my.oschina.net/u/1377774/blog/177433

http://my.oschina.net/u/1377774/blog/177433



http://my.oschina.net/u/1377774/blog/177433



http://my.oschina.net/u/1377774/blog/177433





Jenkins中使用ant管理Android应用开发生命周期

发表于2年前(2013-11-19 12:15)   阅读( 2942) | 评论( 0)  3人收藏此文章, 我要收藏
0

4月23日,武汉源创会火热报名中,期待您的参与>>>>>   

CentOS6  Jenkins  Android应用  Ant

目录[-]

  • 软件环境
  • 配置管理
  • 1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。
  • 2.把Android工程改造成具有Ant特性
  • 3.源码库配置
  • 4.Jenkins中配置Ant
  • 执行各项任务
  • 1.打包APK
  • 2.打包APK后同时对apk进行签名和zipalign优化
  • 3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。
  • Troubleshootings
  • 参考文献
  • 软件环境

    OS:CentOS 6.0 64-bit

    Android SDK:adt-bundle-linux-x86_64

    Jenkins:1.529

    Ant:1.8.2

    配置管理

    1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。

    2.把Android工程改造成具有Ant特性

    (如果项目本身已经ant化了,略过此步。)

    先从源码库,比如SVN检出源码,然后进行工作空间执行

    # cd /myworkspace
    # $ANDROID_HOME/sdk/tools/android update project -p my-android-app   

    再把生成的文件上传到SVN。

    也可以从头开始生成一个全新的空白ant特性的android工程,

    # $ANDROID_HOME/sdk/tools/android create project -n myandroidapp -t a
    ndroid-19 -p my-android-app -k pragmatic.pkg -a Pragmatic

    -n Project name.
    -t android target id,必选
    -p 工程文件夹目录位置,必选
    -k 安卓包名称即AndroidManifest.xml中<manifest package=的名称,必选
    -a 安卓Activity名称,AndroidManifest.xml中<activity android:name=的名称

    不清楚参数用法使用# $ANDROID_HOME/sdk/tools/android create project命令行会告诉你用法

    然后打开ADT,import -> Andorid下面的Existing Android Code Into Workspace。再然后Team -> Share Project到SVN服务器。

    3.源码库配置

    在Jenkins项目配置页面,找到源码管理栏,作如下设置Jenkins中使用ant管理Android应用开发生命周期_第1张图片


    4.Jenkins中配置Ant

    方式一,把ant作为一个Jenkins内置的工具使用。

    Jenkins中使用ant管理Android应用开发生命周期_第2张图片

    新增一个ant安装

    Jenkins中使用ant管理Android应用开发生命周期_第3张图片

    保存后,进行项目构建配置页面,如下

    Jenkins中使用ant管理Android应用开发生命周期_第4张图片

    方式二,引用一个外部已有的ant安装。

    jenkins系统设置ant栏中,Jenkins中使用ant管理Android应用开发生命周期_第5张图片

    然后jenkins系统设置全局属性栏中

    保存后,进行项目构建配置页面,Invoke Ant中,Ant Version下拉列表选择ant-1.8.2-external。


    执行各项任务

    利用andorid sdk中ant提供的build.xml脚本(位于%ANDROID_HOME%/sdk/tools/ant目录)可轻松完成各种日常任务

    1.打包APK

    直须在Jenkins项目配置页面,找到Invoke Ant栏,作如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第6张图片

    2.打包APK后同时对apk进行签名和zipalign优化

    如果查看%ANDROID_HOME%/sdk/tools/ant/build.xml文件,会看到ant执行release操作的同时会根据local.properies和ant.properties中配置的属性,决定是否执行签名和zipalign。为些要在Invoke ant中如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第7张图片

    这样ant在打包时会自动根据密钥库、密码信息对生成的apk进行签名,而无需再手工输入密钥的密码。


    3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。

    在Jenkins构建Invoke Ant脚本后,增加一个Shell调用步骤,内容如下:

    #!/bin/bash
    adb uninstall com.aaa.pragmatic(.apk)
    adb install /target/dir/apks/com.aaa.pragmatic.apk

    前提是:(1)安装android usb driver  (2)手机与电脑相连  (3)电脑进程中没有tadb.exe、豌豆夹等运行。(4)如果不需要在设备上进行debug,可以更新AndroidManifest.xml文件,去掉android:debuggable。


    Troubleshootings


    1.   Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录  
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 


    BUILD FAILED 
    /android/sdk/tools/ant/build.xml:653: The following error occurred while executing this line: 
    /android/sdk/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    at java.lang.Runtime.exec(Runtime.java:615) 
    at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862) 
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481) 
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:631) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:672) 
    at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:498) 
    at com.android.ant.AaptExecTask.execute(AaptExecTask.java:699) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at com.android.ant.IfElseTask.execute(IfElseTask.java:120) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:809) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 
    Caused by: java.io.IOException: error=2, 没有那个文件或目录 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021) 
    ... 46 more 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y compat-libstdc++-296.i686 
    # yum install -y compat-libstdc++-33.i686 


    2.    [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 

    解决: 
    # yum install -y zlib 


    3.   [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y libstdc++.so.6 


    参考文献

    https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project

    http://jenkins-ci.org/content/getting-started-building-android-apps-hudson









    http://my.oschina.net/u/1377774/blog/177433

    http://my.oschina.net/u/1377774/blog/177433



    http://my.oschina.net/u/1377774/blog/177433



    http://my.oschina.net/u/1377774/blog/177433





    Jenkins中使用ant管理Android应用开发生命周期

    发表于2年前(2013-11-19 12:15)   阅读( 2942) | 评论( 0)  3人收藏此文章, 我要收藏
    0

    4月23日,武汉源创会火热报名中,期待您的参与>>>>>   

    CentOS6  Jenkins  Android应用  Ant

    目录[-]

  • 软件环境
  • 配置管理
  • 1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。
  • 2.把Android工程改造成具有Ant特性
  • 3.源码库配置
  • 4.Jenkins中配置Ant
  • 执行各项任务
  • 1.打包APK
  • 2.打包APK后同时对apk进行签名和zipalign优化
  • 3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。
  • Troubleshootings
  • 参考文献
  • 软件环境

    OS:CentOS 6.0 64-bit

    Android SDK:adt-bundle-linux-x86_64

    Jenkins:1.529

    Ant:1.8.2

    配置管理

    1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。

    2.把Android工程改造成具有Ant特性

    (如果项目本身已经ant化了,略过此步。)

    先从源码库,比如SVN检出源码,然后进行工作空间执行

    # cd /myworkspace
    # $ANDROID_HOME/sdk/tools/android update project -p my-android-app   

    再把生成的文件上传到SVN。

    也可以从头开始生成一个全新的空白ant特性的android工程,

    # $ANDROID_HOME/sdk/tools/android create project -n myandroidapp -t a
    ndroid-19 -p my-android-app -k pragmatic.pkg -a Pragmatic

    -n Project name.
    -t android target id,必选
    -p 工程文件夹目录位置,必选
    -k 安卓包名称即AndroidManifest.xml中<manifest package=的名称,必选
    -a 安卓Activity名称,AndroidManifest.xml中<activity android:name=的名称

    不清楚参数用法使用# $ANDROID_HOME/sdk/tools/android create project命令行会告诉你用法

    然后打开ADT,import -> Andorid下面的Existing Android Code Into Workspace。再然后Team -> Share Project到SVN服务器。

    3.源码库配置

    在Jenkins项目配置页面,找到源码管理栏,作如下设置Jenkins中使用ant管理Android应用开发生命周期_第8张图片


    4.Jenkins中配置Ant

    方式一,把ant作为一个Jenkins内置的工具使用。

    Jenkins中使用ant管理Android应用开发生命周期_第9张图片

    新增一个ant安装

    Jenkins中使用ant管理Android应用开发生命周期_第10张图片

    保存后,进行项目构建配置页面,如下

    Jenkins中使用ant管理Android应用开发生命周期_第11张图片

    方式二,引用一个外部已有的ant安装。

    jenkins系统设置ant栏中,Jenkins中使用ant管理Android应用开发生命周期_第12张图片

    然后jenkins系统设置全局属性栏中

    保存后,进行项目构建配置页面,Invoke Ant中,Ant Version下拉列表选择ant-1.8.2-external。


    执行各项任务

    利用andorid sdk中ant提供的build.xml脚本(位于%ANDROID_HOME%/sdk/tools/ant目录)可轻松完成各种日常任务

    1.打包APK

    直须在Jenkins项目配置页面,找到Invoke Ant栏,作如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第13张图片

    2.打包APK后同时对apk进行签名和zipalign优化

    如果查看%ANDROID_HOME%/sdk/tools/ant/build.xml文件,会看到ant执行release操作的同时会根据local.properies和ant.properties中配置的属性,决定是否执行签名和zipalign。为些要在Invoke ant中如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第14张图片

    这样ant在打包时会自动根据密钥库、密码信息对生成的apk进行签名,而无需再手工输入密钥的密码。


    3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。

    在Jenkins构建Invoke Ant脚本后,增加一个Shell调用步骤,内容如下:

    #!/bin/bash
    adb uninstall com.aaa.pragmatic(.apk)
    adb install /target/dir/apks/com.aaa.pragmatic.apk

    前提是:(1)安装android usb driver  (2)手机与电脑相连  (3)电脑进程中没有tadb.exe、豌豆夹等运行。(4)如果不需要在设备上进行debug,可以更新AndroidManifest.xml文件,去掉android:debuggable。


    Troubleshootings


    1.   Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录  
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 


    BUILD FAILED 
    /android/sdk/tools/ant/build.xml:653: The following error occurred while executing this line: 
    /android/sdk/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    at java.lang.Runtime.exec(Runtime.java:615) 
    at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862) 
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481) 
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:631) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:672) 
    at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:498) 
    at com.android.ant.AaptExecTask.execute(AaptExecTask.java:699) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at com.android.ant.IfElseTask.execute(IfElseTask.java:120) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:809) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 
    Caused by: java.io.IOException: error=2, 没有那个文件或目录 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021) 
    ... 46 more 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y compat-libstdc++-296.i686 
    # yum install -y compat-libstdc++-33.i686 


    2.    [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 

    解决: 
    # yum install -y zlib 


    3.   [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y libstdc++.so.6 


    参考文献

    https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project

    http://jenkins-ci.org/content/getting-started-building-android-apps-hudson




    http://my.oschina.net/u/1377774/blog/177433

    http://my.oschina.net/u/1377774/blog/177433



    http://my.oschina.net/u/1377774/blog/177433



    http://my.oschina.net/u/1377774/blog/177433





    Jenkins中使用ant管理Android应用开发生命周期

    发表于2年前(2013-11-19 12:15)   阅读( 2942) | 评论( 0)  3人收藏此文章, 我要收藏
    0

    4月23日,武汉源创会火热报名中,期待您的参与>>>>>   

    CentOS6  Jenkins  Android应用  Ant

    目录[-]

  • 软件环境
  • 配置管理
  • 1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。
  • 2.把Android工程改造成具有Ant特性
  • 3.源码库配置
  • 4.Jenkins中配置Ant
  • 执行各项任务
  • 1.打包APK
  • 2.打包APK后同时对apk进行签名和zipalign优化
  • 3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。
  • Troubleshootings
  • 参考文献
  • 软件环境

    OS:CentOS 6.0 64-bit

    Android SDK:adt-bundle-linux-x86_64

    Jenkins:1.529

    Ant:1.8.2

    配置管理

    1.Jenkins中配置JDK,直接配置1.7+以上JDK。过程略。

    2.把Android工程改造成具有Ant特性

    (如果项目本身已经ant化了,略过此步。)

    先从源码库,比如SVN检出源码,然后进行工作空间执行

    # cd /myworkspace
    # $ANDROID_HOME/sdk/tools/android update project -p my-android-app   

    再把生成的文件上传到SVN。

    也可以从头开始生成一个全新的空白ant特性的android工程,

    # $ANDROID_HOME/sdk/tools/android create project -n myandroidapp -t a
    ndroid-19 -p my-android-app -k pragmatic.pkg -a Pragmatic

    -n Project name.
    -t android target id,必选
    -p 工程文件夹目录位置,必选
    -k 安卓包名称即AndroidManifest.xml中<manifest package=的名称,必选
    -a 安卓Activity名称,AndroidManifest.xml中<activity android:name=的名称

    不清楚参数用法使用# $ANDROID_HOME/sdk/tools/android create project命令行会告诉你用法

    然后打开ADT,import -> Andorid下面的Existing Android Code Into Workspace。再然后Team -> Share Project到SVN服务器。

    3.源码库配置

    在Jenkins项目配置页面,找到源码管理栏,作如下设置Jenkins中使用ant管理Android应用开发生命周期_第15张图片


    4.Jenkins中配置Ant

    方式一,把ant作为一个Jenkins内置的工具使用。

    Jenkins中使用ant管理Android应用开发生命周期_第16张图片

    新增一个ant安装

    Jenkins中使用ant管理Android应用开发生命周期_第17张图片

    保存后,进行项目构建配置页面,如下

    Jenkins中使用ant管理Android应用开发生命周期_第18张图片

    方式二,引用一个外部已有的ant安装。

    jenkins系统设置ant栏中,Jenkins中使用ant管理Android应用开发生命周期_第19张图片

    然后jenkins系统设置全局属性栏中

    保存后,进行项目构建配置页面,Invoke Ant中,Ant Version下拉列表选择ant-1.8.2-external。


    执行各项任务

    利用andorid sdk中ant提供的build.xml脚本(位于%ANDROID_HOME%/sdk/tools/ant目录)可轻松完成各种日常任务

    1.打包APK

    直须在Jenkins项目配置页面,找到Invoke Ant栏,作如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第20张图片

    2.打包APK后同时对apk进行签名和zipalign优化

    如果查看%ANDROID_HOME%/sdk/tools/ant/build.xml文件,会看到ant执行release操作的同时会根据local.properies和ant.properties中配置的属性,决定是否执行签名和zipalign。为些要在Invoke ant中如下设置

    Jenkins中使用ant管理Android应用开发生命周期_第21张图片

    这样ant在打包时会自动根据密钥库、密码信息对生成的apk进行签名,而无需再手工输入密钥的密码。


    3.打包APK,签名和zipalign优化后把APK装到与Jenkins主机相连的手机上。

    在Jenkins构建Invoke Ant脚本后,增加一个Shell调用步骤,内容如下:

    #!/bin/bash
    adb uninstall com.aaa.pragmatic(.apk)
    adb install /target/dir/apks/com.aaa.pragmatic.apk

    前提是:(1)安装android usb driver  (2)手机与电脑相连  (3)电脑进程中没有tadb.exe、豌豆夹等运行。(4)如果不需要在设备上进行debug,可以更新AndroidManifest.xml文件,去掉android:debuggable。


    Troubleshootings


    1.   Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录  
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 


    BUILD FAILED 
    /android/sdk/tools/ant/build.xml:653: The following error occurred while executing this line: 
    /android/sdk/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program "/android/sdk/build-tools/android-4.4/aapt": error=2, 没有那个文件或目录 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029) 
    at java.lang.Runtime.exec(Runtime.java:615) 
    at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:862) 
    at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:481) 
    at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:495) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExecute(ExecTask.java:631) 
    at org.apache.tools.ant.taskdefs.ExecTask.runExec(ExecTask.java:672) 
    at org.apache.tools.ant.taskdefs.ExecTask.execute(ExecTask.java:498) 
    at com.android.ant.AaptExecTask.execute(AaptExecTask.java:699) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at com.android.ant.IfElseTask.execute(IfElseTask.java:120) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) 
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368) 
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251) 
    at org.apache.tools.ant.Main.runBuild(Main.java:809) 
    at org.apache.tools.ant.Main.startAnt(Main.java:217) 
    at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) 
    at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) 
    Caused by: java.io.IOException: error=2, 没有那个文件或目录 
    at java.lang.UNIXProcess.forkAndExec(Native Method) 
    at java.lang.UNIXProcess.<init>(UNIXProcess.java:135) 
    at java.lang.ProcessImpl.start(ProcessImpl.java:130) 
    at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021) 
    ... 46 more 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y compat-libstdc++-296.i686 
    # yum install -y compat-libstdc++-33.i686 


    2.    [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 

    解决: 
    # yum install -y zlib 


    3.   [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 
    -code-gen: 
    [mergemanifest] Merging AndroidManifest files into one. 
    [mergemanifest] Manifest merger disabled. Using project manifest only. 
         [echo] Handling aidl files... 
         [aidl] No AIDL files to compile. 
         [echo] ---------- 
         [echo] Handling RenderScript files... 
         [echo] ---------- 
         [echo] Handling Resources... 
         [aapt] Generating resource IDs... 
         [aapt] /android/sdk/build-tools/android-4.4/aapt: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory 


    原因:在64位Linux下打包成APK时缺少x86下C++语言库。

    解决: 
    # yum install -y libstdc++.so.6 


    参考文献

    https://wiki.jenkins-ci.org/display/JENKINS/Building+an+Android+app+and+test+project

    http://jenkins-ci.org/content/getting-started-building-android-apps-hudson



    你可能感兴趣的:(Jenkins中使用ant管理Android应用开发生命周期)