平台及環境設置

平台

實驗平台:Nexus 5
Android版本:android-4.4_r1
前置知識: [Howto Build Android KitKat (4.4) for the Google Nexus 5][6]

環境設置

在AOSP資料夾中

1
2
source build/envsetup.sh
lunch aosp_hammerhead-userdebug

目標:利用Android Studio來新增APP (命名為World)

在上一篇文章中,說明了如何copy一份已有的project來改寫。但是寫Android App有許多煩雜的地方,有時候還是需要IDE來幫助比較快,這裡找了一個比較tricky的方法來使用IDE。

新增Android Studio Project

我們直接從Android Studio中產生一個空的project,命名為World
新增project時記得選empty Activity,之後比較好做。
Alt Text

在剛剛產生出來的Android Project路徑底下,World/app/src/main應該有java、res資料夾,以及AndroidManifest.xml
AOSP/packages/apps建立新目錄World,並在其底下建立起上述3個檔案之軟連結(soft link)

1
2
3
4
mkdir $ANDROID_BUILD_TOP/packages/apps/World && cd $_
ln -s AndroidProject目錄/World/app/src/main/java  java
ln -s AndroidProject目錄/World/app/src/main/res  res
ln -s AndroidProject目錄/World/app/src/main/AndroidManifest.xml  AndroidManifest.xml

撰寫Android.mk

參考Secrets of Android.mk此份文件當中的Building a simple APK目錄。將其加到AOSP/packages/apps/World資料夾下。

Android.mk

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)

  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)

  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage

  # Tell it to build an APK
  include $(BUILD_PACKAGE)

修改掉所有appcompat的部份

再來使用mmAOSP/packages/apps/World進行編譯,運氣不好的話,編譯會出現找不到某些命名的錯誤。這是因為Google為了讓各種app看起來更有一致性,將Android Studio的新Project皆使用Appcompat此library來協調視覺效果。可是此library並不存在於預設的編譯環境當中。為了為了節省麻煩,將其去掉。

style.xml

1
2
3
4
5
6
7
8
<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

</resources>

並把MainActivity中可能會用ActionBarActivity或是AppCompatActivity來替代Activity,請一律換成Activity來使用。

MainActivity.java

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.android.world;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

最後,我在編譯途中還遇到標籤問題。預設的編譯環境似乎不允許著無命名的字串存在。也就是說,如果你有任何的text標籤是直接給予字串值的,可能會編譯失敗。

修改前

1
2
3
4
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
		android:text="Hello World" />

可能要改將字串引用自string.xml才能編譯成功。

修改後

1
2
3
4
<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
		android:text="@string/app_name" />

res/values/string.xml

1
2
3
<resources>
    <string name="app_name">World</string>
</resources>

編譯

使用mm進行編譯,此次應該可以順利通過了。
之後直接在Android Studio裡對Application進行編輯,由於建立了軟連結,AOSP內部的內容也會同步更改。
這樣就可以用Android Studio來撰寫APP囉。

Reference