编译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

例:

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

[html]  view plain copy
  1. LOCAL_PATH:= $(call my-dir)  
  2. include $(CLEAR_VARS)  
  3. LOCAL_MODULE_TAGS :optional  
  4. LOCAL_SRC_FILES := $(call all-java-files-under, src)  
  5. LOCAL_SDK_VERSION :current  
  6. LOCAL_PACKAGE_NAME :bright-yinjk  
  7. LOCAL_CERTIFICATE :platform  
  8. include $(BUILD_PACKAGE)  
  9. 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 文件

[java]  view plain copy
  1. ifeq "" "$(DEFAULT_APP_TARGET_SDK)"  
  2. # This is the default minSdkVersion and targetSdkVersion to use for  
  3. # all .apks created by the build system.  It can be overridden by explicitly  
  4. # setting these in the .apk's AndroidManifest.xml.  It is either the code  
  5. # name of the development build or, if this is a release build, the official  
  6. # SDK version of this release.  
  7. ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"  
  8.     DEFAULT_APP_TARGET_SDK := $(PLATFORM_SDK_VERSION)  
  9. else  
  10.     DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)  
  11. endif  
  12. endif  
将DEFAULT_APP_TARGET_SDK直接赋值相应的API等级即可,

或者 把 

[html]  view plain copy
  1. ifeq "REL" "$(PLATFORM_VERSION_CODENAME)"  
  2.    DEFAULT_APP_TARGET_SDK := $(PLATFORM_SDK_VERSION)  
  3. else  
  4.    DEFAULT_APP_TARGET_SDK := $(PLATFORM_VERSION_CODENAME)  
  5. 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源码下的apk)