一,准备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" ?> |
008 | < property environment = "env" /> |
013 | value = "${ant.project.name}" /> |
018 | value = "${env.ANDROID_SDK_HOME}" /> |
022 | name = "sdk-platform-folder" |
023 | value = "${sdk-folder}/platforms/android-16" /> |
028 | value = "${sdk-folder}/tools" /> |
032 | name = "sdk-platform-tools" |
033 | value = "${sdk-folder}/platform-tools" /> |
039 | value = "${sdk-platform-tools}/aapt" /> |
043 | value = "${sdk-platform-tools}/aidl" /> |
047 | value = "${sdk-platform-tools}/dx.bat" /> |
051 | value = "${sdk-tools}/apkbuilder.bat" /> |
055 | value = "${env.JAVA_HOME}/bin/jarsigner" /> |
061 | value = "${sdk-platform-folder}/android.jar" /> |
064 | name = "android-maps-jar" |
065 | value = "${sdk-folder}/add-ons/addon_google_apis_google_inc_8/libs/maps.jar" /> |
070 | name = "framework-aidl" |
071 | value = "${sdk-platform-folder}/framework.aidl" /> |
088 | value = "AndroidManifest.xml" /> |
106 | value = "${basedir}/${srcdir}" /> |
114 | name = "external-lib-ospath" |
115 | value = "${basedir}/${external-lib}" /> |
120 | name = "outdir-classes" |
121 | value = "${outdir-bin}" /> |
124 | name = "outdir-classes-ospath" |
125 | value = "${basedir}/${outdir-classes}" /> |
131 | value = "classes.dex" /> |
135 | value = "${outdir-bin}/${dex-file}" /> |
139 | value = "${basedir}/${dex-path}" /> |
144 | name = "resources-package" |
145 | value = "${outdir-bin}/resources.ap_" /> |
148 | name = "resources-package-ospath" |
149 | value = "${basedir}/${resources-package}" /> |
154 | name = "out-unsigned-package" |
155 | value = "${outdir-bin}/${appName}-unsigned.apk" /> |
158 | name = "out-unsigned-package-ospath" |
159 | value = "${basedir}/${out-unsigned-package}" /> |
165 | value = "${basedir}/naomi" /> |
170 | name = "out-signed-package" |
171 | value = "${outdir-bin}/${appName}.apk" /> |
174 | name = "out-signed-package-ospath" |
175 | value = "${basedir}/${out-signed-package}" /> |
180 | value = "D:/Android/android-sdk-windows/tools/proguard/lib" /> |
182 | < target name = "init" > |
185 | Initializing all output directories... |
188 | < delete dir = "${outdir-bin}" /> |
190 | < mkdir dir = "${outdir-bin}" /> |
192 | < mkdir dir = "${outdir-classes}" /> |
202 | Generating R.java from the resources... |
209 | < arg value = "package" /> |
217 | < arg value = "${outdir-gen}" /> |
221 | < arg value = "${resource-dir}" /> |
225 | < arg value = "${manifest-xml}" /> |
229 | < arg value = "${android-jar}" /> |
239 | Compiling .aidl into java files... |
248 | < arg value = "-p${framework-aidl}" /> |
251 | < arg value = "-I${srcdir}" /> |
254 | < arg value = "-o${outdir-gen}" /> |
257 | < fileset dir = "${srcdir}" > |
259 | < include name = "**/*.aidl" /> |
271 | Compiling java source code... |
275 | bootclasspath = "${android-jar}" |
276 | destdir = "${outdir-classes}" |
284 | dir = "${external-lib}" |
289 | < file name = "${android-maps-jar}" /> |
304 | basedir = "${outdir-classes}" |
305 | destfile = "temp.jar" /> |
310 | jar = "${proguard-home}/proguard.jar" > |
312 | < jvmarg value = "-Dmaximum.inlined.code.length=32" /> |
314 | < arg value = "-injars temp.jar" /> |
316 | < arg value = "-outjars optimized.jar" /> |
318 | < arg value = "-libraryjars ${android-jar}" /> |
320 | < arg value = "-dontpreverify" /> |
322 | < arg value = "-dontoptimize" /> |
324 | < arg value = "-dontusemixedcaseclassnames" /> |
326 | < arg value = "-repackageclasses ''" /> |
328 | < arg value = "-allowaccessmodification" /> |
332 | < arg value = "@proguard-project.txt" /> |
337 | < delete file = "temp.jar" /> |
339 | < delete dir = "${outdir-classes}" /> |
341 | < mkdir dir = "${outdir-classes}" /> |
344 | dest = "${outdir-classes}" |
345 | src = "optimized.jar" /> |
347 | < delete file = "optimized.jar" /> |
357 | Converting compiled files and external libraries into a .dex file... |
364 | < arg value = "--dex" /> |
367 | < arg value = "--output=${dex-ospath}" /> |
370 | < arg value = "${outdir-classes-ospath}" /> |
372 | < arg value = "${external-lib-ospath}" /> |
378 | < target name = "package-res-and-assets" > |
381 | Packaging resources and assets... |
388 | < arg value = "package" /> |
394 | < arg value = "${manifest-xml}" /> |
398 | < arg value = "${resource-dir}" /> |
402 | < arg value = "${asset-dir}" /> |
406 | < arg value = "${android-jar}" /> |
410 | < arg value = "${resources-package}" /> |
418 | depends = "dex, package-res-and-assets" > |
421 | Packaging unsigned apk for release... |
425 | executable = "${apkbuilder}" |
428 | < arg value = "${out-unsigned-package-ospath}" /> |
434 | < arg value = "${resources-package-ospath}" /> |
438 | < arg value = "${dex-ospath}" /> |
442 | < arg value = "${srcdir-ospath}" /> |
446 | It will need to be signed with jarsigner before being published. |
457 | Packaging signed apk for release... |
461 | executable = "${jarsigner}" |
464 | < arg value = "-keystore" /> |
466 | < arg value = "${keystore-file}" /> |
468 | < arg value = "-storepass" /> |
470 | < arg value = "123456" /> |
472 | < arg value = "-keypass" /> |
474 | < arg value = "123456" /> |
476 | < arg value = "-signedjar" /> |
478 | < arg value = "${out-signed-package-ospath}" /> |
480 | < arg value = "${out-unsigned-package-ospath}" /> |
483 | < arg value = "blockcheng" /> |
491 | depends = "jarsigner" > |
498 | < delete file = "${out-unsigned-package-ospath}" /> |
500 | copy apk from ${out-signed-package-ospath} to D:/workspaceAndroid/Release/happyShopping.apk |
503 | file = "${out-signed-package-ospath}" |
504 | tofile = "D:/workspaceAndroid/Release/happyShopping.apk" /> |
506 | clean the workspace bin folder.... |
508 | < delete dir = "${outdir-classes}" /> |
509 | < delete file = "${dex-ospath}" /> |
510 | < delete file = "${resources-package-ospath}" /> |
511 | < delete file = "${outdir-bin}" /> |
如果不需要混淆代码,去掉上面的 proguard相关的配置就可以了
五、配置proguard属性:
proguard-project.txt
022 | -dontusemixedcaseclassnames |
023 | -dontskipnonpubliclibraryclasses |
024 | -dontskipnonpubliclibraryclassmembers |
025 | -dontskipnonpubliclibraryclasses |
029 | -libraryjars libs/android-support-v4.jar |
030 | -libraryjars libs/core.jar |
033 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* |
035 | -dontwarn android.support.v4.** |
037 | -keep class android.support.v4.app.** { *; } |
039 | -keep interface android.support.v4.app.** { *; } |
041 | -keep class com.actionbarsherlock.** { *; } |
043 | -keep interface com.actionbarsherlock.** { *; } |
045 | -keepattributes *Annotation* |
047 | -keep public class * extends android.app.Activity |
049 | -keep public class * extends android.support.v4.app.Fragment |
051 | -keep public class * extends android.support.v4.app.FragmentActivity |
053 | -keep public class * extends android.app.Application |
056 | -keep public class * extends android.app.Service |
058 | -keep public class * extends android.content.BroadcastReceiver |
060 | -keep public class * extends android.content.ContentProvider |
062 | -keep public class * extends android.app.backup.BackupAgentHelper |
064 | -keep public class * extends android.preference.Preference |
066 | -keep public class * extends blockcheng.BssicAct |
068 | -keep public class * extends blockcheng.controller.BCFragment |
070 | -keep public class com.android.vending.licensing.ILicensingService |
072 | -keepclasseswithmembernames class * { |
076 | -keepclasseswithmembers class * { |
077 | public <init>(android.content.Context, android.util.AttributeSet); |
080 | -keepclasseswithmembers class * { |
081 | public <init>(android.content.Context, android.util.AttributeSet, int); |
084 | -keepclassmembers class * extends android.app.Activity { |
085 | public void *(android.view.View); |
088 | -keepclassmembers enum * { |
089 | public static **[] values(); |
090 | public static ** valueOf(java.lang.String); |
093 | -keepclassmembers class * { |
094 | public <init>(org.json.JSONObject); |
097 | -keep public class blockcheng.R$*{ |
098 | public static final int *; |
101 | -keep public class blockcheng.controller.BlockchengClass.JavaScriptInterface { |
105 | -keepnames class blockcheng.controller.BlockchengClass$* { |
110 | -keepnames class blockcheng.controller.BlockchengClass$* { |
112 | public void showContacts(); |
上面的配置中,blockcheng、BC等开头的类,都是被我替换的,不是真实的,具体的类包名和类名,以各人自己的为主。
注意,这个混淆中,开始几行配置很重要,网上很多同学问的ant、proguard相关的错误(什么找不到app.android.v4类等),都是因为缺少这几行导致,但没人回答,这里,我就直接给出了:
01 | -libraryjars libs/android-support-v4.jar |
02 | -libraryjars libs/core.jar |
05 | -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* |
07 | -dontwarn android.support.v4.** |
09 | -keep class android.support.v4.app.** { *; } |
11 | -keep interface android.support.v4.app.** { *; } |
13 | -keep class com.actionbarsherlock.** { *; } |
15 | -keep interface com.actionbarsherlock.** { *; } |
17 | -keepattributes *Annotation* |
19 | -keep public class * extends android.app.Activity |
21 | -keep public class * extends android.support.v4.app.Fragment |
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输出:
04 | [ echo ] delete unsigned apk |
06 | [delete] Deleting: D:\workspaceAndroid\naomiHappyShopping\bin\HappyShoppingAn |
09 | [ echo ] copy apk from D:\workspaceAndroid\naomiHappyShopping |
10 | /bin/HappyShoppingAnt.apk to D:/workspaceAndroid/Release/happyShopping.apk |
12 | [copy] Copying 1 file to D:\workspaceAndroid\Release |
14 | [ echo ] clean the workspace bin folder.... |
16 | [delete] Deleting directory D:\workspaceAndroid\naomiHappyShopping\bin |
看看时间,是不是比手动方便多了啊,而且反编译一看,代码真的不能再读了。
另外注意:不同人的路径等配置,需要根据各人自己的来,不能直接拷贝引用。
转自 :
http://my.oschina.net/chengliqun/blog/158820