C++开源库,欢迎补充。

前段时间做了一个android的网游项目,以后优化减少年体育积和幸免外人反编写翻译,须要把编译后.class进行模糊,起始在网上看了部分关于
ProGuard的介绍,基本上都以利用ADT自带的打包方式,那些打包格局太慢了,还要手工业输密码,三个字烦。

C++在“商业利用”方面,曾经是一级的开支语言,但这一桂冠已经被java抢走多年。因为明日生意应用程序类型,已经从桌面应用神速转移成
Web应
用。当Java横行天下之后,MS又猛地发力,搞出C#语言,有大片的早已的C++程序员,以为C++要就此深陷,未料,那三年来,C++的生机突然被
严重地加强了。老马原因正是开源的软件、基础软件(比如并发原生支持,比如Android必定要推出原生的SDK)、各样跨平台应用的面世。

于是乎从头查找ant+proguard+签名的打包格局,遗憾的是材料不是缺手正是断脚。

 

好呢,看来得食本身了,!@#¥@#!@#!@##¥@#¥!@#@
转眼四日,作者++,终于把东西搞出来

开源C++库必须怀有以下特征:必须是干练的出品、跨平台的出品、相对通用的库。

ps:我们项目还有2个格外要求,要把版本号,推广ID打到包里去,方便做推广什么的。那里能够用replace的法子对string.xml进行改动

 

好啊,废话不说了,直接上build文件 

 

 

一 、通用标准类

 

   STL:C++标准模板库,呵呵,它也是开源的嘛。

  1. [代码][xml]代码     跳至 [1] [全屏预览]

   boost:C++准标准库,它是有力地,江湖称之“精益求精”。

 

——-若驾驭,必横行世界。

<?xml version=”1.0″ encoding=”UTF-8″?>

       

<project name=”xiyou_base_” default=”deployableAllDevice”>

 deelx
(轻量级的正则表明式解析类库,国产),boost里有无往不胜的正则表明式解析库,但若是你只想要3个表明式解析,不想要拖上巨大的boost库时……协理一下国货。

<!– proguard4的路径 –>

iconv /iconvpp : (C方式的编码转换函数库,

<property name=”proguard.home”
value=”D:/software/j2me/proguard4.5.1/proguard4.5.1″/>

 

<!– sdk的路径 –>

二、XML解析库

<property name=”sdk.dir” value=”E:\dev\android-sdk-windows”/>

C++的XML相关库不少,但是大多数其实都是C库,使用起来自然不那么方便。当中基于DOM的有TinyXml,基于SAX的自然是Xerces。前者小巧急速,便于使用,适合做数据交换。后者则是全职能的XML解析器。

<!– 是不是使用签名 –>

 哥更赞成于TingyXml.小巧啊!

<property name=”has.keystore” value=”true” />

xerces-c
:最强大的XML解析库了,不是唯有在开源Curry,你固然把商业的算在内。当然,它的变体,被IBM拿去卖钱的要命版本,多了数百兆的东东来支撑各国编码转换,是更强有力,但作者认为有十分小,开源的iconv在前不就够了?

<!– 签名密码 –>

依照博友的一篇博文http://www.cnblogs.com/wuqi924/archive/2010/11/18/1880950.html

<property name=”has.password” value=”true” />

对多少个轻型xml解析开源库:SlimXml、TinyXml、RapidXml,相比如下:

<!–签名相关的key –>

剖析这些3.3万行,1.5M轻重缓急的xml,多少个库分别花了

<property name=”key.alias” value=”key.keystore” />

  • SlimXml: 22ms
  • TinyXml: 54ms
  • RapidXml: 4ms!

<property name=”key.store” value=”key.keystore” />

敲定是,RapidXml果然很强悍,居然比SlimXml快5倍多。

<!– 签名相关的密码 –>

正如欣慰的是,在一直不很关怀效用的动静下,SlimXml照旧比TinyXml快
2.5倍。SlimXml走的是回顾小巧路线,源代码只有32k,而TinyXml和RapidXml的源码分别是147k和141k,有如此的效能能够知足了。因为那些库重点依旧指向几十上百行的小文件,解析
尤其大的xml不在小编设想的限制之内。

<property name=”key.store.password” value=”xxxx” />

 

<property name=”key.alias.password” value=”xxxx” />

  还有irrlicht(鬼火引擎)的irrXMl解析器。

 

  xsd (XML 与 C++数据结构的绑定工具)。(商业使用要钱)

 

三、数据库

<!– 

   作者相比喜欢OTL(用于连接数据库)。其余的没用过

default.properties 内容

 

target=android-4

 

proguard.config=proguard.cfg

④ 、多媒体类

 –>

   —摘录别处,本人,没用过

<property file=”default.properties” />

 SDL (Simple DirectMedia Layer/多媒体直接待上访问层,用于游戏编制程序)。

 

对应的c开源库有ffmpeg、mpeg四 、aac、avc、libmad、mpeg① 、flac、ac叁 、ac三 、matroska盛名的多媒体播放器
TCPMP 天下知名的跨平台、嵌入式手持设备录制播放器,

<!– Custom Android task to deal with the project target, and import
the

 

         proper rules.

五 、互联网开发类

         This requires ant 1.6.0 or above. –>

 一 、gSOAP SOAP协议的C++协助库及代码生成工具。

<path id=”android.antlibs”>

 

<pathelement path=”${sdk.dir}/tools/lib/anttasks.jar” />

② 、ACE  互连网编制程序研商首要选择。
ACE适合于钻研,大型互连网编制程序上效能不足,大型网游里面差不离从未利用ACE的,很多用了ACE的花色也被注解了频率不高。

<pathelement path=”${sdk.dir}/tools/lib/sdklib.jar” />

除却ACE之外,还有不少系统和网络编程方面包车型地铁程序库。比如在线程库方面,还有ZThread、boost::thread,假使加大到C/C++
领域,
还有AP大切诺基,还有CII。在文书和目录操作方面,boost也有对应的机件,而在网络编制程序方面有socket++,还有boost::asio,今后的
C++0X中大致肯定有二个网络编制程序和2个线程库。但是当下看来,ACE依旧是开始展览系统和高质量互连网编制程序的首要选用,其地位在一段时间内不会被撼动。它不仅仅是
三个实用的程序库、框架集,仍旧八个榜样的设计方式应用范例,十二分值得学习。

<pathelement path=”${sdk.dir}/tools/lib/androidprefs.jar” />

叁 、有博友回复到POCO。笔者整理如下:

</path>

开源C++库,称为POCO(POrtable COmponents –
可移植元件),格外便利好用。

 

 特性:

<taskdef name=”setup” classname=”com.android.ant.SetupTask”
classpathref=”android.antlibs” />

 * 线程,程序同步及二十多线程编制程序高级抽象
* 流及文件系统访问
* 共享库将类加载
* 功能强大的日记和错误报告
* 安全及加密
* 网络编制程序 (TCP/IP 套接字, HTTP客户端和HTTP服务器, FTP, SMTP, POP3,
等)
* XML解析 (SAX2 和 DOM) 及生成
* 配置文件及挑选处理
* SQL数据库访问(ODBC, MySQL, SQLite)

<setup import=”false” />

 能够运营的平台包罗:

 

 * Windows
* Mac OS X
* iPhone OS
* (embedded) Linux
* HP-UX
* Tru64
* Solaris
* QNX

<!– Custom tasks –>

六、GUI库

<taskdef name=”aapt” classname=”com.android.ant.AaptExecLoopTask”
classpathref=”android.antlibs” />

   BCG Windows平台下界面设计的第一方库,能够让你的界面更美好,更具时 代感。

 

 

<taskdef name=”aidl” classname=”com.android.ant.AidlExecTask”
classpathref=”android.antlibs” />

wxWidgets :使用wxWidgets ,开发者能够依据相同套代码,为Win32, Mac OS X,
GTK+, X11, Motif, WinCE等平台支付应用程序。wxWidgets库能够被C++, Python,
Perl, and
C#/.NET等开支语言使用。跟其余某个同样支撑跨平台GUI开发工具分歧,基于wxWidgets的施用,拥有真正本地化的视觉及应用功用——因
为,wxWidgets使用(各)平台原生的控件,而不是粗略通过贴图去模拟。wxWidgets是选拔大规模的,自由的,开源的,成熟的。

 

QT————-界面(GUI)开发,扶助C++/Java/Python/…五种语言。跨平台。最根本的功利是,API卓殊精粹!Qt自己也不只只是做GUI编制程序,实际它基本上能够做OS-API能够做的任何事情。象网络/数据库/OpenGL/…都提供周详的帮忙。

<taskdef name=”apkbuilder” classname=”com.android.ant.ApkBuilderTask”
classpathref=”android.antlibs” />

  守旧上Qt被认为是可移植的GUI库,但实则Qt未来早正是三个比较完整的可移植应用程序框架了,当中涵盖了汪洋的工具,比如正则表明式、
Web和
Socket类、2D和3D图形、XML解析、SQL类等,甚至还包含了1个完全的容器类库,可是其金牌依然GUI。在此时此刻的跨平台GUI框架中,Qt成
熟度最高,已经被部分大卖家使用在重中之重产品中。由于Trolltech对Qt选拔的dual
license形式,该产品既能够从开源社区收获扶助,又能够赚取充裕的商业利润,由此其前景也令人可比有信念。
   
Qt的机要技术特点是其元对象模型。Qt实际上选择的并不是正统的C++,而是规范C++的2个扩大。它通过元对象模型扩充,落成了天下出名的signal/slot机制,而那第①建工公司制也成为Qt的最大特征和优势。
    与Qt类似的可移植GUI框架还有wxWidget、FOX等

 

六. 电脑视觉

<taskdef name=”xpath” classname=”com.android.ant.XPathTask”
classpathref=”android.antlibs” />

  OpenCV,因特尔自主的开源库。辅助C/C++/Python接口。那个感兴趣的恋人能够玩一下。假使构成OpenCV,你能够做一些外行人觉得很酷的次序。比如说用它的人脸识别函数,来对您的录制头进行处理,判断人的动作等

 

七. 图形图像处理

<taskdef name=”if” classname=”com.android.ant.IfElseTask”
classpathref=”android.antlibs” />

GDAL,处理大图像。 倘诺GIS专业的人一定会语言到丰硕大的tif印象,动则几个GB的宇宙航行印象。GDAL对大图像的读写辅助是卓殊棒的(像多波段的图像都可以消除)。  援救C++/Java/Python…

 

国外开源的GIS软件QGIS正是用了gdal

<!– Properties –>

c的图形图像库较多,libjpeg、libpng、zlib、tiff、JBIG、最有名的开源形图像处理软件Cximage

 

八 、内部存款和储蓄器管理:boost::smart_ptr,Hans-Boehm GC
   
C/C++的内部存款和储蓄器管理是三个永恒的话题。一般的话,C++的开发者倾向于自个儿管理内部存款和储蓄器。但是,出乎很多C++开发者意料的是,如今C++的有个别带头大哥人物已
经公开注解,如若不安插自动内部存款和储蓄器管理机制,用C++编写安全可相信的特大型程序是卓殊困难的。而Bjarne
Stroustrup也曾对中华开发者提议,假使没有专门的说辞,应该在大型项目中行使电动内部存款和储蓄器管理工科具。由此,明天的C++开发者应当主动地读书和采用自动内部存款和储蓄器管理设施。
   
说到自动内部存储器管理,相比较轻量级的做法是boost::smart_ptr,而激进的做法是引入完整的GC机制。方今开源而又比较可相信的GC中,Hans-
Boehm GC无疑是最受重视的。作为3个封建的GC,汉斯-Boehm
GC在品质和功力方面都算是出众。越发是,使用这么些GC,你还能够delete、free来协调管理内部存款和储蓄器,对于我们编制程序习惯的撞击比较小。

<!– Tells adb which device to target. You can change this from the
command line

九 、密码及平安:OpenSSL
   
安全是今天开展C/C++编制程序无法规避和必须讲究的难题。可是编写安全的应用程序,尤其是跟网络有关的C/C++应用程序,是一件十三分困难的业务。可以说,整个产业界如今在这一个历程上仍旧处在“初级阶段”。尤其是涉及到大方的安全、密码学相关的算法、规范,假诺让开发者自身找寻,其工作量和难度达到了不现
实的品位。因而必须依靠可靠的相关程序库才有只怕增强程序的安全性。在那上头,OpenSSL是日前最棒的取舍,其剧情之周到可信,已经成为产业界标杆。然则,由于安全编程固有的繁杂,就算接纳penSSL,开发工作照旧是格外麻烦的。因而我们也希望能够快捷看到更简明、更易用的C/C++安全程序库。

              by invoking “ant -Dadb.device.arg=-d” for device “ant
-Dadb.device.arg=-e” for

⑩ 、矩阵总计:MTL
    自一九九三年来说,C++在科学计算领域在那之中获得了铁汉的突破。那至关主要归功于template技术的高级应用,使得C++在科学总计的习性方面获取了赫赫
的上进,一大批判能够的C++科学总计库涌现出来。比如Blitz++、POOMA、MTL、Boost::uBLAS。而这里面,MTL就功用丰硕程度、
质量、开发援救和老成程度来讲,是相比较卓绝的3个,由此得以优先考虑。值得说的是,2003年,MTL与新兴被AMD收购的KAI
C++合作,曾经在品质测评中制伏了FOCR-VTRAN。

              the emulator. –>

十一、中间件

<property name=”adb.device.arg” value=”” />

 ① 、分布式对象中间件:ICE
    
ICE是分布式对象中间件领域里的冰寒于水,能够差不多地将其视为“创新版”的CORBA。目前选取在部分大型项目在那之中,当中包罗波音集团主持的子弟海军战斗种类。
    
ICE的一个专程价值是其代码的范例意义。由于ICE的出现较晚,开发者比较系统地应用了新的C++编制程序风格,所以成为了研读C++代码的杰出指标。

 

贰 、音讯中间件:ZeroMQ,计算的三种本性如下:

<property name=”android.tools.dir” location=”${sdk.dir}/tools” />

 1)
新闻系统中,它基本上是最精简的,只是个简单的API,有n多样语言的绑定,没有专门的服务器; 
 2) 质量万分优越,远远高于RabbitMQ、ActiveMQ、MSMQ等; 
 3) 适合做分布式和出现应用。

<property name=”android.platform.tools.dir”
location=”${sdk.dir}/platform-tools” />

十② 、正则表明式:boost::regex
    正则表明式是编制程序工作中最有力的工具之一。C++的正则表达式援救间接以来是三个软肋。大概在二〇〇一年左右,boost中冒出了regex库,伊始解决了那一个标题。不过早期的regex无论在效用上照旧可信性方面都有一些难点,后来通过二回大规模的翻修之后,达到了比较完善的水准。
    别的能够选取的替代品还有C语言的pcre库,Qt中的QRegExp类等。

<!– Name of the application package extracted from manifest file
–>

十三 、配置管理:Lua
    随着软件系统进一步复杂,对软件的可配置型建议了更为高的供给。古板上万一经过命令行参数来布局的种类,今后说不定需求更进一步多的章程和编写制定。方今进一步
受欢迎、并且赢得更为多证实的做法,是将Lua嵌入到C/C++程序中,而用Lua程序作为配置脚本。那种做法的优势是,Lua语言强大灵活,能够适应
复杂的配备要求。同时,Lua便于嵌入C/C++程序,而且编译执行进程非常的慢,能够说是最近缓解C/C++程序配置管理难题的3个佳绩方案。

<xpath input=”AndroidManifest.xml” expression=”/manifest/@package”
output=”manifest.package” />

十④ 、3D游戏引擎:

<!– Value of the hasCode attribute (Application node) extracted from
manifest file –>

  1. Irrlicht http://irrlicht.sourceforge.net/

<xpath input=”AndroidManifest.xml”
expression=”/manifest/application/@android:hasCode”
output=”manifest.hasCode” default=”true” />

始于2003,次年即被评为最棒开源游戏引擎。官方帮忙C++和.Net,拓展语言绑定包蕴java,perl,ruby,python.跨平台支撑,使用D3D,OpenGL以及自带API.

 

亮点:简单上手;跨平台;自带XML解析器;大的社区;

<!– 源文件及财富路径 –>

症结:近来开销慢下来了

<property name=”source.dir” value=”src” />

 

<property name=”source.absolute.dir” location=”${source.dir}” />

  1. Panda3D http://www.panda3d.org/

<property name=”gen.dir” value=”gen” />

由迪斯尼开发,卡耐基-梅隆娱娱乐科技(science and technology)主题帮助。Python是官方推荐语言。也协助C++。

<property name=”gen.absolute.dir” location=”${gen.dir}” />

亮点:有用的社区;大量效果;定期开发;

<property name=”resource.dir” value=”res” />

缺点:紧缺工具扶助;极差的文书档案;

<property name=”resource.absolute.dir” location=”${resource.dir}”
/>

  1. OGRE http://www.ogre3d.org/

<property name=”asset.dir” value=”assets” />

图像引擎中最佳的一个。2000年立的项。推荐使用C++语言。供给丰富熟悉编程才行。初学者不宜。

<property name=”asset.absolute.dir” location=”${asset.dir}” />

亮点:大批量效果;特出的文书档案;大规模的社区;活跃的开发

 

症结:不相符初哥;唯有图像引擎

<!– Directory for the third party java libraries –>

  1. Crystal Space http://www.crystalspace3d.org/main/Main_Page

<property name=”jar.libs.dir” value=”libs” />

1997年批发,用C++编写的开源游戏引擎。推荐应用C++

<property name=”jar.libs.absolute.dir” location=”${jar.libs.dir}”
/>

可取:不错的社区帮忙;大量功用;

<!– create a path with all the jar files, from the main project and
the

缺点:难学;

              libraries –>

5、Delta3d   http://www.delta3d.org/index.php

<path id=”jar.libs.ref”>

Delta3D是一款由美利坚合众国海军切磋高校(Naval Postgraduate
School)开发的专职能游戏与虚假引擎,获得United States军方巨大的支撑与富有的投资。该斯特林发动机应用领域极为广阔,如开发在构建、教育、娱乐行业和科学总结可视化领域等方面建立模型与虚假的软件。

<fileset dir=”${jar.libs.absolute.dir}” includes=”*.jar” />

它的口径设计把一些闻明开源软件和内燃机如 Open Scene Graph(OSG),
OpenDynamicsEngine (ODE), Character Animation Library (CAL3D), 还有
OpenAL合二为一。Delta3D通过对那一个底层模块进行隐藏封装,整合在协同就此形成了3个选拔更为惠及的高档API
函数库,使得开发者在要求的时候可以利用底层函数进行三次开发。Delta3D在软件种类中,处于中间层(Middle
layer)的职分上。

<path refid=”project.libraries.jars” />

优点:适合种种3D游戏,仿真,很完美。一贯在做立异。

</path>

缺陷:参考资料比较少。汉语文书档案也正如少。官方参考资料比较少。可是读源代码能够加快掌握,应用。

 

tips:近来,小编正在商量delta开源引擎,并行使其付出2个微型游戏。

<!– Directory for the native libraries –>

<property name=”native.libs.dir” value=”libs” />

<property name=”native.libs.absolute.dir”
location=”${native.libs.dir}” />

 

<!– 输出路径 –>

<property name=”out.dir” value=”out” />

<property name=”out.absolute.dir” location=”${out.dir}” />

<property name=”out.classes.dir” value=”${out.absolute.dir}/classes”
/>

<property name=”out.classes.absolute.dir”
location=”${out.classes.dir}” />

 

<!– Intermediate files –>

<property name=”dex.file.name” value=”classes.dex” />

<property name=”intermediate.dex.file”
location=”${out.absolute.dir}/${dex.file.name}” />

<property name=”resource.package.file.name”
value=”${ant.project.name}.ap_” />

 

<!– The final package file to generate

              These can be overridden by setting them earlier to

              different values –>

<property name=”out.debug.unaligned.file”
location=”${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk”
/>

<property name=”out.debug.file”
location=”${out.absolute.dir}/${ant.project.name}-debug.apk” />

 

<property name=”out.unsigned.file.name”
value=”${ant.project.name}-unsigned.apk” />

<property name=”out.unsigned.file”
location=”${out.absolute.dir}/${out.unsigned.file.name}” />

 

<property name=”out.unaligned.file.name”
value=”${ant.project.name}-unaligned.apk” />

<property name=”out.unaligned.file”
location=”${out.absolute.dir}/${out.unaligned.file.name}” />

 

<property name=”out.release.file.name”
value=”${ant.project.name}-release.apk” />

<property name=”out.release.file”
location=”${out.absolute.dir}/${out.release.file.name}” />

 

<property name=”proguard.enabled” value=”true” />

<property name=”android-jar”
value=”${sdk.dir}/platforms/${target}/android.jar” />

 

<!– set some properties used for filtering/override. If those
weren’t defined

              before, then this will create them with empty values,
which are then ignored

              by the custom tasks receiving them. –>

<property name=”version.code” value=”” />

<property name=”aapt.resource.filter” value=”” />

<property name=”filter.abi” value=”” />

 

<!– java源文件编码,编写翻译的对象平台,为1.5 or 1.6都得以 –>

<property name=”java.encoding” value=”UTF-8″ />

<property name=”java.target” value=”1.5″ />

<property name=”java.source” value=”1.5″ />

 

<!– Verbosity –>

<property name=”verbose” value=”false” />

 

<!– Verbosity –>

<property name=”verbose” value=”false” />

<!– This is needed by emma as it uses multilevel verbosity instead
of simple ‘true’ or ‘false’

              The property ‘verbosity’ is not user configurable and
depends exclusively on ‘verbose’

              value.–>

<condition property=”verbosity” value=”verbose” else=”quiet”>

<istrue value=”${verbose}” />

</condition>

<!– This is needed to switch verbosity of zipalign. Depends
exclusively on ‘verbose’

              –>

<condition property=”v.option” value=”-v” else=””>

<istrue value=”${verbose}” />

</condition>

<!– This is needed to switch verbosity of dx. Depends exclusively on
‘verbose’ –>

<condition property=”verbose.option” value=”–verbose” else=””>

<istrue value=”${verbose}” />

</condition>

 

<!– properties for signing in release mode –>

<condition property=”has.keystore” value=”true”>

<and>

<isset property=”key.store” />

<length string=”${key.store}” when=”greater” length=”0″ />

<isset property=”key.alias” />

</and>

</condition>

<condition property=”has.password” value=”passwordxxxxx”>

<and>

<isset property=”has.keystore” />

<isset property=”key.store.password” />

<isset property=”key.alias.password” />

</and>

</condition>

 

<!– Tools –>

<condition property=”exe” value=”.exe” else=””>

<os family=”windows” />

</condition>

<property name=”adb”
location=”${android.platform.tools.dir}/adb${exe}” />

<property name=”zipalign”
location=”${android.tools.dir}/zipalign${exe}” />

 

<!– Emma configuration –>

<property name=”emma.dir” value=”${sdk.dir}/tools/lib” />

<path id=”emma.lib”>

<pathelement location=”${emma.dir}/emma.jar” />

<pathelement location=”${emma.dir}/emma_ant.jar” />

</path>

<taskdef resource=”emma_ant.properties” classpathref=”emma.lib”
/>

<!– End of emma configuration –>

 

<!– Macros –>

 

<!– Configurable macro, which allows to pass as parameters output
directory,

              output dex filename and external libraries to dex
(optional) –>

<macrodef name=”dex-helper”>

<element name=”external-libs” optional=”yes” />

<element name=”extra-parameters” optional=”yes” />

<sequential>

<!– sets the primary input for dex. If a pre-dex task sets it to

                        something else this has no effect –>

<property name=”out.dex.input.absolute.dir”
value=”${out.classes.absolute.dir}” />

 

<!– set the secondary dx input: the project (and library) jar files

                        If a pre-dex task sets it to something else this
has no effect –>

<if>

<condition>

<isreference refid=”out.dex.jar.input.ref” />

</condition>

<else>

<path id=”out.dex.jar.input.ref”>

<path refid=”jar.libs.ref” />

</path>

</else>

</if>

 

<echo>Converting compiled files and external libraries into
${intermediate.dex.file}…</echo>

<apply executable=”${dx}” failonerror=”true” parallel=”true”>

<arg value=”–dex” />

<arg value=”–output=${intermediate.dex.file}” />

<extra-parameters />

<arg line=”${verbose.option}” />

<arg path=”${out.dex.input.absolute.dir}” />

<path refid=”out.dex.jar.input.ref” />

<external-libs />

</apply>

</sequential>

</macrodef>

 

<!– This is macro that enable passing variable list of external jar
files to ApkBuilder

              Example of use:

              <package-helper output.filepath=”/path/to/foo.apk”>

                  <extra-jars>

                     <jarfolder path=”my_jars” />

                     <jarfile path=”foo/bar.jar” />

                     <jarfolder path=”your_jars” />

                  </extra-jars>

              </package-helper> –>

<macrodef name=”package-helper”>

<attribute name=”output.filepath” />

<element name=”extra-jars” optional=”yes” />

<sequential>

<apkbuilder outfolder=”${out.absolute.dir}”
resourcefile=”${resource.package.file.name}”
apkfilepath=”@{output.filepath}”
debugpackaging=”${build.packaging.debug}”
debugsigning=”${build.signing.debug}” abifilter=”${filter.abi}”
verbose=”${verbose}” hascode=”${manifest.hasCode}”>

<dex path=”${intermediate.dex.file}” />

<sourcefolder path=”${source.absolute.dir}” />

<sourcefolder refid=”project.libraries.src” />

<jarfolder path=”${jar.libs.absolute.dir}” />

<jarfolder refid=”project.libraries.libs” />

<nativefolder path=”${native.libs.absolute.dir}” />

<nativefolder refid=”project.libraries.libs” />

<extra-jars />

</apkbuilder>

</sequential>

</macrodef>

 

<!– This is macro which zipaligns in.package and outputs it to
out.package. Used by targets

              debug, -debug-with-emma and release.–>

<macrodef name=”zipalign-helper”>

<attribute name=”in.package” />

<attribute name=”out.package” />

<sequential>

<echo>Running zip align on final apk…</echo>

<exec executable=”${zipalign}” failonerror=”true”>

<arg line=”${v.option}” />

<arg value=”-f” />

<arg value=”4″ />

<arg path=”@{in.package}” />

<arg path=”@{out.package}” />

</exec>

</sequential>

</macrodef>

 

<!– This is macro used only for sharing code among two targets,
-install and

              -install-with-emma which do exactly the same but differ in
dependencies –>

<macrodef name=”install-helper”>

<sequential>

<echo>Installing ${out.debug.file} onto default emulator or
device…</echo>

<exec executable=”${adb}” failonerror=”true”>

<arg line=”${adb.device.arg}” />

<arg value=”install” />

<arg value=”-r” />

<arg path=”${out.debug.file}” />

</exec>

</sequential>

</macrodef>

 

<!– Rules –>

 

<!– Creates the output directories if they don’t exist yet. –>

<target name=”-dirs”>

<echo>Creating output directories if needed…</echo>

<mkdir dir=”${resource.absolute.dir}” />

<mkdir dir=”${jar.libs.absolute.dir}” />

<mkdir dir=”${out.absolute.dir}” />

<if condition=”${manifest.hasCode}”>

<then>

<mkdir dir=”${gen.absolute.dir}” />

<mkdir dir=”${out.classes.absolute.dir}” />

</then>

</if>

 

 

 

</target>

 

<!– empty default pre-build target. Create a similar target in

              your build.xml and it’ll be called instead of this one.
–>

<target name=”-pre-build” />

 

<!– Generates the R.java file for this project’s resources. –>

<target name=”-resource-src” depends=”-dirs, -pre-build”>

<if condition=”${manifest.hasCode}”>

<then>

<echo>Generating R.java / Manifest.java from the
resources…</echo>

<aapt executable=”${aapt}” command=”package” verbose=”${verbose}”
manifest=”AndroidManifest.xml” androidjar=”${android.jar}”
rfolder=”${gen.absolute.dir}”>

<res path=”${resource.absolute.dir}” />

</aapt>

</then>

<else>

<echo>hasCode = false. Skipping…</echo>

</else>

</if>

</target>

 

<!– Generates java classes from .aidl files. –>

<target name=”-aidl” depends=”-dirs”>

<if condition=”${manifest.hasCode}”>

<then>

<echo>Compiling aidl files into Java classes…</echo>

<aidl executable=”${aidl}” framework=”${android.aidl}”
genFolder=”${gen.absolute.dir}”>

<source path=”${source.absolute.dir}” />

<source refid=”project.libraries.src” />

</aidl>

</then>

<else>

<echo>hasCode = false. Skipping…</echo>

</else>

</if>

</target>

 

<!– empty default pre-compile target. Create a similar target in

              your build.xml and it’ll be called instead of this one.
–>

<target name=”-pre-compile” />

 

<!– Compiles this project’s .java files into .class files. –>

<target name=”compile” depends=”-resource-src, -aidl, -pre-compile”
description=”Compiles project’s .java files into .class files”>

<if condition=”${manifest.hasCode}”>

<then>

<!– If android rules are used for a test project, its classpath
should include

                             tested project’s location –>

<condition property=”extensible.classpath”
value=”${tested.project.absolute.dir}/${out.dir}/classes” else=”.”>

<isset property=”tested.project.absolute.dir” />

</condition>

<condition property=”extensible.libs.classpath”
value=”${tested.project.absolute.dir}/libs” else=”${jar.libs.dir}”>

<isset property=”tested.project.absolute.dir” />

</condition>

<javac encoding=”${java.encoding}” source=”${java.source}”
target=”${java.target}” debug=”true” extdirs=””
destdir=”${out.classes.absolute.dir}”
bootclasspathref=”android.target.classpath” verbose=”${verbose}”
classpath=”${extensible.classpath}” classpathref=”jar.libs.ref”>

<src path=”${source.absolute.dir}” />

<src path=”${gen.absolute.dir}” />

<src refid=”project.libraries.src” />

<classpath>

<fileset dir=”${extensible.libs.classpath}” includes=”*.jar” />

</classpath>

</javac>

</then>

<else>

<echo>hasCode = false. Skipping…</echo>

</else>

</if>

</target>

 

<!– empty default post-compile target. Create a similar target in

              your build.xml and it’ll be called instead of this one.
–>

<target name=”-post-compile” />

 

<!– Obfuscate target

             This is only active in release builds when proguard.config
is defined

             in default.properties.

 

             To replace Proguard with a different obfuscation engine:

             Override the following targets in your build.xml, before
the call to <setup>

                 -release-obfuscation-check

                     Check whether obfuscation should happen, and put
the result in a property.

                 -debug-obfuscation-check

                     Obfuscation should not happen. Set the same
property to false.

                 -obfuscate

                     ** Make sure unless=”do.not.compile” is used in
the target definition **

                     check if the property set in
-debug/release-obfuscation-check is set to true.

                     If true:

                         Perform obfuscation

                         Set property out.dex.input.absolute.dir to be
the output of the obfuscation

         –>

<target name=”-obfuscate” unless=”do.not.compile”>

<if condition=”${proguard.enabled}”>

<then>

<property name=”obfuscate.absolute.dir”
location=”${out.absolute.dir}/proguard” />

<property name=”preobfuscate.jar.file”
value=”${obfuscate.absolute.dir}/original.jar” />

<property name=”obfuscated.jar.file”
value=”${obfuscate.absolute.dir}/obfuscated.jar” />

<!– input for dex will be proguard’s output –>

<property name=”out.dex.input.absolute.dir”
value=”${obfuscated.jar.file}” />

 

<!– Add Proguard Tasks –>

<property name=”proguard.jar”
location=”${proguard.home}/lib/proguard.jar” />

<taskdef name=”proguard” classname=”proguard.ant.ProGuardTask”
classpath=”${proguard.jar}” />

 

<!– Set the android classpath Path object into a single property.
It’ll be

                             all the jar files separated by a platform
path-separator.

                        –>

<property name=”android.libraryjars” refid=”android.target.classpath”
/>

<!– Build a path object with all the jar files that must be
obfuscated.

                             This include the project compiled source
code and any 3rd party jar

                             files. –>

<path id=”project.jars.ref”>

<pathelement location=”${preobfuscate.jar.file}” />

<path refid=”jar.libs.ref” />

</path>

<!– Set the project jar files Path object into a single property.
It’ll be

                             all the jar files separated by a platform
path-separator.

                        –>

<property name=”project.jars” refid=”project.jars.ref” />

 

<mkdir dir=”${obfuscate.absolute.dir}” />

<delete file=”${preobfuscate.jar.file}” />

<delete file=”${obfuscated.jar.file}” />

<jar basedir=”${out.classes.dir}” destfile=”${preobfuscate.jar.file}”
/>

<!– 混淆相关参数 –>

<proguard>

                    -optimizationpasses 5

                    -dontusemixedcaseclassnames

                    -dontskipnonpubliclibraryclasses

                    -dontpreverify

                    -verbose

                 -repackageclasses

                
-allowaccessmodification

                    -optimizations
!code/simplification/arithmetic,!field/*,!class/merging/*

 

                    -keep public class * extends android.app.Activity

                    -keep public class * extends
android.app.Application

                    -keep public class * extends android.app.Service

                    -keep public class * extends
android.content.BroadcastReceiver

                    -keep public class * extends
android.content.ContentProvider

                    -keep public class
com.android.vending.licensing.ILicensingService

                    -injars ${project.jars}

                    -outjars ${obfuscated.jar.file}

                    -libraryjars ${android.libraryjars}

                </proguard>

</then>

</if>

</target>

 

<target name=”pre” depends=”-obfuscate”>

</target>

 

<!– Converts this project’s .class files into .dex files –>

<!–<target name=”-dex” depends=”compile, -post-compile,
-obfuscate” unless=”do.not.compile”>–>

<target name=”-dex” depends=”compile, -post-compile, optimize”
unless=”do.not.compile”>

<if condition=”${manifest.hasCode}”>

<then>

<dex-helper />

</then>

<else>

<echo>hasCode = false. Skipping…</echo>

</else>

</if>

</target>

 

<target name=”optimize” depends=”compile,-obfuscate”>

<if condition=”${proguard.enabled}”>

<then>

<mkdir dir=”${out.dir}/out/class” />

<!– 成立文件夹–>

<!–别人的<jar basedir=”${out-folder}”
destfile=”temp.jar”/>–>

<property name=”proguard-jar”
value=”${proguard.home}/lib/proguard.jar” />

<java jar=”${proguard-jar}” fork=”true” failonerror=”true”>

<jvmarg value=”-Dmaximum.inlined.code.length=32″ />

<arg value=”-injars ${out.dir}/classes” />

<!– 原来的类公事,使用Bin/classes下的–>

<arg value=”-outjars ${out.dir}/out/classes” />

<!– 生成的混淆Class地方–>

<arg value=”-libraryjars ${android-jar}” />

<!–

                    <arg value=” -libraryjars
${library-jar}/some_lib_used.jar”/>

                    –>

<arg value=”-keep public class * extends android.app.Activity” />

<arg value=”-keep public class * extends android.app.Service” />

<arg value=”-keep public class * extends
android.content.BroadcastReceiver” />

<arg value=”-keep public class * extends
android.content.ContentProvider” />

<arg value=”-keep public class * extends android.view.View” />

<arg value=”-dontwarn” />

<arg value=”-dontpreverify” />

<arg value=”-optimizationpasses 7″ />

<arg value=”-dontusemixedcaseclassnames” />

<arg value=”-dontskipnonpubliclibraryclasses” />

<arg value=”-repackageclasses” />

<arg value=”-allowaccessmodification” />

<!–<arg value=”-dontskipnonpubliclibraryclassmembers”/>–>

</java>

<!–这么些是原先的Jar<delete file=”temp.jar”/>–>

<!–<delete dir=”${out-folder}”/>–>

<!–<mkdir dir=”${out-folder}”/>

               <unzip src=”optimized.jar” dest=”${out-folder}”/>

               <delete file=”optimized.jar”/>–>

</then>

</if>

</target>

 

<!– Puts the project’s resources into the output package file

              This actually can create multiple resource package in case

              Some custom apk with specific configuration have been

              declared in default.properties.

              –>

<target name=”-package-resources”>

<echo>Packaging resources</echo>

<aapt executable=”${aapt}” command=”package”
versioncode=”${version.code}” debug=”${build.packaging.debug}”
manifest=”AndroidManifest.xml” assets=”${asset.absolute.dir}”
androidjar=”${android.jar}” apkfolder=”${out.absolute.dir}”
resourcefilename=”${resource.package.file.name}”
resourcefilter=”${aapt.resource.filter}”>

<res path=”${resource.absolute.dir}” />

<!– <nocompress /> forces no compression on any files in
assets or res/raw –>

<!– <nocompress extension=”xml” /> forces no compression on
specific file extensions in assets and res/raw –>

</aapt>

 

</target>

<!– Packages the application and sign it with a debug key. –>

<target name=”-package-debug-sign” depends=”-dex,
-package-resources”>

<package-helper output.filepath=”${out.debug.unaligned.file}” />

</target>

 

<!– Packages the application without signing it. –>

<target name=”-package-release” depends=”-dex,
-package-resources”>

<package-helper output.filepath=”${out.unsigned.file}” />

</target>

 

<target name=”-compile-tested-if-test” if=”tested.project.dir”
unless=”do.not.compile.again”>

<subant target=”compile”>

<fileset dir=”${tested.project.absolute.dir}” includes=”build.xml”
/>

</subant>

</target>

 

<target name=”-debug-obfuscation-check”>

<!– proguard is never enabled in debug mode –>

<property name=”proguard.enabled” value=”true” />

</target>

 

<target name=”-set-debug-mode” depends=”-debug-obfuscation-check”>

<!– property only set in debug mode.

                   Useful for if/unless attributes in target node

                   when using Ant before 1.8 –>

<property name=”build.mode.debug” value=”true” />

 

<!– whether the build is a debug build. always set. –>

<property name=”build.packaging.debug” value=”true” />

 

<!– signing mode: debug –>

<property name=”build.signing.debug” value=”true” />

 

</target>

 

<!– Builds debug output package, provided all the necessary files
are already dexed –>

<target name=”debug” depends=”-set-debug-mode,
-compile-tested-if-test, -package-debug-sign” description=”Builds the
application and signs it with a debug key.”>

<zipalign-helper in.package=”${out.debug.unaligned.file}”
out.package=”${out.debug.file}” />

<echo>Debug Package: ${out.debug.file}</echo>

</target>

 

<!– called through target ‘release’. Only executed if the keystore
and

              key alias are known but not their password. –>

<target name=”-release-prompt-for-password” if=”has.keystore”
unless=”has.password”>

<!– Gets passwords –>

<echo>Gets passwords ${has.keystore} ${has.password}</echo>

<input message=”Please enter keystore password (store:${key.store}):”
addproperty=”key.store.password” defaultvalue=”5201314..” />

<input message=”Please enter password for alias ‘${key.alias}’:”
addproperty=”key.alias.password” defaultvalue=”5201314..” />

</target>

 

<!– called through target ‘release’. Only executed if there’s no

              keystore/key alias set –>

<target name=”-release-nosign” unless=”has.keystore”>

<echo>No key.store and key.alias properties found in
build.properties.</echo>

<echo>Please sign ${out.unsigned.file} manually</echo>

<echo>and run zipalign from the Android SDK tools.</echo>

</target>

 

<target name=”-release-obfuscation-check”>

<condition property=”proguard.enabled” value=”true” else=”false”>

<and>

<isset property=”build.mode.release” />

<isset property=”proguard.config” />

</and>

</condition>

<if condition=”${proguard.enabled}”>

<then>

<!– Secondary dx input (jar files) is empty since all the

                             jar files will be in the obfuscated jar
–>

<path id=”out.dex.jar.input.ref” />

</then>

</if>

</target>

 

<target name=”-set-release-mode”>

<!– release mode is only valid if the manifest does not explicitly

                   set debuggable to true. default is false.

                   We actually store build.packaging.debug, not
build.release –>

<xpath input=”AndroidManifest.xml”
expression=”/manifest/application/@android:debuggable”
output=”build.packaging.debug” default=”false” />

 

<!– signing mode: release –>

<property name=”build.signing.debug” value=”false” />

 

<if condition=”${build.packaging.debug}”>

<then>

<echo>*************************************************</echo>

<echo>**** Android Manifest has debuggable=true
****</echo>

<echo>**** Doing DEBUG packaging with RELEASE keys
****</echo>

<echo>*************************************************</echo>

</then>

<else>

<!– property only set in release mode.

                             Useful for if/unless attributes in target
node

                             when using Ant before 1.8 –>

<property name=”build.mode.release” value=”true” />

</else>

</if>

</target>

 

<!– This runs -package-release and -release-nosign first and then
runs

              only if release-sign is true (set in -release-check,

              called by -release-no-sign)–>

<target name=”release” depends=”-set-release-mode,
-release-obfuscation-check, -package-release,
-release-prompt-for-password, -release-nosign” if=”has.keystore”
description=”Builds the application. The generated apk file must be
signed before

                           it is published.”>

<!– Signs the APK –>

<echo>Signing final apk…</echo>

<signjar jar=”${out.unsigned.file}” signedjar=”${out.unaligned.file}”
keystore=”${key.store}” storepass=”${key.store.password}”
alias=”${key.alias}” keypass=”${key.alias.password}”
verbose=”${verbose}” />

 

<!– Zip aligns the APK –>

<zipalign-helper in.package=”${out.unaligned.file}”
out.package=”${out.release.file}” />

<echo>Release Package: ${out.release.file}</echo>

 

 

</target>

<target name=”clean” description=”Removes output files created by
other targets.”>

<delete dir=”${out.absolute.dir}” verbose=”${verbose}” />

<delete dir=”${gen.absolute.dir}” verbose=”${verbose}” />

</target>

<target name=”deployableAllDevice” description=”build all device
packet”>

<!–
uid和sdk都以自定义参数,可有可无,有多小个包要打,就在此地copy多小行,修改有关参数,传入到程序里即可
–>

<antcall target=”release” inheritAll=”true”><param name=”uid”
value=”100″ /><param name=”sdk” value=”91″ /></antcall>

<antcall target=”release” inheritAll=”true”><param name=”uid”
value=”101″ /><param name=”sdk” value=”90″ /></antcall>

 

</target>

</project>

发表评论

电子邮件地址不会被公开。 必填项已用*标注