본문 바로가기

안드로이드

안드로이드 내장 APKs 개발방법(초안)


아래의 내용은 안드로이드에 이미 내장된 Application들(APKs)을
Android SDK와 Eclipse 개발환경에서 개발하기 위한 방법입니다.
추후 좀 더 섬세하게 정리하는 것으로 하고, 일단 간단하게 요약해 봅니다.
 
1. 안드로이드 full source를 받아서 빌드한다.
 
2. 1. 에서 빌드된 system.img, userdata.img, ramdisk.img를 사용해서 Android Virtual Divice를 새로 빌드한다.
 
3. 1. 에서 만들어진 아래의 classes.jar를 sdk가 설치된 host 컴퓨터로 가져온다.
----
./out/target/common/obj/APPS/Mms_intermediates/classes.jar
./out/target/common/obj/APPS/ContactsProvider_intermediates/classes.jar
./out/target/common/obj/APPS/SoundRecorder_intermediates/classes.jar
./out/target/common/obj/APPS/Development_intermediates/classes.jar
./out/target/common/obj/APPS/Gallery_intermediates/classes.jar
./out/target/common/obj/APPS/SpareParts_intermediates/classes.jar
./out/target/common/obj/APPS/CalendarProvider_intermediates/classes.jar
./out/target/common/obj/APPS/MediaProvider_intermediates/classes.jar
./out/target/common/obj/APPS/SkeletonApp_intermediates/classes.jar
./out/target/common/obj/APPS/ApiDemos_intermediates/classes.jar
./out/target/common/obj/APPS/VpnServices_intermediates/classes.jar
./out/target/common/obj/APPS/Browser_intermediates/classes.jar
./out/target/common/obj/APPS/Camera_intermediates/classes.jar
./out/target/common/obj/APPS/TtsService_intermediates/classes.jar
./out/target/common/obj/APPS/AccountAndSyncSettings_intermediates/classes.jar
./out/target/common/obj/APPS/DrmProvider_intermediates/classes.jar
./out/target/common/obj/APPS/CtsTestStubs_intermediates/classes.jar
./out/target/common/obj/APPS/Term_intermediates/classes.jar
./out/target/common/obj/APPS/SettingsProvider_intermediates/classes.jar
./out/target/common/obj/APPS/GoogleSearch_intermediates/classes.jar
./out/target/common/obj/APPS/CertInstaller_intermediates/classes.jar
./out/target/common/obj/APPS/ImfTest_intermediates/classes.jar
./out/target/common/obj/APPS/Phone_intermediates/classes.jar
./out/target/common/obj/APPS/Snake_intermediates/classes.jar
./out/target/common/obj/APPS/PackageInstaller_intermediates/classes.jar
./out/target/common/obj/APPS/HelloActivity_intermediates/classes.jar
./out/target/common/obj/APPS/SignatureTest_intermediates/classes.jar
./out/target/common/obj/APPS/GoogleContactsProvider_intermediates/classes.jar
./out/target/common/obj/APPS/SmokeTestApp_intermediates/classes.jar
./out/target/common/obj/APPS/UserDictionaryProvider_intermediates/classes.jar
./out/target/common/obj/APPS/Launcher_intermediates/classes.jar
./out/target/common/obj/APPS/TelephonyProvider_intermediates/classes.jar
./out/target/common/obj/APPS/Email_intermediates/classes.jar
./out/target/common/obj/APPS/Music_intermediates/classes.jar
./out/target/common/obj/APPS/FrameworkTest_intermediates/classes.jar
./out/target/common/obj/APPS/Settings_intermediates/classes.jar
./out/target/common/obj/APPS/GlobalSearch_intermediates/classes.jar
./out/target/common/obj/APPS/NotePad_intermediates/classes.jar
./out/target/common/obj/APPS/Calculator_intermediates/classes.jar
./out/target/common/obj/APPS/DownloadProvider_intermediates/classes.jar
./out/target/common/obj/APPS/Bluetooth_intermediates/classes.jar
./out/target/common/obj/APPS/LatinIME_intermediates/classes.jar
./out/target/common/obj/APPS/AlarmClock_intermediates/classes.jar
./out/target/common/obj/APPS/PicoTts_intermediates/classes.jar
./out/target/common/obj/APPS/LunarLander_intermediates/classes.jar
./out/target/common/obj/APPS/Contacts_intermediates/classes.jar
./out/target/common/obj/APPS/Calendar_intermediates/classes.jar
./out/target/common/obj/APPS/HTMLViewer_intermediates/classes.jar
./out/target/common/obj/APPS/ApplicationsProvider_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/com.android.inputmethod.pinyin.lib_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/monkey_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android.policy_phone_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/input_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/pm_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/services_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android.cts.refapp_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/ext_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/framework-tests_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/javax.obex_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android.cts.dpi_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android.policy_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/am_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/svc_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/android.test.runner_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/com.example.android.platform_library_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/bmgr_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/ime_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
----
 

4. 더불어 안드로이드 full source에 있는 변경하고자 하는 package소스도 sdk가 있는 host 컴퓨터로 가져온다.
 
5. Eclipse에서 변경하고자 하는 pakage를 로드한다.
 
6. 위에서 가져온 classes.jar를 Eclipse에서 add-library를 통해 user lib로 추가한다.
    기본적으로 아래의 두개 classes.jar를 추가한후, 필요하면 더 위의 list중에서 몇개를 더 추가한다.
-----
./out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
./out/target/common/obj/JAVA_LIBRARIES/core_intermediates/classes.jar
-----
   더불어 일부 패키지의 경우엔 추가적으로 아래의 jar파일을 static 하게 링크한다.
-----
./out/target/common/obj/JAVA_LIBRARIES/libgoogleclient_intermediates/javalib.jar
./out/target/common/obj/JAVA_LIBRARIES/google-framework_intermediates/javalib.jar
./out/target/common/obj/JAVA_LIBRARIES/googlelogin-client_intermediates/javalib.jar
------ 위의 3개의 jar에 대한 빌드전 소스코드상의 위치---
   ./frameworks/opt/com.google.android/framework.jar
   ./frameworks/opt/com.google.android.googlelogin/client.jar
   ./external/googleclient/googleclient-lib.jar
 
Eclipse에서 Project 추가하여 Build 시

Conversion to Dalvik format failed: Unable to execute dex: null

위와 같은 Error Message가 나오면서 Build 완료가 안 되는 경우가 있습니다.

일단 원인은 JVM의 Heap size 문제로 보이며

해결 방법은 eclipse.ini에서 heap size를 키워주는 방법(xms, xms 값)이 있으나 제 경우엔 이렇게 해도 해결이 되지 않았습니다.

일단 Project에 추가된 External jars 때문에 위 문제가 발생할 수도 있음을 알게 되어

Add external jars 메뉴 대신 Add library에서 User library 생성하여 추가 하였더니

문제 없이 빌드 완료 되네요.

7. Eclipse Java Build Path의 Order and Export에서 6. 에서 추가한 classes.jar를 우선적으로 참조하게 한다.
 
8. Apk 빌드시 Export Unsigned Application Package로 빌드한다.
 
9. 다음과 같이 이미 설치된 Apk를 uninstall한다.
-----
> adb shell
> mount -o rw,remount -t yaffs2 /dev/block/mtdblock0 /system
> rm /system/app/<apk_filename>
> pm uninstall <package_name>
 
10. 8. 에서 만들었던 Unsigned Application Package에 다음과 같은 방식으로 Signing을 한다.
     아래에서 사용된 signapk.jar와 testkey.x509.pem, testkey.pk8은 안드로이드 full source내에 있습니다.
---
SIGNAPK_JAR=$TOP/out/host/linux-x86/framework/signapk.jar
PRIVATE_CERTIFICATE=$TOP/target/product/security/testkey.x509.pem
PRIVATE_PRIVATE_KEY=$TOP/target/product/security/testkey.pk8

java -jar $SIGNAPK_JAR $PRIVATE_CERTIFICATE $PRIVATE_PRIVATE_KEY (your)-unsigned.apk (your)-singed.apk

ex).
> cd eclair
> java -jar ./out/host/linux-x86/framework/signapk.jar 
       ./build/target/product/security/testkey.x509.pem 
       ./build/target/product/security/testkey.pk8
      (your)-unsigned.apk  (your)-singed.apk 
 
11. 10. 에서 만들어진 Apk를 install한 후, 실행해 본다.
----
> adb install (your)-signed.apk





 
ex) Launcher Package의 경우엔, 아래와 같은 절차로 uninstall, install을 하시면 될 듯 합니다.
 
- uninstall
 
> adb shell
> rm /system/app/Launcher.apk
> pm uninstall com.android.launcher
 
- install
 
> adb install Launcher.apk
> adb shell
> kill <android.process.acore_pid>