转:Android开发实践:用脚本编译Android工程

转自: http://ticktick.blog.51cto.com/823160/1365947

一般情况下,我们都是使用Eclipse+ADT插件或者Android studio软件来编译Android工程的,其实,Eclipse或者Android studio仅仅是将一些编译命令封装到可视化界面里而已,通过shell脚本、ADT附带的一些命令以及Ant工具,我们完全可以将Android工程的编译过程自动化,直接通过运行脚本就得到最终的APK文件。

Linux下用脚本编译c/c++程序至少需要两个东西,一个是编译器,如gcc/g++,另一个则是编译配置文件,即Makefile;同理,编译Android程序也同样需要编译器和编译配置文件,由于Android程序是Java开发的,所以编译器一般使用Ant(Apache的核心项目,Java编译器),配置文件则是build.xml,该编译配置文件可以自己手写,也可以通过ADT的工具生成;如果Andrid工程涉及JNI层,则编译命令使用NDK-Build,对应的编译配置文件则是Android.mk。

前面这段话,简单介绍了使用脚本编译Andriod工程的一些基本工具和关键词,详细的用法就留给读者自己去Google吧,这里给出一个我自己编写的通用脚本,放到你的Android工程的根目录,修改脚本的相关路径的配置,添加执行权限(chmod +x),即可编译你的Android工程了,具体的用法用注释的形式添加在脚本中了,文章最后的附件则是该脚本的测试Android工程。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

#!/bin/bash

                                                                                                                                                                                                                                                            

#NOTE: 用法,在本工程根目录下执行 ./build.sh xxx

                                                                                                                                                                                                                                        

#其中,xxx为参数,可以是clean debug release,也可以不带参数,不带参数默认为debug

                                                                                                                                                                                                                                           

#如果参数是 clean,  则会删除所有编译生成的文件              

#如果参数是 debug , 则会生成 debug 版本的apk,位于 bin 目录下

#如果参数是 release,则生成 release版本的apk,位于 bin 目录下

                                                                                                                                                                                                                                            

#NOTE: 如果更改了工程配置,请先删除目录下的build.xml

                                                                                                                                                                                                                                           

#获取本目录的名称,作为build.xml的项目名称

PROJECT_NAME=${PWD##*/}

                                                                                                                                                                                                                                                  

#路径配置,请根据编译环境修改

ANDROID_SDK_PATH=/opt/android/sdk

ANDROID_NDK_PATH=/opt/android/ndk

ANT_PATH=/opt/apache-ant-1.9.0/bin

                                                                                                                                                                                                                                                            

#决定是否生成release版

BUILD_RELEASE=0

                                                                                                                                                                                                                                                             

if [ $1 = "clean" ]

then

    rm -rf gen

    rm -rf obj

    rm -rf libs/armeabi

    echo "clean success"

    exit

fi

                                                                                                                                                                                                                                                

if [ $1 = "debug" ]

then

    BUILD_RELEASE=0

fi

                                                                                                                                                                                                                                                     

if [ $1 = "release" ]

then

    BUILD_RELEASE=1

fi

                                                                                                                                                                                                                                                                        

echo "begin to build..."

                                                                                                                                                                                                                                                            

#判断 build.xml 是否存在,若不存在,则创建一个

#请根据你的目标平台,修改update project命令的最后一个参数,该值为 android list 命令输出结果列表的id值

                                                                                                                                                                                                                                                       

if [ ! -e build.xml ]

then

    echo "No build.xml exist, generate build.xml"

    $SDK_PATH/tools/android update project -n $PROJECT_NAME -p . -s -t 1

fi

                                                                                                                                                                                                                                                                 

#判断jni目录是否存在,如果存在,则首先编译jni目录

if [ -d jni ]

then

    echo "build jni, generate libs"

    $ANDROID_NDK_PATH/ndk-build

fi

                                                                                                                                                                                                                                                              

#使用ant来编译

if [ $BUILD_RELEASE ]

then

    $ANT_PATH/ant release 

else

    $ANT_PATH/ant debug

fi

echo "build success"

在Android工程的根目录运行该脚本文件后,会在bin目录下生成apk文件,如果工程目录下没有ant.properties文件和xxx.key文件的话,则只会生成debug版和unsigned-release版,如果希望直接生成签名后的apk文件,则需要给出一个Android key文件,并编写一个ant.properties文件,该文件的编写示例如下:


1

2

3

4

key.store=ticktick.key

key.alias=ticktick

key.store.password=123456

key.alias.password=123456

在Android工程的根目录下,如果存在该ant.properties文件,则在编译release版的时候,会自动使用ticktick.key文件来签名生成的apk文件。

关于使用脚本编译Android工程就介绍到这儿了,希望我的示例脚本能够给初学者提供一些参考和帮助,有任何疑问欢迎留言或者来信[email protected]交流,或者关注我的新浪微博@卢_俊获取最新的文章和资讯。

时间: 2024-12-28 11:56:09

转:Android开发实践:用脚本编译Android工程的相关文章

Android开发实践(二)android程序结构简析

不说废话,就简单说说重要的Android程序的文件结构 Src目录包含项目里所有的源文件.当项目一创立,就会包含两个文件R.java和<活动> <activity>.java 总是根据你的活动来命名:相当于后台,处理所有的业务逻辑和控件的引用 R.java是一个由Android plugin自动产生并添加到你的应用程序中的文件.这个文件包含到drawable,layout和values目录的指针(或者目录里其它的项目).你不应当必须直接修改这个文件. gen :编译器为我们自动生成

Android开发实践:Android交叉编译工具链的使用

前面2篇文章分别介绍了Android NDK编译的命令行参数,以及如何在任意目录使用Android.mk来编译本地c/c++代码,Andriod.mk和ndk-build只不过是Android官方提供了一套封装过的Android交叉编译环境而已,其实,你可以不用它,而直接通过传统的Makefile文件来编译你的c/c++代码的,本文即介绍如何直接通过传统的Makefile文件来编译可用于Android平台的库文件. 经常搞嵌入式开发的朋友对于交叉编译环境应该并不陌生,说白了,就是一组运行在x86

Android开发实践:利用ProGuard进行代码混淆

由于Android的代码大都是Java代码,所以挺容易被反编译的,好在Android ADT为我们集成了混淆代码的工具,一来可以混淆我们的代码,让程序被反编译后基本看不懂,另外还能起到代码优化的作用.发布项目前,建议打开Android的代码混淆功能. Android ADT主要通过ProGuard工具来提供代码混淆,网上也有挺多博客文章讲这个的,但感觉很多都介绍得太过于复杂,这里我就以问答的方式来更加简洁地介绍下ProGuard吧. 1. ProGuard是什么 ProGuard是一个工具,用来

Android开发实践:WIFI连接功能的封装

在上一篇文章<Android开发实践:WIFI扫描功能的封装>介绍了如何利用Andriod的API实现WIFI的扫描,本文则重点讲述一下如何连接WIFI吧,在此,也给出一个封装WIFI连接过程的类,提供简单的接口以供在各个代码工程中复用. 与WIFI扫描类似,WIFI的连接同样是一个耗时的过程,所以需要放到线程中执行,通过回调来通知调用者连接结果.该回调接口的定义如下: public interface WifiConnectListener { public void OnWifiConne

Android开发实践:由new Handler()说开去

最近面试一些Android开发的应聘者,除了基本的Activity生命周期等基础问题以外,我一般还会问如下两个问题: (1) Service与Thread有什么区别? (2) 在Activity里new Handler()和在自己创建的Thread中new Handler()有什么区别? 第一个问题其实是一个伪命令,因为Service是Android四大组件之一,而Thread只是Java提供的一个封装了线程管理的工具类,无论是Activity还是Service,都可以通过Thread来创建一个

Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题. 首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: package com.titcktick.customview; import android.content.Con

Android开发实践:Java层与Jni层的数组传递

Android开发中,经常会在Java代码与Jni层之间传递数组(byte[]),一个典型的应用是Java层把需要发送给客户端的数据流传递到Jni层,由Jni层的Socket代码发送出去,当然,Jni层也需要把从Socket接收到的数据流返回给Java层.我简单地总结了一下,从Java层到Jni层,从Jni层到JAVA层,各有3种传递方式,下面用代码示例简单地介绍一下. 示例代码的主要文件有两个,一个是Native.java,是Java层的类:另一个是Native.c,是JNI层的文件,关键的地

Android开发实践:以“专业”的态度处理多线程

刚开始学一门编程语言的时候,我总是会有一种困惑,怎样让自己的代码看起来更"专业"?很多时候,我们可以照着教材实现一些基本的功能,比如用Socket发送/接收几个字符,写一个线程完成某个异步任务,但是在实际的项目中,往往不那么简单,比如需要设计Socket通信协议,需要处理Socket的连接异常断开,需要考虑在线程阻塞的情况下如何正常退出和释放资源等等,关于这些"实战经验",前面的文章也有所涉及,以后有空准备再开个专题跟大家分享探讨一下,今天先简单地说说怎样更&quo

Android开发面试经——4.常见Android进阶笔试题(更新中...)

Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http://blog.csdn.net/finddreams/article/details/44301359 上一篇文章我们已经了解了Android笔试的一些基础题目, [<Android开发面试经——2.常见Android基础笔试题> ] (http://blog.csdn.net/finddreams/a