安卓系统的资源编译

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

安卓的资源编译过程一.APK的结构以及生成APK是AndroidPackage的缩写,即Androidapplicationpackage文件或Android安装包。每个要安装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为.apk。APK文件是用编译器编译生成的文件包,其中包含了应用的二进制代码、资源、配置文件等。通过将APK文件直接传到Android手机中执行即可安装。APK文件其实就是zip格式,但其扩展名被改为apk。在这里我们为了详细讲述Android应用程序我们将创建一个永恒的话题,它就是HelloWorld程序,在这里我们创建的Android的HelloWorld程序的目录结构如下所示:一个典型的APK文件通常由下列内容组成:AndroidManifest.xml程序全局配置文件classes.dexDalvik字节码resources.arsc资源索引表,解压缩resources.ap_就能看到res\该目录存放资源文件(图片,文本,xml布局)assets\该目录可以存放一些配置文件src\java源码文件libs\存放应用程序所依赖的库gen\编译器根据资源文件生成的java文件bin\由编译器生成的apk文件和各种依赖的资源META-INF\该目录下存放的是签名信息首先来看一下使用Java语言编写的Android应用程序从源码到安装包的整个过程,示意图如下,其中包含编译、链接和签名等:(1).使用aapt工具将资源文件生成R.java文件,resources.arsc和打包资源文件(2).使用aidl工具将.aidl文件编译成.java文件(3).使用javac工具将.java文件编译成.class文件(4).使用dx脚本将众多.class文件转换成一个.dex文件(5).使用apkbuilder脚本将资源文件和.dex文件生成未签名的apk安装文件(6).使用jdk中的jarsigner对apk安装文件进行签名上述工具都保存在android-sdk-linux中的tools/和platform-tools文件夹下面.范例:src/com.example.helloworldactivity:packagecom.example.helloworldactivity;importandroid.app.Activity;importandroid.os.Bundle;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;publicclassMainActivityextendsActivity{privatefinalstaticStringTAG=MainActivity;privateTextViewmTextView=null;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mTextView=(TextView)findViewById(R.id.text_view);ButtonshowButton=(Button)findViewById(R.id.button);showButton.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){mTextView.setText(R.string.hello_world);}});}}res/layout/activity_main.xml:LinearLayoutxmlns:android=:tools=:orientation=verticalandroid:layout_width=match_parentandroid:layout_height=match_parentButtonandroid:id=@+id/buttonandroid:layout_width=match_parentandroid:layout_height=wrap_contentandroid:text=@string/show/TextViewandroid:id=@+id/text_viewandroid:layout_width=match_parentandroid:layout_height=wrap_contentandroid:text=//LinearLayoutres/values/strings.xml:?xmlversion=1.0encoding=utf-8?resourcesstringname=app_nameHelloWorldActivity/stringstringname=action_settingsSettings/stringstringname=showShow/stringstringname=hello_worldHelloworld!/string/resourcesAndroidManifest.xml:?xmlversion=1.0encoding=utf-8?manifestxmlns:android==com.example.helloworldactivityandroid:versionCode=1android:versionName=1.0uses-sdkandroid:minSdkVersion=8android:targetSdkVersion=17/applicationandroid:allowBackup=trueandroid:icon=@drawable/ic_launcherandroid:label=@string/app_nameandroid:theme=@style/AppThemeactivityandroid:name=com.example.helloworldactivity.MainActivityandroid:label=@string/app_nameintent-filteractionandroid:name=android.intent.action.MAIN/categoryandroid:name=android.intent.category.LAUNCHER//intent-filter/activity/application/manifest我们前面创建的HelloWorldActivity应用程序资源目录结构如下所示:project接下来,我们在HelloWorldActivity工程目录下可以使用aapt命令:aaptp-f-m-Jmygen/-Sres/-I~/tool/android-sdk-linux/platforms/android-17/android.jar-Aassets/-MAndroidManifest.xml-Fhelloworldresources.apk在mygen目录下生成一个资源ID文件R.java和在当前目录下生成一个名为helloworldresources.apk的资源包,解压缩里面内容如下所示:被打包的APK资源文件中包含有:资源索引表文件resources.arsc,AndroidManifest.xml二进制文件和res目录下的应用程序图片资源及layout目录下的二进制activity_main.xml文件,res目录下信息如下所示:注意:res/values目录下的字符串信息被编译进了resources.arsc资源索引文件中,而在R.java文件中仅仅保存了资源ID信息.R.java信息如下所示:packagecom.example.helloworldactivity;publicfinalclassR{publicstaticfinalclassattr{}publicstaticfinalclassdimen{publicstaticfinalintactivity_horizontal_margin=0x7f040000;publicstaticfinalintactivity_vertical_margin=0x7f040001;}publicstaticfinalclassdrawable{publicstaticfinalintic_launcher=0x7f020000;}publicstaticfinalclassid{publicstaticfinalintbutton=0x7f070000;publicstaticfinalinttext_view=0x7f070001;}publicstaticfinalclasslayout{publicstaticfinalintactivity_main=0x7f030000;}publicstaticfinalclassstring{publicstaticfinalintaction_settings=0x7f050001;publicstaticfinalintapp_name=0x7f050000;publicstaticfinalinthello_world=0x7f050003;publicstaticfinalintshow=0x7f050002;}publicstaticfinalclassstyle{publicstaticfinalintAppBaseTheme=0x7f060000;publicstaticfinalintAppTheme=0x7f060001;}}下面我们根据分析appt的源码详细讲述命令:aaptp-f-m-Jmygen/-Sres/-I~/tool/android-sdk-linux/platforms/android-17/android.jar-Aassets/-MAndroidManifest.xml-Fhelloworldresources.apk是如何将上述应用程序资源编译生成一个R.java文件,资源索引表文件resources.arsc,AndroidManifest.xml二进制文件和res目录下的应用程序图片资源及layout目录下的二进制activity_main.xml文件的.appt入口函数main具体实现如下所示:路径:frameworks/base/tools/aapt/Main.cppintmain(intargc,char*constargv[]){char*prog=argv[0];Bundlebundle;//定义一个Bundle类存储appt命令的各种编译选项boolwantUsage=false;intresult=1;//pessimisticallyassumeanerror.inttolerance=0;/*defaulttocompression**设置默认的压缩标准*/bundle.setCompressionMethod(ZipEntry::kCompressDeflated);if(argc2){wantUsage=true;gotobail;}if(argv[1][0]=='v')bundle.setCommand(kCommandVersion)

1 / 177
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功