Android笔记34:命令行打包编译.apk 包含第三方.jar 的方法

转载 2012年03月28日 18:59:05

Android笔记34:命令行打包编译.apk 包含第三方.jar 的方法     **中秋节真是个假期~,从凌晨1点直接睡到下午3点,睡了14个小时累积的疲劳一扫而空脑袋也好使了..
之前受托研究个挺好玩的项目..细节不说了,我在实现的时候卡在怎样脱离eclipse而能将项目源码编译成.apk上
发现网上有现成答案的,参考了以下这篇
http://jojol-zhou.iteye.com/blog/729254
虽然原作者是针对较早期的 Android 1.5(API-3)写的,但原理和用法相同。
用到的路径和工具包括(容我偷个懒直接把部分的批处理内容直接cp出来了):
SET WORK_SPACE=E:\code\autopack_demo
SET PKG_PATH=com\xxx\apk\autopack_demo
SET JAVA_SPACE=D:\Progra~2\Java\jdk1.6.0_21\bin
SET ANDROID_SPACE=E:\android-sdk-windows
SET JAVAC=%JAVA_SPACE%\javac.exe
SET AAPT=%ANDROID_SPACE%\platform-tools\aapt.exe
SET DX=%ANDROID_SPACE%\platform-tools\dx.bat
REM 输出的路径
SET OUT_FOLDER=...
SET OUT_CLASS_FOLDER=...
依葫芦画瓢写批处理试运行,发现卡在一个问题上:项目中部分的功能模块引用了第三方的 jar 里的类
在编译的时候报错, 
javac 时凡事引用到jar的类的地方都报出了 class not found 之类的错误
gen/R.java 里也提对象不匹配 还有一大堆的东西
按着错误提示一个一个来解决,按照打包的流程
1. 先解决生成 R.java 这个环节
这里预先我把第三方的3rd.jar复制到了项目文件夹的 lib/ 下,然后再批处理里定义为
-------------------------------------------------------------------------------------------
SET THIRD_JAR=%WORK_SPACE%\lib\3rd.jar
REM 以下这行命令生成 R.java
%AAPT% package -m -J %GEN_FOLDER% -M %WORK_SPACE%\AndroidManifest.xml -S %RESOURCE_FOLDER% -I %ANDROID_JAR% -I % THIRD_JAR%
-------------------------------------------------------------------------------------------
在命令最后加上了 -I % THIRD_JAR%,这样有关 R.java 的报错消失了
2. javac 的错误提示..这里是把 .java 编译成 .class 提示找不到第三方的包
那么在原命令行略作修改 最后添加上 -classpath %THIRD_JAR% 这个引用参数,问题解决


再编译没有报错,把其他资源文件也打包进apk最后加上签名~生成了apk,好像成功咯
安装到手机里,运行,程序崩溃了... Android笔记34:命令行打包编译.apk 包含第三方.jar 的方法 - 恶 - 早衰男的巢
看DDMS 输出地日志~~ 问题还是在于第三方的类..not found ... 呃,不是已经编译通过了吗
回头看看那个apk文件,的确太小.. 没有包含那个jar 
做逆向研究... 看看从eclipse 编译出来的apk(104kb)和我打包出来的(26kb)到底差别在哪里...
把apk文件当做zip解压~看见尺寸的差异在于 classes.dex 这个文件
!原来问题在这里...
生成dex文件是用 %DX% 查了下 % DX% --help 用法,找到了解决问题的最后一步
3. 输出dex时把第三方的jar包含在内
在 dx --help里说的很明白了:
-------------------------------------------------------------------------------------------
E:\android\android-sdk-windows\platform-tools>dx --help
usage:
  dx --dex [--debug] [--verbose] [--positions=<style>] [--no-locals]
  [--no-optimize] [--statistics] [--[no-]optimize-list=<file>] [--no-strict]
  [--keep-classes] [--output=<file>] [--dump-to=<file>] [--dump-width=<n>]
  [--dump-method=<name>[*]] [--verbose-dump] [--no-files] [--core-library]
  [--num-threads=<n>] [<file>.class | <file>.{zip,jar,apk} | <directory>] ...
    Convert a set of classfiles into a dex file, optionally embedded in a
    jar/zip. Output name must end with one of: .dex .jar .zip .apk. Positions
    options: none, important, lines.
  dx --annotool --annotation=<class> [--element=<element types>]
  [--print=<print types>]
  dx --dump [--debug] [--strict] [--bytes] [--optimize]
  [--basic-blocks | --rop-blocks | --ssa-blocks | --dot] [--ssa-step=<step>]
  [--width=<n>] [<file>.class | <file>.txt] ...
    Dump classfiles, or transformations thereof, in a human-oriented format.
  dx --junit [-wait] <TestClass>
    Run the indicated unit test.
  dx -J<option> ... <arguments, in one of the above forms>
    Pass VM-specific options to the virtual machine that runs dx.
  dx --version
    Print the version of this tool (1.6).
  dx --help
-------------------------------------------------------------------------------------------
在原先写的 dx 指令最后加上 jar的完整路径 也就是 %THIRD_JAR% 就ok了
%DX% --dex --output=%OUT_FOLDER%\classes.dex %OUT_CLASS_FOLDER% %THIRD_JAR%

再把编译打包签名的顺序重新做一遍~生成的apk运行一切正常!
或许不是个什么大不了值得做笔记的一个专题,只是老衲java底子如此脆弱不堪..
但之前数天在 度娘、谷哥、有盗和有病 四个知名包打听都寻遍了皆一无所获
在技术论坛发帖提问也纯引来围观无人能解
我想不通是这个问题真的不值一提还是国内的编程开发风气已经浮躁到量产我这种白菜的地步..但愿不是后者。

Android打包,如何打包时不包含依赖包

Android打包,如何打包时不包含依赖包
  • u011216417
  • u011216417
  • 2017年04月08日 11:16
  • 942

Android 自动编译、打包生成apk文件 1 - 命令行方式

一、搭建搭建环境 1. 安装JDK 和 Android SDK 2. 配置环境变量 D:\android-sdk-windows\tools C:\Program Files\Java\jdk1....
  • love_world_
  • love_world_
  • 2013年09月02日 20:47
  • 19386

手把手教你纯命令行打包apk

手把手教你--》纯命令行打包apk
  • xiaochuanding
  • xiaochuanding
  • 2016年05月22日 11:20
  • 2672

Android开发中,取消打包某个jar包到APK中

开发中会遇到,引入一个jar包,只想编译的时候能通过,打包APK时不需要把该jar一起打包进去,因为可能在别的地方也有这个jar包,比如在插件开发过程中。宿主工程host里面使用了这个jar包,插件工...
  • anhenzhufeng
  • anhenzhufeng
  • 2017年06月27日 21:08
  • 577

eclipse打包含有第三方jar库的jar包

Java写了这么久第一次导出jar在linux上运行,以前都是导出war包,昨天因为需要就导出一个jar按照以前的做法导出的结果一直出问题,原来是第三方jar的问题,在网上找了好久一直出错,说是用ec...
  • u013372441
  • u013372441
  • 2016年09月11日 11:25
  • 7762

在mac上使用gradle命令行打包apk

首先配置环境变量,使用vim进行配置。配置adb变量和gradle变量 配置adb变量 1、adb:找到android sdk的本地路径, adb命令在platform-tool下面;打开终端,输入...
  • gao1009375713
  • gao1009375713
  • 2016年11月14日 14:05
  • 831

Android studio使用插件和命令行两种方式打包APK

参考:1、http://my.oschina.net/aibenben/blog/370577?fromerr=dqH2e4wK             2、http://my.oschina.ne...
  • muzhengjun
  • muzhengjun
  • 2016年06月02日 17:12
  • 4204

android源码编译apk集成第三方so库

一般编译android应用,生成apk,有以下几个方法:     1.传统的在eclipse平台下编译生成apk,这种情况下,需要指定android sdk,通过eclipse编译生成apk,编译的...
  • tianyeming
  • tianyeming
  • 2015年08月13日 16:39
  • 4905

Android Studio通过Gradle命令来编译生成打包APK

博文首发地址:http://www.aplesson.com/?p=999 有的时候我们在Github或者其他地方看到好的开源Android Studio结构的项目,我们想要看到运行效果,所以需...
  • jay100500
  • jay100500
  • 2016年03月15日 17:14
  • 2756

Android 命令行手动编译打包详解

原文出处:http://blog.csdn.net/yangwen123/article/details/8909058 Android SDK提供了一系列命令行工具,用来进行Android应用...
  • hlllmr1314
  • hlllmr1314
  • 2016年08月16日 12:59
  • 2448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android笔记34:命令行打包编译.apk 包含第三方.jar 的方法
举报原因:
原因补充:

(最多只允许输入30个字)