有些时候,我们写的 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文件,默认生成的不可独立安装运行。
注意:
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指定的名称