asysbang

 找回密码
 立即注册
查看: 6784|回复: 2
打印 上一主题 下一主题

手动编译APK

[复制链接]

510

主题

2

好友

6311

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2013-4-25 16:51:11 |只看该作者 |倒序浏览
转载请注明:www.asysbang.com

根据工作任务的不同,常用的编译方式有以下几种:EclipseAnt、命令行、Makefile等。

无论使用哪种编译方式,其中编译的实际内容是一致的,可以参看官方文档:
http://developer.android.com/tools/building/index.html


通过android-sdk提供的工具来编译应用程序,这种编译方式虽然不实用,但是能够让开发者更深入的了解android应用程序的编译工程,进而跟好的了解android系统的编译过程。

详细的编译过程如图





下面来实际操作一下
首先,写一个Hello World的程序,目录结构如图


<1>首先编译生成R.java

make gen
aapt p -m -J gen -S res -I /home/android/android-sdk-linux/platforms/android-14/android.jar -M AndroidManifest.xml
执行上面2条命令之后,目录结构如


<2>接下来编译java文件生成class文件
mkdir -p bin/classes
javac -encoding GB18030 -bootclasspath /home/android/android-sdk-linux/platforms/android-14/android.jar -d bin/classes src/com/manual/build/*.java gen/com/manual/build/R.java

执行上面2条命令之后,目录结构如图

<3>class文件转换成Dalvik可以运行的dex文件
dx --dex --output bin/classes.dex bin/classes/
转换之后目录结构如图

<4>编译其它资源(AndroidManifest.xmlres目录下的布局和图片等)
aapt p -F bin/resources.ap -S res -I /home/android/android-sdk-linux/platforms/android-14/android.jar -M AndroidManifest.xml
编译之后目录结构如图



<5>打包生成APK文件
apkbuilder bin/ManualBuild.apk -v -u -z bin/resources.ap -f bin/classes.dex -rf src
执行之后,在bin目录下生成了 ManualBuild.apk,不过这个apk暂时还不能用,如果安装的话会提示没有签名。
<6>签名
jarsigner -keystore ~/.android/debug.keystore -storepass android -keypass android bin/ManualBuild.apk androiddebugkey
签名之后这个apk文件就可以运行了,但是建议做下优化
<7>优化
zipalign 4 ManualBuild.apk Tem.apk




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

回复

使用道具 举报

510

主题

2

好友

6311

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

沙发
发表于 2013-11-6 10:56:00 |只看该作者
============android aidl  start=======


android aidl

引用:http://www.devdiv.com/thread-66219-1-1.html

之前写过一篇文章“[Android]使用命令行打APK包”,里面没有涉及到aidl,现Sodino补充aidl的使用方法。

aidl的使用帮助如下:

    C:\Documents and Settings\Administrator>aidl
    INPUT required
    usage: aidl OPTIONS INPUT [OUTPUT]
           aidl --preprocess OUTPUT INPUT...
    OPTIONS:
       -I<DIR>    search path for import statements.
       -d<FILE>   generate dependency file.
       -p<FILE>   file created by --preprocess to import.
       -o<FOLDER> base output folder for generated files.
       -b         fail when trying to compile a parcelable.
    INPUT:
       An aidl interface file.
    OUTPUT:
       The generated interface files.
       If omitted and the -o option is not used, the input filename is used, with th
    e .aidl extension changed to a .java extension.
       If the -o option is used, the generated files will be placed in the base outp
    ut folder, under their package folder

复制代码

这些信息太少了,还不能让人明白如何使用。帮助信息首句就是“INPUT required”,其实只有"INPUT"仍是不够的,OPTIONS中“-I”是必选而非可选,否则会提示:

    D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl:19: couldn't find import for class com.example.android.apis.app.IRemoteServiceCallback

复制代码

以SDK自带的ApiDemos为实践对象,该工程存储路径为:"D:\JavaTest\ApiDemos\",有三个aidl文件分别为:
com\example\android\apis\app\IRemoteService.aidl
com\example\android\apis\app\IRemoteServiceCallback.aidl
com\example\android\apis\app\ISecondary.aidl

要生成对应的.java文件命令行如下:

    aidl -ID:\JavaTest\ApiDemos\src  D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl

复制代码

对,你没看错,"-I"与"D:\JavaTest\***"之间是没有空格的。XX,看来Google里也有相当混蛋的程序员。
执行此条命令后,生成的.java会与.aidl文件在同一目录下。
如果想指定aidl的生成路径,则可以按照aidl的提示信息使用"-o"选项:

    aidl -ID:\JavaTest\ApiDemos\src  -oD:\JavaTest D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl

复制代码

对,你还是没看错,"-o"与"D:\JavaTest\**"中间还是没有空格,再次咒骂设计了aidl工具的那个混蛋。
执行此命令后,则生成的aidl文件存于"D:\JavaTest\"路径下了。
在ApiDemos中,IRemoteService.aidl与IRemoteServiceCallback.aidl是互相依赖的,在编译IRemoteService.aidl时,通过使用"-d"可以将其依赖的相关类输出到自定义的文件中。

    aidl -ID:\JavaTest\ApiDemos\src  -oD:\JavaTest  -dD:\JavaTest\aidl_dependency.txt D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl

复制代码

生成的aidl_dependenry.txt内容如下:

    : \
      D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl \
      D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteServiceCallback.aidl

复制代码

可选项中"-b"的用法不详,帮助信息中的那句“fail when trying to compile a parcelable.”就感觉少说了些内容,"fail"然后干嘛,XX,第三次咒骂设计了aidl工具的那个混蛋。
帮助信息中还有“aidl --preprocess OUTPUT INPUT...”,作用是根据要编译的.aidl生成预处理文件,但具体预处理起到什么,还请知道的兄弟姐妹们告诉我下啊,谢谢。
仍以ApiDemos为例,生成预处理文件为aidl.preprocess:

    aidl --preprocess D:\JavaTest\aidl.preprocess D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteServiceCallback.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\ISecondary.aidl

复制代码

生成的aidl.preprocess内容如下:

    interface com.example.android.apis.app.IRemoteService;
    interface com.example.android.apis.app.IRemoteServiceCallback;
    interface com.example.android.apis.app.ISecondary;

复制代码

SDK自带了预处理文件为<sdk_path>\platforms\android-<level>\framework.aidl。
“-p”表示编译aidl时以预处理文件为参去生成.java,命令方法如下:

    aidl -ID:\JavaTest\ApiDemos\src  -pE:\SoftSetup\AndroidSDK\android_sdk_r08_windows\platforms\android-3\framework.aidl D:\JavaTest\ApiDemos\src\com\example\android\apis\app\IRemoteService.aidl

复制代码

而通过查看adt的源码可以发现,adt编译aidl使用的正是系统自带的预处理文件framewrok.aidl。
adt源码处理aidl的文件为:<OpenSourceProjectPath>\sdk\eclipse\plugins\com.android.ide.eclipse.adt\src\com\android\ide\eclipse\adt\internal\build\PreCompilerBuilder.java,其中的handleAidl()即为编译aidl的执行方法。
======android aidl end=============
回复

使用道具 举报

510

主题

2

好友

6311

积分

管理员

Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

最佳新人 活跃会员 热心会员 推广达人 宣传达人 灌水之王 突出贡献 优秀版主 荣誉管理 论坛元老

板凳
发表于 2013-11-6 10:56:39 |只看该作者
编译多个第三方jar

javac -classpath /opt/hadoop-0.20.203.0/hadoop-core-0.20.203.0.jar -Djava.ext.dirs=/opt/hadoop-0.20.203.0/lib -d wordcount_classes WordCount.java
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

Archiver|手机版|aSys-帮 ( 京ICP备13033689号 )

GMT+8, 2024-7-2 02:29 , Processed in 0.063443 second(s), 20 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部