zoukankan      html  css  js  c++  java
  • android 打包 第三方jar

    引用:http://snmoney.blog.163.com/blog/static/440058201181011468397/

    发现网上有现成答案的,参考了以下这篇
    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%

  • 相关阅读:
    4408: [Fjoi 2016]神秘数
    UOJ #35. 后缀排序[后缀数组详细整理]
    POJ 2887 Big String
    搜索过滤grep(win下为findstr)
    解决putty自动断开的问题
    > >> 将错误输出到文件
    环境变量
    端口被占用,查看并杀死占用端口的进程
    查找文件路径find
    【vim使用】
  • 原文地址:https://www.cnblogs.com/sode/p/2329991.html
Copyright © 2011-2022 走看看