牛人必修 Ant编译android工程 ,并Proguard代码混淆,v4混淆配置

一,准备ant

ant 官网可下载
http://ant.apache.org/
ant 环境配置:
1。解压ant的包到本地目录。
2。在环境变量中设置ANT_HOME,值为你的安装目录。
3。把ANT_HOME/bin加到你系统环境的path。

更多的介绍可以去google相信有很多

二,详细步骤和说明,这里我们要知道一些Android命令。

前提条件已配置好android sdk 环境,所以可以在任意目录下执行android 命令,不然则要切换到 android-sdk\tools目录下

我这里已经配置好了,所以无论我在什么路径下了。
1.创建一个android项目
参数说明:
-k /--package 为命名空间(包名)-a /--name 工程名
-p /--path 项目 -t 为目标平台的版本编号

C:\Documents and Settings\Administrator>android create project -k com.android.Ta
nk -a Tank -t 4  -p F:\tank

 

列出不同版本平台的对应id编号 android.bat list targets /android list
C:\Documents and Settings\Administrator>android.bat list targets

 

对已经存在的android工程,我们可以update下(修改平台的版本),这样会自动添加build.xml 等ant 的配置文件
C:\Documents and Settings\Administrator>android update project --name Tank -t 11
  -p F:\tank

编译:直接ant 是不会有文件输出的,所以后面一定要带上参数
ant 参数如下:

    * debug:带调试用签名的构建
    * release:构建应用程序,生成的apk必须签名才可以发布
    * install:安装调试构建的包到运行着的模拟器或者设备;
    * reinstall
    * uninstall

开始执行编译:

E:\MyLiB\Android\AndroidAnt\MyBoardCastReciver>ant debug
Buildfile: E:\MyLiB\Android\AndroidAnt\MyBoardCastReciver\build.xml
    [setup] Android SDK Tools Revision 7
    [setup] Project Target: Android 2.2
    [setup] API level: 8
    [setup]
    [setup] ------------------
    [setup] Resolving library dependencies:
    [setup] ------------------
    [setup] Ordered libraries:
    [setup] ------------------
    [setup]
    [setup] WARNING: No minSdkVersion value set. Application will install on all
 Android versions.
    [setup]
    [setup] Importing rules file: tools\ant\ant_rules_r3.xml
    [javac]****警告:编码 ascii 的不可映射字符********


出现“警告:编码 ascii 的不可映射字符”错误

编译乱码解决办法:
查看输出提示:
[setup] Importing rules file: tools\ant\ant_rules_r3.xml
找到sdk目录下的<sdkpath>\tools\ant\ant_rules_r3.xml
打开找到节点:
 <javac encoding="ascii" target="1.5" debug="true" extdirs="" ....>
把ascii改为gbk即可。


启动相应模拟器:emulator -avd avdName
E:\MyLiB\Android\AndroidAnt\Toast>emulator -avd tank

列出已有avd 的列表
E:\MyLiB\Android\AndroidAnt\Toast\bin>adb devices
List of devices attached
emulator-5554   device

安装到指定avd
E:\MyLiB\Android\AndroidAnt\Toast\bin>adb -s emulator-5554 install Toast-debug.a
pk


ok ,ant 编译android 并手动安装apk文件就写到这里了。是不是也很COOL!


首先,做任何开发前,肯定是各种环境搭建和配置啊,ant的搭建很简单:

一、安装ant

到官方主页http://ant.apache.org下载新版(目前为Ant-1.9.2)的ant,得到的是一个apache-ant-1.8.1-bin.zip的压缩包。将其解压到你的硬盘上,例如:D:\Android\apache-ant-1.9.2

二、配置环境变量

window中设置ant环境变量:

ANT_HOME    D:/Android/apache-ant-1.9.2

path             D:/Android/apache-ant-1.9.2/bin

classpath      D:/Android/apache-ant-1.9.2/lib

linux中设置ant环境变量:

      root用户登陆,用vi编辑器修改root目录下的".bash_profile"属性文件,假设Ant安装在/user/local/ant目录下,要在文件的最后加上

"exportANT_HOME=/user/local/ant"和"export PATH=$PATH:$ANT_HOME/bin"

三、验证ant

为了验证ant是否成功安装,可以进行如下操作:

依次选择:开始->运行->cmd,输入如下命令:ant

如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!

Build failed

当然,JAVA_HOME、ANDROID_SDK_HOME等的配置这里就不说了

四、我们就在项目中添加build.xml

code如下:

001<?xml version="1.0" encoding="utf-8"?>
002<project
003    name="HappyShopping"
004    default="release" >
005 
006    <!-- ANT环境变量 -->
007 
008    <property environment="env" />
009    <!-- 应用名称 -->
010 
011    <property
012        name="appName"
013        value="${ant.project.name}" />
014    <!-- SDK目录(获取操作系统环境变量ANDROID_SDK_HOME的值) -->
015 
016    <property
017        name="sdk-folder"
018        value="${env.ANDROID_SDK_HOME}" />
019    <!-- SDK指定平台目录 -->
020 
021    <property
022        name="sdk-platform-folder"
023        value="${sdk-folder}/platforms/android-16" />
024    <!-- SDK中tools目录 -->
025 
026    <property
027        name="sdk-tools"
028        value="${sdk-folder}/tools" />
029    <!-- SDK指定平台中tools目录 -->
030 
031    <property
032        name="sdk-platform-tools"
033        value="${sdk-folder}/platform-tools" />
034 
035    <!-- 使用到的命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令) -->
036 
037    <property
038        name="aapt"
039        value="${sdk-platform-tools}/aapt" />
040 
041    <property
042        name="aidl"
043        value="${sdk-platform-tools}/aidl" />
044 
045    <property
046        name="dx"
047        value="${sdk-platform-tools}/dx.bat" />
048 
049    <property
050        name="apkbuilder"
051        value="${sdk-tools}/apkbuilder.bat" />
052 
053    <property
054        name="jarsigner"
055        value="${env.JAVA_HOME}/bin/jarsigner" />
056 
057    <!-- 编译需要的jar; 如果项目使用到地图服务则需要maps.jar -->
058 
059    <property
060        name="android-jar"
061        value="${sdk-platform-folder}/android.jar" />
062 
063    <property
064        name="android-maps-jar"
065        value="${sdk-folder}/add-ons/addon_google_apis_google_inc_8/libs/maps.jar" />
066 
067    <!-- 编译aidl文件所需的预处理框架文件framework.aidl -->
068 
069    <property
070        name="framework-aidl"
071        value="${sdk-platform-folder}/framework.aidl" />
072 
073    <!-- 生成R文件的相对目录 -->
074 
075    <property
076        name="outdir-gen"
077        value="gen" />
078    <!-- 编译后的文件放置目录 -->
079 
080    <property
081        name="outdir-bin"
082        value="bin" />
083 
084    <!-- 清单文件 -->
085 
086    <property
087        name="manifest-xml"
088        value="AndroidManifest.xml" />
089    <!-- 源文件目录 -->
090 
091    <property
092        name="resource-dir"
093        value="res" />
094 
095    <property
096        name="asset-dir"
097        value="assets" />
098    <!-- java源文件目录 -->
099 
100    <property
101        name="srcdir"
102        value="src" />
103 
104    <property
105        name="srcdir-ospath"
106        value="${basedir}/${srcdir}" />
107    <!-- 外部类库所在目录 -->
108 
109    <property
110        name="external-lib"
111        value="libs" />
112 
113    <property
114        name="external-lib-ospath"
115        value="${basedir}/${external-lib}" />
116 
117    <!-- 生成class目录 -->
118 
119    <property
120        name="outdir-classes"
121        value="${outdir-bin}" />
122 
123    <property
124        name="outdir-classes-ospath"
125        value="${basedir}/${outdir-classes}" />
126 
127    <!-- classes.dex相关变量 -->
128 
129    <property
130        name="dex-file"
131        value="classes.dex" />
132 
133    <property
134        name="dex-path"
135        value="${outdir-bin}/${dex-file}" />
136 
137    <property
138        name="dex-ospath"
139        value="${basedir}/${dex-path}" />
140 
141    <!-- 经过aapt生成的资源包文件 -->
142 
143    <property
144        name="resources-package"
145        value="${outdir-bin}/resources.ap_" />
146 
147    <property
148        name="resources-package-ospath"
149        value="${basedir}/${resources-package}" />
150 
151    <!-- 未认证apk包 -->
152 
153    <property
154        name="out-unsigned-package"
155        value="${outdir-bin}/${appName}-unsigned.apk" />
156 
157    <property
158        name="out-unsigned-package-ospath"
159        value="${basedir}/${out-unsigned-package}" />
160 
161    <!-- 证书文件 -->
162 
163    <property
164        name="keystore-file"
165        value="${basedir}/naomi" />
166 
167    <!-- 已认证apk包 -->
168 
169    <property
170        name="out-signed-package"
171        value="${outdir-bin}/${appName}.apk" />
172 
173    <property
174        name="out-signed-package-ospath"
175        value="${basedir}/${out-signed-package}" />
176 
177    <!-- 代码混淆配置 -->
178    <property
179        name="proguard-home"
180        value="D:/Android/android-sdk-windows/tools/proguard/lib" />
181 
182    <target name="init" >
183 
184        <echo>
185Initializing all output directories...
186        </echo>
187 
188        <delete dir="${outdir-bin}" />
189 
190        <mkdir dir="${outdir-bin}" />
191 
192        <mkdir dir="${outdir-classes}" />
193    </target>
194 
195    <!-- 根据工程中的资源文件生成R.java文件 -->
196 
197    <target
198        name="gen-R"
199        depends="init" >
200 
201        <echo>
202Generating R.java from the resources...
203        </echo>
204 
205        <exec
206            executable="${aapt}"
207            failonerror="true" >
208 
209            <arg value="package" />
210 
211            <arg value="-f" />
212 
213            <arg value="-m" />
214 
215            <arg value="-J" />
216 
217            <arg value="${outdir-gen}" />
218 
219            <arg value="-S" />
220 
221            <arg value="${resource-dir}" />
222 
223            <arg value="-M" />
224 
225            <arg value="${manifest-xml}" />
226 
227            <arg value="-I" />
228 
229            <arg value="${android-jar}" />
230        </exec>
231    </target>
232    <!-- 编译aidl文件 -->
233 
234    <target
235        name="aidl"
236        depends="gen-R" >
237 
238        <echo>
239Compiling .aidl into java files...
240        </echo>
241 
242        <apply
243            executable="${aidl}"
244            failonerror="true" >
245 
246            <!-- 指定预处理文件 -->
247 
248            <arg value="-p${framework-aidl}" />
249            <!-- aidl声明的目录 -->
250 
251            <arg value="-I${srcdir}" />
252            <!-- 目标文件目录 -->
253 
254            <arg value="-o${outdir-gen}" />
255            <!-- 指定哪些文件需要编译 -->
256 
257            <fileset dir="${srcdir}" >
258 
259                <include name="**/*.aidl" />
260            </fileset>
261        </apply>
262    </target>
263 
264    <!-- 将工程中的java源文件编译成class文件 -->
265 
266    <target
267        name="compile"
268        depends="aidl" >
269 
270        <echo>
271Compiling java source code...
272        </echo>
273 
274        <javac
275            bootclasspath="${android-jar}"
276            destdir="${outdir-classes}"
277            encoding="utf-8"
278            srcdir="."
279            target="1.5" >
280 
281            <classpath>
282 
283                <fileset
284                    dir="${external-lib}"
285                    includes="*.jar" />
286 
287                <filelist>
288 
289                    <file name="${android-maps-jar}" />
290                </filelist>
291            </classpath>
292        </javac>
293    </target>
294 
295    <!-- 混淆代码 -->
296 
297    <target
298        name="proguard"
299        depends="compile" >
300     <echo>
301        Proguad ....
302        </echo>
303        <jar
304            basedir="${outdir-classes}"
305            destfile="temp.jar" />
306 
307        <java
308            failonerror="true"
309            fork="true"
310            jar="${proguard-home}/proguard.jar" >
311 
312            <jvmarg value="-Dmaximum.inlined.code.length=32" />
313 
314            <arg value="-injars temp.jar" />
315 
316            <arg value="-outjars optimized.jar" />
317 
318            <arg value="-libraryjars ${android-jar}" />
319 
320            <arg value="-dontpreverify" />
321 
322            <arg value="-dontoptimize" />
323 
324            <arg value="-dontusemixedcaseclassnames" />
325 
326            <arg value="-repackageclasses &apos;&apos;" />
327 
328            <arg value="-allowaccessmodification" />
329 
330            <!-- 混淆配置的引用 -->
331             
332            <arg value="@proguard-project.txt"/> 
333           
334 
335        </java>
336 
337        <delete file="temp.jar" />
338 
339        <delete dir="${outdir-classes}" />
340 
341        <mkdir dir="${outdir-classes}" />
342 
343        <unzip
344            dest="${outdir-classes}"
345            src="optimized.jar" />
346 
347        <delete file="optimized.jar" />
348    </target>
349 
350    <!-- 将.class文件转化成.dex文件 -->
351 
352    <target
353        name="dex"
354        depends="proguard" >
355 
356        <echo>
357Converting compiled files and external libraries into a .dex file...
358        </echo>
359 
360        <exec
361            executable="${dx}"
362            failonerror="true" >
363 
364            <arg value="--dex" />
365            <!-- 输出文件 -->
366 
367            <arg value="--output=${dex-ospath}" />
368            <!-- 要生成.dex文件的源classes和libraries -->
369 
370            <arg value="${outdir-classes-ospath}" />
371 
372            <arg value="${external-lib-ospath}" />
373        </exec>
374    </target>
375 
376    <!-- 将资源文件放进输出目录 -->
377 
378    <target name="package-res-and-assets" >
379 
380        <echo>
381Packaging resources and assets...
382        </echo>
383 
384        <exec
385            executable="${aapt}"
386            failonerror="true" >
387 
388            <arg value="package" />
389 
390            <arg value="-f" />
391 
392            <arg value="-M" />
393 
394            <arg value="${manifest-xml}" />
395 
396            <arg value="-S" />
397 
398            <arg value="${resource-dir}" />
399 
400            <arg value="-A" />
401 
402            <arg value="${asset-dir}" />
403 
404            <arg value="-I" />
405 
406            <arg value="${android-jar}" />
407 
408            <arg value="-F" />
409 
410            <arg value="${resources-package}" />
411        </exec>
412    </target>
413 
414    <!-- 打包成未签证的apk -->
415 
416    <target
417        name="package"
418        depends="dex, package-res-and-assets" >
419 
420        <echo>
421Packaging unsigned apk for release...
422        </echo>
423 
424        <exec
425            executable="${apkbuilder}"
426            failonerror="true" >
427 
428            <arg value="${out-unsigned-package-ospath}" />
429 
430            <arg value="-u" />
431 
432            <arg value="-z" />
433 
434            <arg value="${resources-package-ospath}" />
435 
436            <arg value="-f" />
437 
438            <arg value="${dex-ospath}" />
439 
440            <arg value="-rf" />
441 
442            <arg value="${srcdir-ospath}" />
443        </exec>
444 
445        <echo>
446It will need to be signed with jarsigner before being published.
447        </echo>
448    </target>
449 
450    <!-- 对apk进行签证 -->
451 
452    <target
453        name="jarsigner"
454        depends="package" >
455 
456        <echo>
457Packaging signed apk for release...
458        </echo>
459 
460        <exec
461            executable="${jarsigner}"
462            failonerror="true" >
463 
464            <arg value="-keystore" />
465 
466            <arg value="${keystore-file}" />
467 
468            <arg value="-storepass" />
469 
470            <arg value="123456" />
471 
472            <arg value="-keypass" />
473 
474            <arg value="123456" />
475 
476            <arg value="-signedjar" />
477 
478            <arg value="${out-signed-package-ospath}" />
479 
480            <arg value="${out-unsigned-package-ospath}" />
481            <!-- 不要忘了证书的别名 -->
482 
483            <arg value="blockcheng" />
484        </exec>
485    </target>
486 
487    <!-- 发布 -->
488 
489    <target
490        name="release"
491        depends="jarsigner" >
492 
493        <!-- 删除未签证apk -->
494 
495        <echo>
496            delete unsigned apk
497        </echo>
498        <delete file="${out-unsigned-package-ospath}" />
499        <echo>
500            copy apk from ${out-signed-package-ospath} to D:/workspaceAndroid/Release/happyShopping.apk
501        </echo>
502        <copy
503            file="${out-signed-package-ospath}"
504            tofile="D:/workspaceAndroid/Release/happyShopping.apk" />
505        <echo>
506            clean the workspace bin folder....
507        </echo>
508        <delete dir="${outdir-classes}"/> 
509        <delete file="${dex-ospath}" /> 
510        <delete file="${resources-package-ospath}" /> 
511        <delete file="${outdir-bin}" /> 
512        <echo>
513        </echo>
514    </target>
515      
516</project>
如果不需要混淆代码,去掉上面的 proguard相关的配置就可以了

五、配置proguard属性:

proguard-project.txt

001# To enable ProGuard in your project, edit project.properties
002# to define the proguard.config property as described in that file.
003#
004# Add project specific ProGuard rules here.
005# By default, the flags in this file are appended to flags specified
006# in ${sdk.dir}/tools/proguard/proguard-android.txt
007# You can edit the include path and order by changing the ProGuard
008# include property in project.properties.
009#
010# For more details, see
011#   http://developer.android.com/guide/developing/tools/proguard.html
012 
013# Add any project specific keep options here:
014 
015# If your project uses WebView with JS, uncomment the following
016# and specify the fully qualified class name to the JavaScript interface
017# class:
018#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
019#   public *;
020#}
021-optimizationpasses 5
022-dontusemixedcaseclassnames
023-dontskipnonpubliclibraryclasses
024-dontskipnonpubliclibraryclassmembers
025-dontskipnonpubliclibraryclasses
026-dontpreverify
027 
028 
029-libraryjars libs/android-support-v4.jar
030-libraryjars libs/core.jar
031 
032-verbose
033-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
034 
035-dontwarn android.support.v4.**
036 
037-keep class android.support.v4.app.** { *; }
038 
039-keep interface android.support.v4.app.** { *; }
040 
041-keep class com.actionbarsherlock.** { *; }
042 
043-keep interface com.actionbarsherlock.** { *; }
044 
045-keepattributes *Annotation*
046 
047-keep public class * extends android.app.Activity
048 
049-keep public class * extends android.support.v4.app.Fragment
050 
051-keep public class * extends android.support.v4.app.FragmentActivity
052 
053-keep public class * extends android.app.Application
054 
055 
056-keep public class * extends android.app.Service
057 
058-keep public class * extends android.content.BroadcastReceiver
059 
060-keep public class * extends android.content.ContentProvider
061 
062-keep public class * extends android.app.backup.BackupAgentHelper
063 
064-keep public class * extends android.preference.Preference
065 
066-keep public class * extends blockcheng.BssicAct
067 
068-keep public class * extends blockcheng.controller.BCFragment
069 
070-keep public class com.android.vending.licensing.ILicensingService
071 
072-keepclasseswithmembernames class * {
073native <methods>;
074}
075 
076-keepclasseswithmembers class * {
077 public <init>(android.content.Context, android.util.AttributeSet);
078 }
079  
080-keepclasseswithmembers class * {
081public <init>(android.content.Context, android.util.AttributeSet, int);
082}
083 
084-keepclassmembers class * extends android.app.Activity {
085               public void *(android.view.View);
086}
087 
088-keepclassmembers enum * {
089                public static **[] values();
090                public static ** valueOf(java.lang.String);
091}
092 
093-keepclassmembers class * {
094               public <init>(org.json.JSONObject);
095}
096 
097-keep public class blockcheng.R$*{
098                public static final int *;
099}
100 
101-keep public class blockcheng.controller.BlockchengClass.JavaScriptInterface {
102                 public <methods>;
103}
104 
105-keepnames class blockcheng.controller.BlockchengClass$* {
106                public <fields>;
107                public <methods>;
108}
109 
110-keepnames class blockcheng.controller.BlockchengClass$* {
111                public <fields>;
112                public void showContacts();
113}

上面的配置中,blockcheng、BC等开头的类,都是被我替换的,不是真实的,具体的类包名和类名,以各人自己的为主。

注意,这个混淆中,开始几行配置很重要,网上很多同学问的ant、proguard相关的错误(什么找不到app.android.v4类等),都是因为缺少这几行导致,但没人回答,这里,我就直接给出了:


01-libraryjars libs/android-support-v4.jar
02-libraryjars libs/core.jar
03 
04-verbose
05-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
06 
07-dontwarn android.support.v4.**
08 
09-keep class android.support.v4.app.** { *; }
10 
11-keep interface android.support.v4.app.** { *; }
12 
13-keep class com.actionbarsherlock.** { *; }
14 
15-keep interface com.actionbarsherlock.** { *; }
16 
17-keepattributes *Annotation*
18 
19-keep public class * extends android.app.Activity
20 
21-keep public class * extends android.support.v4.app.Fragment
22 
23-keep public class * extends android.support.v4.app.FragmentActivity

这个配置主要是针对 android-support.v4和库相关的,请需要的同学注意。

最后的几行配置,是因为我代码中调用了asset中js文件导致的,js相关的操作代码,是不可以混淆的,故需要避开。


六、运行ant命令,构建开始:

命令行输入类似: D:/Android/apache-ant-1.9.2/bin/ant.bat -buildfile D:/workspa
ceAndroid/naomiHappyShopping/build.xml

就可以完成代码混淆和apk输出:

01.......
02release:
03     [echo]
04     [echo]                 delete unsigned apk
05     [echo]
06   [delete] Deleting: D:\workspaceAndroid\naomiHappyShopping\bin\HappyShoppingAn
07t-unsigned.apk
08     [echo]
09     [echo]                 copy apk from D:\workspaceAndroid\naomiHappyShopping
10/bin/HappyShoppingAnt.apk to D:/workspaceAndroid/Release/happyShopping.apk
11     [echo]
12     [copy] Copying 1 file to D:\workspaceAndroid\Release
13     [echo]
14     [echo]                 clean the workspace bin folder....
15     [echo]
16   [delete] Deleting directory D:\workspaceAndroid\naomiHappyShopping\bin
17     [echo]
18     [echo]
19 
20BUILD SUCCESSFUL
21Total time: 41 seconds
看看时间,是不是比手动方便多了啊,而且反编译一看,代码真的不能再读了。

另外注意:不同人的路径等配置,需要根据各人自己的来,不能直接拷贝引用。

转自 :
http://my.oschina.net/chengliqun/blog/158820
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值