基于Android源码编译系统应用

1. 引言      

      最近实验室项目需要集成一个Android系统重启的功能,于是上网查询了一下如何通过代码实现Android系统重启,代码都很简单(可参考我的另一篇博文:代码实现Android系统重启),但是运行时却报了一个“Permission Denied”的错误,再调研发现,原来Android对开发者保留了一些系统权限,这些权限只能被属于系统用户组的应用调用(为了便于描述,我且将属于系统用户组的应用称为“系统应用”)于是,我决定把实验室项目改造成为Android系统应用。

2. 实现思路

      网上关于“如何编译Android系统应用”的方法主要有两种:

      1). 将项目做为一个模块,放入到Android源码的特定位置,然后执行mm进行模块编译

      2). 通过IDE生成apk文件,然后使用目标系统的platform密钥来给apk文件签名

        由于手头有现成的Android源码,且第2种方法感觉稍显繁琐,所以我选用了第一种方法:基于Android源码来编译系统应用

3. 实现过程

        1) 在项目根目录下添加 Android.mk 文件

        Android.mk文件用于配置编译参数,这样可以让系统按照你的需求来编译项目。关于Android.mk的语法和基本使用,我就不再赘述了,读者可以自行Google之。

       下面是我本次编译的配置代码及相关说明:       

#指定模块目录,"call my-dir"表示Android.mk所在的当前目录
LOCAL_PATH:= $(call my-dir)
#清除本次编译环境下,可能由其他模块设置的全局变量,避免冲突
include $(CLEAR_VARS)
#模块标签,标签类型包括debug、eng、user、optional等,optional为默认标签
LOCAL_MODULE_TAGS := optional
#该值设置为flase,表示不需要进行odex优化
WITH_DEXPREOPT := false
#声明本项目用到的第三方库名(可以任意命名,只需与下方LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES保持呼应即可),多个库之间用空格分开
LOCAL_STATIC_JAVA_LIBRARIES := android.support.v4 com.jakewharton.disklrucache com.google.gson com.android.volley
#指定模块中的源代码路径,"call all-subdir-java-files"表示模块目录下(包括其下子目录)所有的java文件
LOCAL_SRC_FILES := $(call all-subdir-java-files)
#要编译生成的APK名称
LOCAL_PACKAGE_NAME := metaos
#模块签名,有4种:testkey(默认值,普通APK)、platform(系统APK)、shared和media
LOCAL_CERTIFICATE := platform
#该命令表示要将模块编译成APK文件
include $(BUILD_PACKAGE)

#对于每个第三方库,需要单独编译成模块,所以需要重新清除变量
include $(CLEAR_VARS)
#形式为"库名:库所在路径",路径从模块目录开始写
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android.support.v4:/libs/android-support-v4.jar com.jakewharton.disklrucache:/libs/disklrucache-2.0.1.jar com.google.gson:/libs/gson-2.2.4.jar com.android.volley:/libs/volley.jar
#编译第三方库
include $(BUILD_MULTI_PREBUILT)

       2) 配置项目的 AndroidManifest.xml 文件

      首先,必须要在配置文件的manifest标签中添加 android:sharedUserId="android.uid.system"属性,用于标记当前项目为系统应用。然后,我们需要对项目要使用的系统权限进行注册,以系统重启为例,我们需要注册 <uses-permission android:name="android.permission.REBOOT"/>

       3) 将项目拷贝到Android源码的指定位置: ANDROID_ROOT/packages/apps/ (ANDROID_ROOT为源码根目录)。

      如果项目是通过IDE生成的,需要将IDE编译生成的多余文件删除掉。如Eclipse工具自动编译生成的gen目录,该目录下一般有两个文件:BuildConfig.java 和 R.java。其中R.java中的内容会在模块编译过程中自动生成,编译前不删除会报“R.java 类重复”的错误。至于BuildConfig.java,由于我在项目代码中有使用该类,所以没有删除,读者可以根据自己的实际情况自行选择。

       4) 配置环境变量,然后进行模块编译

       进入到模块所在的目录,执行以下命令即可:

#定位到builde目录下的环境变量配置文件,执行source操作
source ../../../build/envsetup.sh
#编译当前目录对应的模块
mm
         在编译过程中可能会遇到各种千奇百怪的错误。有一部分是因为项目代码本身有错误,所以我建议在模块编译之前,最好把你的项目在IDE下好好调试下,起码保证项目代码本身是能运行的;另一部分错误则可能是由于两种不同编译方式(IDE编译、模块编译)之间的差异造成的,有些在IDE中可以通过编译的,在模块编译时不一定成功,比如我这次编译过程中,提示说部分资源文件找不到或者不可用。如果不幸碰到这类错误,建议读者保持耐心和细心,好好根据错误日志请教Google大神,最终肯定能搞定的!

       5) 编译成功的话,你会在 ANDROID_ROOT/out/target/product/generic/system/app/ 目录下,发现那个梦寐以求的它。

      Good Luck!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值