有些时候,我们写的 AP 需要获取系统的一些权限,比如获取联系人信息,Mail 信息等等,就需要在 android 源码下编译APK,让 AP 与系统源码具有一样的签名。
1、Linux系统注册 -mm、 -mmm等命令
用 gedit 打开~/.bashrc 文件,加入source [源码目录]/build/envsetup.sh,重启命令终端。
2、修改 AndroidManifest.xml(非必须,除非AP需要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)
#生成的APK名称
LOCAL_PACKAGE_NAME := Wifi_Test1
#libname这个名字可以自己定。注意这里的修改!!加了libname2
LOCAL_STATIC_JAVA_LIBRARIES := libname libname2
#静态 .so lib库
LOCAL_JNI_SHARED_LIBRARIES := libtest
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
#libname必须与上面自己定义的名称一致,needimport.jar是你需要导入的第三方jar包.注意这里的修改!!
#加了libname2:lib/needimport2.jar
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libname:lib/needimport.jar libname2:lib/needimport2.jar
include $(BUILD_MULTI_PREBUILT)
注意:对于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、编译hdpi
android4.0的源码编译时lunch选择full-eng默认编译mdpi的apk,如果要编译hdpi,需要在./build/target/product/full.mk文件中添加:
PRODUCT_AAPT_CONFIG := normal hdpi
PRODUCT_AAPT_PREF_CONFIG := hdpi
5、 push apk 到模拟器
a).获得模拟器写权限
启动模拟器时添加参数 -partition-size
emulator -avd avdname -partition-size 256
./adb remount
b).把模拟器中/system/app下要push的apk对应的odex文件删除