前段时间做了一个android的网游项目,现在优化减少体积和防止别人反编译,需要把编译后.class进行混淆,开始在网上看了一些关于ProGuard的介绍,基本上都是使用ADT自带的打包方式,那个打包方式太慢了,还要手工输密码,一个字烦。
于是开始寻ant+proguard+签名的打包方式,遗憾的是资料不是缺手就是断脚。
好吧,看来得食自己了,!@#@#@#@##@#¥!@#@ 转眼一周,我++,终于把东西搞出来
ps:我们项目还有一个特殊需求,要把版本号,推广ID打到包里去,方便做推广什么的。这里可以用replace的方法对l进行修改
好吧,废话不说了,直接上build文件
android获取真正的签名
<XML 版本= “1.0” 编码= “UTF-8” >
002
< 项目 名称= “xiyou_base_” 默认= “deployableAllDevice” >
003
    < - proguard4的路径 - >
004
    < 属性 名称= “proguard.home” “D :/ software/j2me/proguard4.5.1/proguard4.5.1” />
005
    < - SDK的路径 - >
006
    < 属性 名称= “sdk.dir” = “C\ dev\ AndroidSDK窗口” />
007
    < - 是否使用签名 - >
008
    < 属性 名称= “has.keystore= “” />
009
    < - 签名密码 - >
010
    < 属性 名称= “has.password” = “” />
011
    < - !签名相关的关键 - >
012
    < 属性 名称= “key.alias” =“key.keystore” />
013
    < 属性 名称= “key.store” =“key.keystore” />
014
    < - !签名相关密码 - >
015
    < 属性 名称= “key.store.password” = “XXXX” />
016
    < 属性 名称= “key.alias.password” = “XXXX” />
017
018
019
    < -
020
    default.properties内容
021
    目标=机器人-4
022
    fig = proguard.cfg
023
- >
024
    < 属性 文件default.properties” />
025
026
    < - 定制的Andr​​oid任务处理项目的目标,并导入
027
        适当的规则。
028
        这就要求蚂蚁1.6.0或以上。 - >
029
    < 路径 ID = “android.antlibs” >
030
        < pathelement 路径= “$ {sdk.dir} /工具/ lib/ anttasks.jar” />
031
        < pathelement 路径= “$ {sdk.dir} /工具/ lib/ sdklib.jar” />
032
        < pathelement 路径= “$ {sdk.dir} /工具/ lib/ androidprefs.jar” />
033
    </ 路径>
034
035
    < taskdef 名字= “设置类名“com.android.ant.SetupTask classpathref =“android.antlibs” />
036
    < 设置 进口= “” />
037
038
    < - 自定义任务 - >
039
    < taskdef 名字= “AAPT” 类名“com.android.ant.AaptExecLoopTaskclasspathref = “android.antlibs” />
040
041
    < taskdef 名称= “AIDL” 类名“com.android.ant.AidlExecTask” classpathref =“android.antlibs” />
042
043
    < taskdef 名字= “apkbuilder” 类名= “com.android.ant.ApkBuilderTask”classpathref = “android.antlibs” />
044
045
    < taskdef 名字= “XPath类名“com.android.ant.XPathTask classpathref =“android.antlibs” />
046
047
    < taskdef 名称= “如果类名“com.android.ant.IfElseTask classpathref =“android.antlibs” />
048
049
    < - 属性 - >
050
051
    < - 告诉亚行目标的设备。你可以从这个命令行
052
              通过调用蚂蚁Dadb.device.arg =-D”设备蚂蚁Dadb.device.arg =-E”
053
              模拟器。 - >
054
    < 属性 = “adb.device.arg” = “” />
055
056
    < 属性 名称= “ls.dir” 位置= “$ {sdk.dir} /工具 />
057
    < 属性 名称= “ls.dir” 位置= “$ {sdk.dir} /平台工具” />
058
    < - 从清单文件中提取的应用程序包的名称 - >
059
    < XPath 输入 = “/清单/输出= “manifest.package” />
060
    < - hasCode属性值从清单文件中提取(应用节点) - >
061
    <xpath input="l"expression="/manifest/application/@android:hasCode" output="manifest.hasCode"default="true" />
062
       
063
    < - 源文件及资源路径 - >
064
    < 属性 名称= “source.dir” = “SRC” />
065
    < 属性 名称= “source.absolute.dir” 位置= “$ {source.dir}” />
066
    < 属性 名称= “gen.dir” = “” />
067
    < 属性 名称= “gen.absolute.dir” 位置= “$ {gen.dir}” />
068
    < 属性 名称= “resource.dir” = “水库” />
069
    < 属性 名称= “resource.absolute.dir” 位置= “$ {resource.dir}” />
070
    < 属性 名称= “asset.dir” = “资产” />
071
    < 属性 名称= “asset.absolute.dir” 位置= “$ {asset.dir}” />
072
073
    < - 为第三方Java库目录 - >
074
    < 属性 名称= “jar.libs.dir” = “” />
075
    < 属性 名称= “jar.libs.absolute.dir” 位置= “$ {jar.libs.dir}” />
076
    < - 创建的所有jar文件的路径,从主体工程和
077
              - >
078
    < 路径 ID = “f” >
079
        < 文件集 DIR = “$ {jar.libs.absolute.dir}” = “*。罐子” />
080
        < 路径 refid =“project.libraries.jars” />
081
    </ 路径>
082
083
    < - 本地库目录 - >
084
    < 属性 名称= “native.libs.dir” = “” />
085
    < 属性 名称= “native.libs.absolute.dir” 位置= “$ {native.libs.dir}” />
086
087
    < - 输出路径 - >
088
    < 属性 名称= “out.dir” = “走出去” />
089
    < 属性 名称= “out.absolute.dir” 位置= “$ {out.dir}” />
090
    < 属性 名称= “out.classes.dir” = “$ {out.absolute.dir} /” />
091
    < 属性 名称= “out.classes.absolute.dir” 位置= “$ {out.classes.dir}” />
092
093
    < - 中间文件 - >
094
    < 属性 名称= “dex.file.name” =“classes.dex” />
095
    < 属性 名称= “intermediate.dex.file” 位置= “$ {out.absolute.dir} / $ {dex.file.name}” />
096
    < 属性 名称= “resource.package.file.name” = “$ {ant.project.name}ap_” />
097
098
    < - 最后的一揽子文件生成
099
              这些都可以通过设置它们早些时候重写
100
              不同的价值观 - >
101
    <property name="out.debug.unaligned.file"location="${out.absolute.dir}/${ant.project.name}-debug-unaligned.apk" />
102
    < 属性 名称= “out.debug.file” 位置= “$ {out.absolute.dir} / $ {ant.project.name} debug.apk” />
103
104
    < 属性 名称= “out.unsigned.file.name” = “$ {ant.project.name} unsigned.apk” />
105
    < 属性 名称= “out.unsigned.file” 位置= “$ {out.absolute.dir} / $ {out.unsigned.file.name}” />
106
107
    < 属性 名称= “out.unaligned.file.name” = “$ {ant.project.name} unaligned.apk” />
108
    < 属性 名称= “out.unaligned.file” 位置= “$ {out.absolute.dir} / $ {out.unaligned.file.name}” />
109
110
    < 属性 名称= “lease.file.name” = “$ {ant.project.name} release.apk”/>
111
    < 属性 名称= “lease.file” 位置= “$ {out.absolute.dir} / $ {lease.file.name}” />
112
113
    < 属性 名称= “abled= “” />
114
    < 属性 名称= “Android的罐子价值“ />
115
116
    < - 设置用于过滤/覆盖的一些性质。如果这些都没有定义
117
              在那之前,这将创建与空值,然后忽略
118
              接受他们的自定义任务。 - >
119
    < 属性 = “de” = “” />
120
    < 属性 = “source.filter” = “” />
121
    < 属性 = “filter.abi” = “” />
122
123
    < - JAVA源文件coded-compile-的目标平台,为1.51.6都可以 - >
124
    < 属性 = “ding” = “UTF-8” />
125
    < 属性 名称= “java.target” = “1.5” />
126
    < 属性 名称= “java.source” = “1.5” />
127
128
    < - 详细程度 - >
129
    < 属性 = “冗长= “” />
130
131
    < - 详细程度 - >
132
    < 属性 = “冗长= “” />
133
    < - 这是必要的艾玛,因为它使用多冗长而不是简单的'''false'
134
              冗长物业不是用户配置和'详细'完全取决于
135
              - >
136
    < 条件 属性= “冗长= “详细的其他安静” >
137
        < istrue = “$ {详细}” />
138
    </ 条件>
139
    < - 这是必要的切换zipalign冗长。完全取决于详细
140
              - >
141
    < 条件 属性= “v.option” = “-V” 其他
142
        < istrue = “$ {详细}” />
143
    </ 条件>
144
    < - 这是必要的切换DX冗长。完全取决于'详细' - >
145
    < 条件 属性= “verbose.option” = “ - verbose其他= “” >
146
        < istrue = “$ {详细}” />
147
    </ 条件>
148
149
    < - 属性 - >签署释放模式
150
    < 条件 属性= “has.keystore= “” >
151
        “<” >
152
            < 使用isset 属性= “key.store” />
153
            < 长度的 字符串= “$ {key.store}” = “ 长度= “0” />
154
            < 使用isset 属性= “key.alias” />
155
        </ >
156
    </ 条件>
157
    < 条件 属性= “has.password” 价值=“passwordxxxxx”
158
        “<” >
159
            < 使用isset 财产= “has.keystore” />
160
            < 使用isset 属性= “key.store.password” />
161
            < 使用isset 属性= “key.alias.password” />
162
        </ >
163
    </ 条件>
164
165
    < - 工具 - >
166
    < 条件 属性= “EXE” = “的。exe” 其他= “” >
167
        < 操作系统 家族的窗口” />
168
    </ 条件>
169
    < 属性 = “亚行的位置= “$ {ls.dir} /亚行$ {EXE}” />
170
    < 属性 = “zipalign” 位置= “$ {ls.dir} / zipalign $ {EXE}” />
171
172
    艾玛< - 配置 - >
173
    < 属性 名称= “emma.dir” = “$ {sdk.dir} /工具/ lib目录” />
174
    < 路径 ID = “emma.lib” >
175
        < pathelement 位置= “$ {emma.dir} / emma.jar” />
176
        < pathelement 位置= “$ {emma.dir} / emma_ant.jar” />
177
    </ 路径>
178
    < taskdef 资源= “emma_ant.properties” classpathref = “emma.lib” />
179
    < - 艾玛配置完 - >
180
181
    < - > -
182
183
    < - 配置的宏,它可以传递参数的输出目录,
184
              DEX输出文件名和外部库,地塞米松(可选) - >
185
    < macrodef 名称= “DEX辅助” >
186
        < 元素 名称= “外部库可选” />
187
        < 元素 名称= “额外参数可选” />
188
        < 连续>
189
            < - 设置主要输入地塞米松。如果预DEX任务,将其设置为
190
                        别的东西,这有没有影响 - >
191
            < 属性 名称= “out.dex.input.absolute.dir” = “$ {out.classes.absolute.dir}” />
192
193
            < - 设置二次DX输入:该项目(库)的jar文件
194
                        如果预DEX任务设置它到别的东西,这有没有影响 - >
195
            < 如果>
196
                < 条件>
197
                    < isreference refid =“out.dex.f” />
198
                </ 条件>
199
                < 其他>
200
                    < 路径 ID = “out.dex.f” >
201
                        < 路径 refid “f” />
202
                    </ 路径>
203
                </ 其他>
204
            </ 如果>
205
206
            < 回声>编译后的文件和外部库转换成$ {intermediate.dex.file} ... </ 回声>
207
            < 适用于 可执行= “$ {DX}” failonerror = “真正的平行” >
208
                < 参数 = “ -地塞米松” />
209
                < 参数 = “ -输出$ {intermediate.dex.file}” />
210
                < 额外的参数 />
211
                < 参数 = “$ {verbose.option}” />
212
                < 参数 路径= “$ {out.dex.input.absolute.dir}” />
213
                < 路径 refid “out.dex.f” />
214
                < 外部的库 />
215
            </ 申请>
216
        </ 顺序>
217
    </ macrodef >
218
219
    < - 这是宏,使外部jar文件传递变量列表ApkBuilder
220
              使用的例子:
221
              <package-helper output.filepath="/path/to/foo.apk">
222
                  <extra-jars>
223
                    <jarfolder path="my_jars" />
224
                    <jarfile path="foo/bar.jar" />
225
                    <jarfolder path="your_jars" />
226
                  </额外的罐子>
227
              </包辅助> - >
228
    < macrodef 名称= “包帮手
229
        < 属性 = “output.filepath” />
230
        < 元素 名称= “额外的罐子可选” />
231
        < 连续>
232
            <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}">
233
                < DEX 路径= “$ {intermediate.dex.file}” />
234
                < sourcefolder 路径= “$ {source.absolute.dir}” />
235
                < sourcefolder refid =“project.libraries.src” />
236
                < jarfolder 路径= “$ {jar.libs.absolute.dir}” />
237
                < jarfolder refid =“project.libraries.libs” />
238
                < nativefolder 路径= “$ {native.libs.absolute.dir}” />
239
                < nativefolder refid =“project.libraries.libs” />
240
                < 额外的罐子 />
241
            </ apkbuilder >
242
        </ 顺序>
243
    </ macrodef >
244
880
    < - 这是的宏观,其中zipaligns in.package输出到out.package。用于由目标
246
              调试,调试与艾玛和释放 - >
247
    < macrodef 名称= “zipalign辅助” >
248
        < 属性 名称= “in.package” />
249
        < 属性 名称= “out.package” />
250
        < 连续>
251
            < 回声>运行拉链上最后的apk对齐... </ 回声>
252
            < EXEC 可执行= “$ {zipalign}” failonerror = “” >
253
                < 参数 = “$ {v.option}” />
254
                < 参数 = “-F” />
255
                < 参数 = “4” />
256
                < arg 路径= “@ {in.package}” />
257
                < arg 路径= “@ {out.package}” />
258
            </ EXEC >
259
        </ 顺序>
260
    </ macrodef >
261
262
    < - 这是宏仅用于两个目标之间的代码共享,安装和
263
              安装与艾玛做完全一样的,但不同的依赖关系 - >
264
    < macrodef 名称= “安装助手
265
        < 连续>
266
            < 回声>安装到默认的模拟器或设备$ {out.debug.file} ... </ 回声>
267
            < EXEC 可执行= “$ {ADB}” failonerror = “” >
268
                < 参数 = “$ {adb.device.arg}” />
269
                < 参数 = “安装” />
270
                < 参数 = “-R” />
271
                < 参数 路径= “$ {out.debug.file}” />
272
            </ EXEC >
273
        </ 顺序>
274
    </ macrodef >
275
276
    < - 规则 - >
277
278
    < - 创建输出目录,如果他们不存在。 - >
279
    < 目标 名称,显示目录” >
280
        < 回声>创建输出目录,如果需要的话... </ 回声>
281
        < MKDIR DIR = “$ {resource.absolute.dir}” />
282
        < MKDIR DIR = “$ {jar.libs.absolute.dir}” />
283
        < MKDIR DIR = “$ {out.absolute.dir}” />
284
        < = “$ {manifest.hasCode}” >
285
            < 然后>
286
                < MKDIR DIR = “$ {gen.absolute.dir}” />
287
                < MKDIR DIR = “$ {out.classes.absolute.dir}” />
288
            </ 然后>
289
        </ 如果>
290
       
291
                   
292
       
293
    </ 目标>
294
295
    < - 空的默认预生成的目标。在创建一个类似的目标
296
              你的l文件,它会叫,而不是这一个。 - >
297
    < 目标 名称= “预生成” />
298
299
    < - 生成R.java文件对本项目的资源。 - >
300
    < 目标 名称中的资源-SRC” 取决于显示目录,预打造” >
301
        < = “$ {manifest.hasCode}” >
302
            < 然后>
303
                < 回声>生成R.java文件/ Manifest.java从资源... </ 回声>
304
                <aapt executable="${aapt}" command="package"verbose="${verbose}" manifest="l"androidjar="${android.jar}" rfolder="${gen.absolute.dir}">
305
                    < 水库 路径= “$ {resource.absolute.dir}” />
306
                </ AAPT >
307
            </ 然后>
308
            < 其他>
309
                < 回声> hasCode =假。跳绳... </ 回声>
310
            </ 其他>
311
        </ 如果>
312
    </ 目标>
313
314
    < - aidl文件生成Java类。 - >
315
    < 目标 名称= “AIDL 取决于= “显示目录” >
316
        < = “$ {manifest.hasCode}” >
317
            < 然后>
318
                < 回声> aidl文件编译成Java... </ 回声>
319
                < AIDL 可执行= “$ {AIDL}” 框架“$ {android.aidl}” genFolder = “$ {gen.absolute.dir}” >
320
                    < 路径= “$ {source.absolute.dir}” />
321
                    < refid =“project.libraries.src” />
322
                </ AIDL >
323
            </ 然后>
324
            < 其他>
325
                < 回声> hasCode =假。跳绳... </ 回声>
326
            </ 其他>
327
        </ 如果>
328
    </ 目标>
329
330
    < - 空的默认预编译的目标。在创建一个类似的目标
331
              你的l文件,它会叫,而不是这一个。 - >
332
    < 目标 名称= “预编译” />
333
334
    < - 编译java文件到该项目的类文件。 - >
335
    < 目标 名称= “编译取决于= “资源-SRCAIDL,预编译的说明项目。java文件编译成类文件” >
336
        < = “$ {manifest.hasCode}” >
337
            < 然后>
338
                < - Android的规则,如果一个测试项目中使用,其类路径中应包括
339
                            测试项目的位置 - >
340
                <condition property="extensible.classpath"value="${tested.project.absolute.dir}/${out.dir}/classes" else=".">
341
                    < 使用isset 属性= “tested.project.absolute.dir” />
342
                </ 条件>
343
                <condition property="extensible.libs.classpath"value="${tested.project.absolute.dir}/libs" else="${jar.libs.dir}">
344
                    < 使用isset 属性= “tested.project.absolute.dir” />
345
                </ 条件>
346
                <javac encoding="${ding}" source="${java.source}"target="${java.target}" debug="true" extdirs=""destdir="${out.classes.absolute.dir}"bootclasspathref="android.target.classpath" verbose="${verbose}"classpath="${extensible.classpath}" classpathref="f">
347
                    < SRC 路径= “$ {source.absolute.dir}” />
348
                    < SRC 路径= “$ {gen.absolute.dir}” />
349
                    < SRC refid = “project.libraries.src” />
350
                    < 类路径>
351
                        < 文件集 DIR = “$ {extensible.libs.classpath}” = “*。罐子” />
352
                    </ classpath>
353
                </ javac>
354
            </ 然后>
355
            < 其他>
356
                < 回声> hasCode =假。跳绳... </ 回声>
357
            </ 其他>
358
        </ 如果>
359
    </ 目标>
360
361
    < - 空的默认编译后的目标。在创建一个类似的目标
362
              你的l文件,它会叫,而不是这一个。 - >
363
    < 目标 名称= “编译” />
364
365
    < - 模糊目标
366
            这仅仅是在释放积极构建被定义fig
367
            default.properties
368
369
            以取代Proguard的不同混淆引擎的:
370
            覆盖在l以下的目标之前,呼叫<setup>
371
                释放混淆检查
372
                    检查是否应该发生混淆,并把结果在一个属性。
373
                调试混淆检查
374
                    不应该发生混淆。相同的属性设置为false
375
                - 混淆
376
                    **确保除非=“do.notpile”的目标定义在使用**
377
                    检查,如果在-debug/release-obfuscation-check设置的属性设置为true
378
                    如果为true
379
                        执行混淆
380
                        设置物业out.dex.input.absolute.dir以混淆的输出
381
        - >
382
    < 目标 名称,模糊 除非= “do.notpile” >
383
        < if 条件= “$ {abled}” >
384
            < 然后>
385
                < 属性 名称= “obfuscate.absolute.dir” 位置= “$ {out.absolute.dir} / ProGuard” />
386
                < 属性 名称= “preobfuscate.jar.file” = “$ {obfuscate.absolute.dir} / original.jar” />
387
                < 属性 名称= “obfuscated.jar.file” = “$ {obfuscate.absolute.dir} / obfuscated.jar” />
388
                < - DEX输入将是ProGuard的输出 - >
389
                < 属性 名称= “out.dex.input.absolute.dir” = “$ {obfuscated.jar.file}” />
390
391
                < - 添加Proguard的任务 - >
392
                < 属性 名称= “proguard.jar” 位置= “$ {proguard.home} / lib/ proguard.jar” />
393
                < taskdef 名字= “ProGuard类名=“proguard.ant.ProGuardTask” CLASSPATH = “$ {proguard.jar}” />
394
395
                < - Androidclasspath路径对象设置成一个单一的财产。这将是
396
                            平台的路径分隔符分隔的所有jar文件。
397
                        - >
398
                < 属性 = “android.libraryjars” refid =“android.target.classpath” />
399
                < - 建立一个与所有的jar文件,必须是混淆的路径对象。
400
                            这包括项目编译的源代码和任何第三方的jar
401
                            文件。 - >
402
                < 路径 ID = “f” >
403
                    < pathelement 位置= “$ {preobfuscate.jar.file}” />
404
                    < 路径 refid “f” />
405
                </ 路径>
406
                < - 设置项目的jar文件路径到一个单一的财产对象。这将是
407
                            平台的路径分隔符分隔的所有jar文件。
408
                        - >
409
                < 属性 = “project.jars” refid =“f” />
410
411
                < MKDIR DIR = “$ {obfuscate.absolute.dir}” />
412
                < 删除 文件= “$ {preobfuscate.jar.file}” />
413
                < 删除 文件= “$ {obfuscated.jar.file}” />
414
                < 罐子 BASEDIR = “$ {out.classes.dir}” destfile = “$ {preobfuscate.jar.file}” />
415
                < - 混淆相关参数 - >
416
                < proguard >
417
                    - optimizationpasses 5
418
                    - dontusemixedcaseclassnames
419
                    - dontskipnonpubliclibraryclasses
420
                    - dontpreverify
421
                    - 详细
422
                    - repackageclasses
423
                    - allowaccessmodification
424
                    优化!代码/简化/算术,场/ *!类/合并/ *
425
426
                    - 保持公共类*延伸android.app.Activity
427
                    保持公共类*延伸android.app.Application
428
                    保持公共类*延伸android.app.Service
429
                    - 保持公共类*延伸t.BroadcastReceiver
430
                    - 保持公共类*延伸t.ContentProvider
431
                    保持公共类com.android.vending.licensing.ILicensingService
432
                    injars $ {project.jars}
433
                    outjars $ {obfuscated.jar.file}
434
                    libraryjars $ {android.libraryjars}
435
                </ ProGuard>
436
            </ 然后>
437
        </ 如果>
438
    </ 目标>
439
440
    < 目标 名称= “依赖模糊” >
441
    </ 目标>
442
443
    < - 这个项目的转换。类文件到dex文件 - >
444
    < - <target name="-dex" depends="compile, -post-compile, -obfuscate" unless="do.notpile"> - >
445
    < 目标 名称中的指数取决于= “的编译,编译后,优化,除非“do.notpile” >
446
        < = “$ {manifest.hasCode}” >
447
            < 然后>
448
                < DEX辅助 />
449
            </ 然后>
450
            < 其他>
451
                < 回声> hasCode =假。跳绳... </ 回声>
452
            </ 其他>
453
        </ 如果>
454
    </ 目标>
455
456
    < 目标 名称优化取决于= “的编译,混淆” >
457
        < if 条件= “$ {abled}” >
458
            < 然后>
459
                < MKDIR DIR = “$ {out.dir} // ” />
460
                < - 创建文件夹 - >
461
                < - 别人的<jar basedir="${out-folder}" destfile="temp.jar"/> - >
462
                < 属性 = “ProGuard的罐子价值= “$ {proguard.home} / lib/ proguard.jar />
463
                < Java 罐子= “$ {ProGuard的罐子}” = “failonerror = “”>
464
                    < jvmarg = 32“ />
465
                    < 参数 = out.dir“injars $ {} /” />
466
                    < - 原来的类文件,使用斌/类下的 - >
467
                    < 参数 = “outjars $ {out.dir} / /出类” />
468
                    < - 产生的混淆类位置 - >
469
                    < 参数 = “libraryjars $ {Android的罐子}” />
470
                    < -
471
                    <arg value="一般管理-libraryjars ${library-jar}/some_lib_used.jar"/>
472
                    - >
473
                    < 参数 = “保持公共类*延伸android.app.Activity” />
474
                    < 参数 = “保持公共类*延伸android.app.Service的的” />
475
                    < 参数 = “保持公共类*延伸t.BroadcastReceiver” />
476
                    < 参数 = “保持公共类*延伸t.ContentProvider” />
477
                    < 参数 = “保持公共类*延伸android.view.View” />
478
                    < 参数 = “dontwarn” />
479
                    < 参数 = “dontpreverify” />
480
                    < 参数 = “optimizationpasses 7” />
481
                    < 参数 = “-dontusemixedcaseclassnames” />
482
                    < 参数 = “dontskipnonpubliclibraryclasses” />
483
                    < 参数 = “repackageclasses” />
484
                    < 参数 = “allowaccessmodification” />
485
                    < - 的!<arg value="-dontskipnonpubliclibraryclassmembers"/> - >
486
                </ JAVA >
487
                < - 这些什么原来的瓶子<delete file="temp.jar"/> - >
488
                < - 的!<delete dir="${out-folder}"/> - >
489
                < - <mkdir dir="${out-folder}"/>
490
              <unzip src="optimized.jar" dest="${out-folder}"/>
491
              <delete file="optimized.jar"/> - >
492
            </ 然后>
493
        </ 如果>
494
    </ 目标>
495
496
    < - 输出包文件放入该项目的资源
497
              这实际上可以创建多个资源包
498
              一些特定的配置已定制的apk
499
              default.properties声明。
500
              - >
501
    < 目标 名称= “包资源” >
502
        < 回声>包装资源</ 回声>
503
        <aapt executable="${aapt}" command="package"versioncode="${de}" debug="${build.packaging.debug}"manifest="l" assets="${asset.absolute.dir}"androidjar="${android.jar}" apkfolder="${out.absolute.dir}"resourcefilename="${resource.package.file.name}"resourcefilter="${source.filter}">
504
            < 水库 路径= “$ {resource.absolute.dir}” />
505
            < - <nocompress />势力没有任何资产的文件或RES /原材料压缩 - >
506
            < - <nocompress extension="xml" />部队没有对资产和RES /原料的特定文件扩展名的压缩 - >
507
        </ AAPT >
508
509
    </ 目标>
510
    < - 软件包的应用程序,并签署了调试的关键。 - >
511
    < 目标 名称中的包调试符号取决于= “指数,包资源>
512
        < 包帮手 output.filepath = “$ {out.debug.unaligned.file}” />
513
    </ 目标>
514
515
    < - 软件包的应用没有签署。 - >
516
    < 目标 名称中的包释放取决于= “指数,包资源>
517
        < 包帮手 output.filepath = “$ {out.unsigned.file}” />
518
    </ 目标>
519
520
    < 目标 名称= “编译测试,如果测试 如果=“tested.project.dir” 除非=“do.notpile.again” >
521
        < subant 目标= “编译” >
522
            < 文件集 DIR = “$ {tested.project.absolute.dir}” = “l文件”/>
523
        </ subant >
524
    </ 目标>
525
526
    < 目标 名称= “调试混淆检查” >
527
        < - ProGuard的是从来没有在调试模式下启用 - >
528
        < 属性 名称= “abled= “” />
529
    </ 目标>
530
531
    < 目标 名称= “设置调试模式取决于= “调试混淆检查” >
532
        < - 属性仅在调试模式下。
533
                  有用的,如果/除非在目标节点的属性
534
                  在使用前1.8蚂蚁 - >
535
        < 属性 名称= “de.debug” = “” />
536
537
        < - 是否生成调试版本。始终设置。 - >
538
        < 属性 名称= “build.packaging.debug” = “” />
539
540
        < - 签订调试模式: - >
541
        < 属性 名称= “build.signing.debug” = “” />
542
543
    </ 目标>
544
545
    < - 生成调试输出包,提供所有必要的文件都已经dexed - >
546
    < 目标 名称= “调试” = “设置调试模式,编译测试,如果测试,包调试符号描述= “构建应用程序和调试关键的迹象。” >
547
        <zipalign辅助 in.package “$ {out.debug.unaligned.file}” out.package= “$ {out.debug.file}” />
548
        < 回声>调试软件包:$ {out.debug.file} </ 回声>
549
    </ 目标>
550
551
    < - 呼吁通过目标释放。只执行如果keystore
552
              密钥别名是已知的,但不是他们的密码。 - >
553
    < 目标 名称= “发布提示为密码 如果= “has.keystore” 除非“has.password >
554
        < - 获取密码 - >
555
        < 回声>获取密码$ {has.keystore} $ {has.password} </ 回声>
556
        < 输入 消息= “请输入keystore密码(店:$ {key.store}AddProperty =“key.store.password” DefaultValue = “5201314 ......” />
557
        < 输入 消息= “请输入密码:别名”$ {key.alias}'“ AddProperty =“key.alias.password” DefaultValue = “5201314 ......” />
558
    </ 目标>
559
560
    < - 呼吁通过目标释放。只有执行,如果没有
561
              密钥库/ SET键的别名 - >
562
    < 目标 名称= “释放nosign” 除非= “has.keystore” >
563
        < 回声>key.store和在build.properties key.alias属性。</ 回声>
564
        < 回声>请签署$ {out.unsigned.file}手动</ 回声>
565
        < 回声>和运行zipalignAndroid SDK的工具。</ 回声>
566
    </ 目标>
567
568
    < 目标 名称= “释放混淆检查” >
569
        < 条件 属性= “abled= “真正的其他” >
570
            “<” >
571
                < 使用isset 财产= “lease” />
572
                < 使用isset 属性= “fig” />
573
            </ >
574
        </ 条件>
575
        < if 条件= “$ {abled}” >
576
            < 然后>
577
                < - 中学DX输入(JAR文件)是空的,因为所有的
578
                            jar文件将在混淆罐子 - >
579
                < 路径 ID = “out.dex.f” />
580
            </ 然后>
581
        </ 如果>
582
    </ 目标>
583
584
    < 目标 名称= “集发行模式” >
585
        < - 释放模式是唯一有效的,如果没有明确的清单
586
                  调试设置为true。默认为false
587
                  实际上,我们存储build.packaging.debuglease - >
588
        <xpath input="l"expression="/manifest/application/@android:debuggable"output="build.packaging.debug" default="false" />
589
590
        < - 签署释放模式: - >
591
        < 属性 名称= “build.signing.debug” = “” />
592
593
        < if 条件= “$ {build.packaging.debug}” >
594
            < 然后>
595
                < 回声> ************ ** </ 呼应>
596
                < 回声> ****Android清单调试=**** </ 回声>
597
                < 回声> ****释放键做调试包装**** </ 回声>
598
                < 回声> ************ ** </ 呼应>
599
            </ 然后>
600
            < 其他>
601
                < - 属性仅在释放模式设置。
602
                            有用的,如果/除非在目标节点的属性
603
                            在使用前1.8蚂蚁 - >
604
                < 属性 名称= “lease= “” />
605
            </ 其他>
606
        </ 如果>
607
    </ 目标>
608
609
    < - 运行包释放和释放nosign第一,然后运行
610
              如果释放的迹象是真实的(在释放检查,
611
              被释放,无符号) - >
612
    < 目标 名称= “释放取决于= “设置发布模式,发布混淆检查,包释放,释放提示为密码,释放nosign” = “has.keystore” 描述=“生成应用程序生成的apk文件前必须签署
613
                                它被公布。“>
614
        < - 签署的APK - >
615
        < 回声>签署最终的APK ... </ 回声>
616
        <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}" />
617
618
        < - 邮编对齐的APK - >
619
        <zipalign辅助 in.package “$ {out.unaligned.file}” out.package = “$ {lease.file}” />
620
        <echo>Release Package: ${lease.file}</echo>
621
       
622
               
623
    </ 目标>
624
    < 目标 名称干净 描述= “删除创建的输出文件的其他目标。” >
625
        < 删除 DIR = “$ {out.absolute.dir” 详细= “$ {详细}” />
626
        < 删除 DIR = “$ {gen.absolute.dir” 详细= “$ {详细}” />
627
    </ 目标>
628
    < 目标 名称= “deployableAllDevice” 描述= “建立所有设备包” >
629
        < - - >
630
        <antcall target="release" inheritAll="true"><param name="uid"value="100" /><param name="sdk" value="91" /></antcall>
631
        <antcall target="release" inheritAll="true"><param name="uid"value="101" /><param name="sdk" value="90" /></antcall>
632
       
633
    </ 目标>
634
</ 项目>
xml version="1.0" encoding="UTF-8"?>
002
<project name="xiyou_base_" default="deployableAllDevice">
003
   
004
    <property name="proguard.home" value="D:/software/j2me/proguard4.5.1/proguard4.5.1"/>
005
   
006
    <property name="sdk.dir" value="E:\dev\android-sdk-windows"/>
007
   
008
    <property name="has.keystore" value="true" />
009
   
010
    <property name="has.password" value="true" />
011
   
012
    <property name="key.alias" value="key.keystore" />
013
    <property name="key.store" value="key.keystore" />
014
   
015
    <property name="key.store.password" value="xxxx" />
016
    <property name="key.alias.password" value="xxxx" />
017
018
019
    <!--
020
    default.properties 内容
021
    target=android-4
022
    fig=proguard.cfg
023
-->
024
    <property file="default.properties" />
025
026
    <!-- Custom Android task to deal with the project target, and import the
027
        proper rules.
028
        This requires ant 1.6.0 or above. -->
029
    <path id="android.antlibs">
030
        <pathelement path="${sdk.dir}/tools/lib/anttasks.jar" />
031
        <pathelement path="${sdk.dir}/tools/lib/sdklib.jar" />
032
        <pathelement path="${sdk.dir}/tools/lib/androidprefs.jar" />
033
    </path>
034
035
    <taskdef name="setup" classname="com.android.ant.SetupTask" classpathref="android.antlibs" />
036
    <setup import="false" />
037
038
   
039
    <taskdef name="aapt" classname="com.android.ant.AaptExecLoopTask" classpathref="android.antlibs" />
040
041
    <taskdef name="aidl" classname="com.android.ant.AidlExecTask" classpathref="android.antlibs" />

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。