每日推荐 相册和视频app是最常见的app之一,任何一个安卓设备上都能看到。是否好奇过它们是如何实现的呢?LeafPic是你可以尝试和学习的最佳开源相册程序之一。 它非常简单,容易理解,适合任何一个初级开发者。从这个app中我发现的最好的东西就是它实现动态主题的方式。这可是许多开发者费劲千辛万苦想要做好的东西。
介绍来自泡网:
本文作者 本文由ChuckChenLw投稿。 ChuckChenLw的博客地址: http://blog.csdn.net/chenkai19920410
所以我们在使用IDE自动编译打包Apk时,也应该知道Apk是怎么一步步由我们项目中的Java文件,资源文件等变成我们所熟知的Apk的。 不管使用什么IDE,Android打包生成Apk主要都是由以下几步完成:
以上即为主要的步骤。盗用一张官方经典的打包流程图
如果看懂了这张图,那么基本上就算理解了Apk的打包过程。这里需要用到好几个sdk提供的工具,为了方便可以将sdk/build-tools路径添加到环境变量中。
为了能够清楚的看到每一步我们生成了结果,可以在项目app/src/main下建几个目录:
接下来我们就先看第一步生成R.java文件。 R.java对于Android开发同学,肯定非常熟悉,它是一个非常重要的一个类,并且它是自动生成的,主要是包含了res目录下所有资源的ID,我们可以在程序中通过它来获取资源ID,然后通过Android Api来获取具体的资源。
R.java是由SDK中提供的aapt(sdk/build-tools/ 中对应的版本下,本文使用的25.0.0,那么具体的路径就是sdk/build-tools/25.0.0)工具生成的。 aapt是非常重要的工具,它不仅可以生成R.java,还能将res下除assets目录外其他的目录下普通的xml文件编译成二进制xml文件,并将这些文件打包成初始包。 如果了解过插件化,相比都知道插件化有一个非常重要的问题就是如何保证宿主程序和插件程序的资源ID不会冲突,其中有一种思路就是通过修改aapt源码来修改资源ID的PP段来保证资源ID不冲突。 具体可以参考插件化开源项目ACDD (https://github.com/bunnyblue/ACDD) 或者携程的DynamicAPK (https://github.com/CtripMobile/DynamicAPK)。 关于aapt源码分析可以参考罗升阳老师的文章 http://blog.csdn.net/luoshengyang/article/details/8744683。 这里只讲解使用aapt工具生成R.java。 在Android Studio中切换到terminal(如果使用终端也是可以的,可以将当前路径切换到实验项目的根路径下)中。 输入以下命令: 参数的含义如下:
如果提示没有aapt命令,请检查一下aapt环境变量,或者直接通过绝对路径引用。 如果没有问题,那么在gen文件下会生成相应的R.java文件。 我们在使用aidl时一般是先创建一个**Inte**ce.aidl文件,然后IDE会自动的帮我们生成一个**Inte**ce.java文件,其实IDE也是通过sdk提供的aidl工具实现的。 为了方便演示,我在main目录下创建一个aidl文件夹,里边新建一个IMyAidlInte**ce.aidl文件。 然后就可以使用aidl工具来编译了,该工具同aapt路径一样。使用如下命令进行编译:
注意这里的-I和”app/src”中间没有空格,否则无法成功运行,[无奈], 可以参考How do I use AIDL tool from command line using SDK sample code?
成功后会在.aidl目录下生成java文件,当然你也可以通过-o指定java文件的生成路径。 如果没有aidl文件可以跳过这一步。 这一步其实就是使用jdk的javac将项目中所有的java文件编译成class文件。
-source 1.7 -target 1.7:指定编译的jdk版本,如果不指定的话,会报错。 接下来需要把生成的class文件打包生成dex文件。
dex文件是Android虚拟机可运行文件,可以使用dx工具生成。 具体如下:
dx工具会将上一步app/src/main/build/中生成的class文件全部打包,得到classes.dex,apk包中包含的classes.dex就是这样生成的,当然实际项目可能类会很多,但是过程是一样的。
有了classes.dex,开始要打包apk了,我们先将资源文件做成初始包 apk包中的资源文件都是经过编译过的,是二进制文件。我们还是使用aapt工具:
将AndroidManifest.xml与res目录除了assets目录以为的文件进行编译,生成resource.arsc和若干二进制的xml文件。 资源ID和资源文件的对应关系都是在resource.arsc中的。这些文件都会被打包到res.apk中。 接下来的任务就是将classes.dex文件打进apk中,这样就可以得到没有签名的apk。 以前可以直接使用apkbuilder工具直接打包,但是目前sdk将该工具移除了,不过没有关系,我们可以自己生成一个,也可以直接使用apkbuilder的实现类,该类是sdk/tools/lib/sdklib.jar文件中的 com.android.sdklib.build.ApkBuilderMain。 为了方便我们可以生成一个apkbuilder,将当前目录切换到sdk的tools目录下,执行以下命令: |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|