Ant

Android自动化实施(2)—服务器上搭建Android环境

继上一篇文章说道编写android Ant编译脚本,脱离IDE编译带来的慢的痛苦。
为了偷懒,必须自动化。

2.如何在服务器中搭建Android环境

服务器中没有ui如何搭建Android环境呢?

首先将Google提供的Android linux SDK上传到服务器
或者使用curl 直接下载到服务器,高兴用啥就用啥。

解包。必须保证服务器的java环境已经配置好了。没配置好的赶快去yum install 或者 apt-get install

本人也是通过SDK中的REDEAME文件了解到的
可以使用

android update sdk --no-ui  
或者  
android update sdk -u   

这个组命令通过命令行去下载android sdk
但是时去下载会下载全部的包,有些包使我们不需要的,只选择几个必须包就ok 的。
执行

android list sdk   

会得到如下的信息

Packages available for installation or update: 19  
   1- Documentation for Android SDK, API 17, revision 1  
   2- ARM EABI v7a System Image, Android API 17, revision 1  
   3- Google APIs, Android API 17, revision 1  
   4- Google APIs, Android API 16, revision 3  
   5- Google APIs, Android API 15, revision 2  
   6- Google APIs, Android API 14, revision 2  
   7- Google APIs, Android API 13, revision 1  
   8- Google APIs, Android API 12, revision 1  
   9- Google APIs, Android API 11, revision 1  
  10- Google APIs, Android API 10, revision 2  
  11- Intel Atom x86 System Image, Android API 10, revision 1  
  12- Google APIs, Android API 8, revision 2  
  13- Google APIs, Android API 7, revision 1  
  14- Google APIs, Android API 4, revision 2  
  15- Google APIs, Android API 3, revision 3  
  16- Google Play Billing Library, revision 2  
  17- Google Play Licensing Library, revision 2  
  18- Google USB Driver, revision 7  
  19- Intel x86 Emulator Accelerator (HAXM), revision 2  

使用

android update sdk --no--ui -filter 1,2,3,4  
或者  
android update sdk -u -t 1,2,3,4  

即可下载需要的依赖包。

这时候可能会报如下这个错。

/lib/ld-linux.so.2: bad ELF interpreter: No such file or directory  

不用担心,因为Google Android SDK 不支持64位机,怎么办呢?
看这篇文章点我,这篇文章会告诉你安装几个编译依赖即可解决问题,分别是

yum whatprovides ld-linux.so.2  
yum install xxx  
对于libncurses.so.5 和 libstdc++.so.6 执行同样操作  

将上一篇中的代码上传到服务器配置好ant环境
修改local.properties的sdk路径

在项目根目录来一发

ant release  

是不是很开心。

这时候可以写一个shell 脚本 package.sh 然后在服务器端执行即可。如果使用Java则使用JavaRuntime调用这个脚本就可以让服务器自动打包。

这里要提下,我在windows里写的shell脚本放在服务器端无法执行,各种奇怪问题,最后才发现是文件在两个OS间有差别造成的,比如换行Windows下是\r\n 但是Linux下是\n,最后在服务器上重写了这个脚本才可以顺利编译。经验告诉我们开发环境要和线上环境一致。
尼玛啊。

版权为本人xeodou所有。转载请注明出处。谢谢。

Android自动化实施(1)---编写Android自动化脚本

博客主要记录人生
说一说上一周在公司搭建的Android自动化打包实施工程
实施环境
vps
内存 2g
cpu 2GHz*2
OS centos 5.1
Android sdk 21
测试主机
OS window7 RTM

1.在本机配置Android自动化编译脚本

对于未使用ant构建Android工程的project须在project的根目录执行以下命令

android update project -p .  

会在更目录生成如下两个文件

build.xml`和`local.properties  

对于使用ant构建工程可以略过此步骤,对于使用maven构建工程的可以路过这篇文章。。。

修改build.xml

project name="xxxx"`为`project   

local.properties增加app.project.name=xxx即可

添加自定义编译预处理pre_build.xml文件
主要用户批处理修改引入的R文件和AndroidManifest.xml文件
例如:

  
  
<?xml version="1.0" encoding="UTF-8"?>  
<project>  
  <macrodef name="prepackage">  
    <sequential>  
       <echo>----- change debug false ------</echo>  
     <replaceregexp file='./src/com/xeodou/test/Log.java' flags="g" match="TEST =\s?([a-z]*)" replace="TEST = ${app.debug}">    
     </replaceregexp>  
     <replaceregexp file='./src/com/xeodou/test/Log.java' flags="g" match="LOG =\s?([a-z]*)" replace="LOG = ${app.debug}">    
     </replaceregexp>  
     <echo>----- modify manifest </echo>  
     <echo>----- include package name &amp;  umeng channel ID</echo>  
     <replaceregexp file='./AndroidManifest.xml' flags="g" match='package\s?=\s?"([\d,\w,\.]*)"' replace='package="com.com/xeodou/${app.package}"' byline='true'>  
     </replaceregexp>  
     <echo>----- modify .R file -----</echo>  
     <replaceregexp encoding="utf-8" match="import com.xeodou.test.R;" replace="import com.xeodou.${app.package}.R;" flags="g">  
        <fileset dir="./src">    
           <include name="**/*.java"/>    
        </fileset>   
      </replaceregexp>  
      <taskdef resource="net/sf/antcontrib/antlib.xml"/>  
      <if>  
        <equals arg1="${app.icon.ldpi}" arg2=""/>  
              <else>  
            <echo>----- icon will change ------</echo>     
            <echo>----- modify app icon  ----</echo>  
            <copy file="${app.icon.ldpi}" tofile="./res/drawable-ldpi/ic_icon.png" overwrite="true"></copy>  
            <copy file="${app.icon.mdpi}" tofile="./res/drawable-mdpi/ic_icon.png" overwrite="true"></copy>  
            <copy file="${app.icon.hdpi}" tofile="./res/drawable-hdpi/ic_icon.png" overwrite="true"></copy>  
            <copy file="${app.icon.xhdpi}" tofile="./res/drawable-xhdpi/ic_icon.png" overwrite="true"></copy>  
        </else>  
        </if>  
      </sequential>  
  </macrodef>  
</project>  
  

以上问一个pre_build.xml样例主要使用正则去修改了包名 关闭log和切换线上代码,还可以增加其他的正则匹配,渠道名什么的也是可以的嘛。值得注意的是要是想在ant中使用if标签必须下载antcontrib这个第三方包,放入ant/lib目录在需要使用if标签的文件中引入
如下代码就可以尽情使用if else了

<taskdef resource="net/sf/antcontrib/antlib.xml"/>

此时还需配置下local.properties文件。
增加

key.alias=  
key.alias.password=  
key.store=  
app.package=  
key.store.password=  
app.icon.xhdpi=  
app.icon.ldpi=  
app.icon.hdpi=  
app.icon.mdpi=  
app.debug=  

key.store 为keystore文件的目录,其他为需要在pre_build.xml中使用的常量。
加入诸如也是可以的嘛。

version.code=4  
version.name=2.3  

最后在build.xml中添加如下代码

<import file="pre_package.xml"/>  
<prepackage/>  

使用终端切换到project的根目录运行

ant release  

泡杯咖啡,稍等片刻就会发现项目的根目录下的bin里躺着xxxx-release.apk文件了。

版权为本人xeodou所有。转载请注明出处。谢谢。