How do I add APKs in an AOSP build?
Asked Answered
H

4

48

I need to add some 3rd party APKs to my AOSP build. What folder should I keep these APKs so that when I build the code and the image is created, it is installed in the emulator?

It looks like the system apps are kept in the packages/app folder so I need to know where the third party APKs are kept.

Himelman answered 14/5, 2012 at 8:29 Comment(1)
Possible duplicate of Add prebuilt APKs to Android AOSP system.imgRevengeful
L
70

Adding third party APKs to the build is definitely possible.

Also APKs and APPs with source code go to the same place; the package/app folder.

Adding a new APK to the build

In the AOSP root add the folder:

<aosp root>/package/app/< yourappfolder >

Then inside this folder add:

  • empty Android.mk
  • < yourapp.apk >

The android make file should have the reference to your apk, add this to your Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE := < your app folder name >

LOCAL_CERTIFICATE := < desired key >

LOCAL_SRC_FILES := < app apk filename >

LOCAL_MODULE_CLASS := APPS

LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)

Create an entry in the commons.mk (from AOSP 8.1.0 onwards it is called core.mk, and is usually found in build/target/product) for your apk add the line (check where all the others are)

PRODUCT_PACKAGES += < what you have defined in LOCAL_MODULE, it should be your app folder name >

Compile the AOSP and you have a brand new app installed on the system.

Notes

  • If your APK is already signed, use the special value PRESIGNED as value for LOCAL_CERTIFICATE
  • If you want your APK to end up in the /data/app/ directory, add the line LOCAL_MODULE_PATH := $(TARGET_OUT_DATA) before the line include $(BUILD_PREBUILT)
Lumbricoid answered 22/11, 2013 at 5:25 Comment(12)
Thank you. I was growing tired of all the ROM kitchen posts I see.Sketchy
@Tiago: what will be LOCAL_CERTIFICATE := < desired key >. could you please clear this.Scutcheon
Sorry for the delay, also sorry for the mess here, but the reply formatting is not working. The core Android platform uses four keys to maintain security of core platform components: 1. platform: a key for packages that are part of the core platform. 2. shared: a key for things that are shared in the home/contacts process. 3. media: a key for packages that are part of the media/download system. 4. releasekey: the default key to sign with if not otherwise specified. See here: kandroid.org/online-pdk/guide/release_keys.htmlLumbricoid
@TiagoCosta Do you know what you have to add to do the same thing for a system privileged app? That is one that should be in system/priv-app? I've posted a question #32997733Irrupt
Is is possible to install multiple apk in given dir this way? Not knowing the apk names. Lets say we change apks in the dir often, and we want to copy all of them to out dir.Haar
Does the LOCAL_CERTIFICATE mean the APK should be unsigned?Scarify
@TiagoCosta And what should I do to add root permission to that APK?Kyungkyushu
@Scutcheon apparently you can also use the presigned value: groups.google.com/forum/#!topic/android-building/i4oaJ2DtadMRevengeful
what determines the path to the APK when built?Kodok
AOSP 8.1.0 - There is no common.mk file, do I manually create this?Ringler
@Ringler use core.mkKarate
ninja: error: 'packages/apps/DoorUnit/doorunit', needed by 'out/target/product/pico_imx8mm/obj/APPS/DoorUnit_intermediates/package.apk', missing and no known rule to make itKatey
S
12

The Android.mk presented above will install the APK in /system/app

If you wish to install the APK in /data/app you will need to add the following the line to Android.mk before line include $(BUILD_PREBUILT)

LOCAL_MODULE_PATH := $(TARGET_OUT_DATA)
Scheller answered 30/11, 2015 at 12:2 Comment(1)
This was missing from the accepted answer, and completes the questionCarlenacarlene
P
5

You could also do the following in the target output dir:

<path-to-your-build-dir>/host/linux-x86/bin/simg2img system.img temp.img
mkdir system_root
sudo mount -t ext4 -o loop temp.img system_root

At this point you can make whatever changes you'd like to the files in system_root, i.e. adding apks to system/app etc...

When you're done just go back down to the output dir and do:

sudo umount system_root
<path-to-your-build-dir>/host/linux-x86/bin/img2simg temp.img system.img

You can now flash system.img using fastboot as usual.

Permanent answered 26/1, 2013 at 17:33 Comment(1)
That's a lot closer, but not quite an answer to the specific question asked as this method is a post-build modification to the image rather than a way to have the build process include the apps. Still, it could at least be scripted.Scribe
K
1

Follow the first answer to make the apk and Android.mk file and place it where it is supposed to. But now there is no core.mk file in build/target/product but it has been renamed to handheld_product.mk So, add your app's folder name there.

Kamasutra answered 23/12, 2020 at 4:22 Comment(1)
When I do this, the app doesn't appear to be installed when I run the build in the emulator. Why?Sort

© 2022 - 2024 — McMap. All rights reserved.