浅谈Android的资源编译过程
由于直接粘贴复制原因,故直接上传文档至此
转载请注明出处
一.APK的结构以及生成
APK是Android Package的缩写,即Android application package文件或Android安装包。每个要安装到Android平台的应用都要被编译打包为一个单独的文件,扩展名为 .apk。APK文件是用编译器编译生成的文件包,其中包含了应用的二进制代码、资源、配置文件等。通过将APK文件直接传到Android手机中执行即可安装。APK文件其实就是zip格式,但其扩展名被改为apk。在这里我们为了详细讲述Android应用程序我们将创建一个永恒的话题, 它就是HelloWorld
程序,在这里我们创建的Android的HelloWorld程序的目录结构如下所示:
一个典型的APK文件通常由下列内容组成:
AndroidManifest.xml 程序全局配置文件
classes.dex Dalvik字节码
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:
package com.example.helloworldactivity;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private final static String TAG = "MainActivity";
private TextView mTextView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView)findViewById(R.id.text_view);
Button showButton = (Button)findViewById(R.id.button);
showButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mTextView.setText(R.string.hello_world);
}
});
}
}
res/layout/activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/show" />
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
res/values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">HelloWorldActivity</string>
<string name="action_settings">Settings</string>
<string name="show">Show</string>
<string name="hello_world">Hello world!</string>
</resources>
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworldactivity"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.helloworldactivity.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
补充:移动开发 , Android ,