Android 源码下编译APK

       有些时候,我们写的 app 需要获取系统的一些权限,比如获取联系人信息,Mail 信息等等,就需要在 android 源码下编译APK,让app与系统源码具有一样的签名。

1、在源码目录下运行$ . build/envsetup.sh 目的是使mm/mmm命令可用

2、修改 AndroidManifest.xml(非必须,除非app需要system ID) 添加: android:sharedUserId="android.uid.system" ---与系统一样 userID

例:

<manifest xmlns:Android="http://schemas.android.com/apk/res/android"
      package="com.wpstar.Wifi_Test1"
      android:versionCode="1"
      android:sharedUserId="android.uid.system"
      android:versionName="1.0">
    <uses-sdk Android:minSdkVersion="8" />
3、工程目录拷贝到:[源码目录]/packages/apps/  在其中添加Android.mk文件,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_SDK_VERSION := current
LOCAL_PACKAGE_NAME := bright-yinjk
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
include $(call all-makefiles-under,$(LOCAL_PATH))
注意:对于4.0ics 以上编译 apk 需要加入 WITH_DEXPREOPT := false 或者 LOCAL_DEX_PREOPT := false 才能编译生成APK文件,默认生成的不可独立安装运行。
4、cd [源码目录]/packages/apps/ 下自己的工程目录,直接 -mm 命令就可以了,在 [源码目录]/out//target/product/generic/system/app 下就可以看到编译生成的APK文件。

注意:

1、必须保证 android 源码已经 make 过了。

2、对于 apk 安装出现 Failure [INSTALL_FAILED_OLDER_SDK]

打开[源码目录]/build/core/version_defaults.mk 文件

ifeq "" "$(DEFAULT_APP_TARGET_SDK)"
# This is the default minSdkVersion and targetSdkVersion to use for
# all .apks created by the build system.  It can be overridden by explicitly
# setting these in the .apk's AndroidManifest.xml.  It is either the code
# name of the development build or, if this is a release build, the official
# SDK version of this release.
ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
    DEFAULT_APP_TARGET_SDK := $(PLATFORM_SDK_VERSION)
else
    DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)
endif
endif
将DEFAULT_APP_TARGET_SDK直接赋值相应的API等级即可,

或者 把 

ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"
   DEFAULT_APP_TARGET_SDK := $(PLATFORM_SDK_VERSION)
else
   DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)
endif

注释即可。

3、对于包含.so文件的工程,编译的Android.mk文件中 LOCAL_MODULE := lib[.so文件名] 而非 NDK 编译中的 LOCAL_MODULE := [.so文件名]。

4、对于我编译的sdk,如果需要在模拟器启动完成后,就已经安装了该应用那么还需要在该目录下添加如下编译脚本:

[源码根目录]/vendor/xxxvendor/build/product/xxx_sdk.mk文件中添加如下内容:

PRODUCT_PACKAGES += \
    com.tencent.qqpinyin \
    bright-yinjk //既Anroid.mk文件中 LOCAL_PACKAGE_NAME指定的名称


你可能感兴趣的:(android,Module,System,Build,Path,include)