kongkong's Blog

No Silver Bullet --- Computer Language is just a tool.

Android 在应用层调用系统权限的接口

| Comments

在Android的应用层,一般是没法调用如关机,修改系统时间的接口,为了实现在APP中调用系统接口,可以通过将项目作为一个模块,放到Android系统源码中进行编译。

步骤如下:

  1. 在应用程序的AndroidManifest.xml中的manifest节点中加入"android:sharedUserId="android.uid.system"这个属性。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ……
android:sharedUserId="android.uid.system" >  <!--添加该属性-->
    
<uses-permission android:name="android.permission.SHUTDOWN"/> <!--添加该权限-->
……
</manifest>
  1. 编译apk

(1)将应用程序的src文件、res文件和AndroidManifest.xml文件拷贝到Android系统源码package/apps目录下

(2)编写一个Android.mk文件(最简单的方法就是拷贝其他模块中的Android.mk文件),修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

Android.mk:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := 你的项目名
LOCAL_CERTIFICATE := platform    #添加这一句

include $(BUILD_PACKAGE) 

(3)mm 编译,生成apk

遇到的问题:

  • 提示"needed by system/platform",从package/apps的其他app中copy出来Android.mk中的LOCAL_CERTIFICATE := platform 写入到Android.mk中,重新编译即可。

  • 由于太乱了,我重新编译了整个android source,但是又提示“check api”的问题,解决办法:分别使用
    make userdataimage生成data.img;
    make systemimage生成system.img和recovery.img;
    make bootimage生成boot.img 。
    这样生成了所有需要的东西而且不会像使用make那样总是提示烦人的api error。

  • mm生成的apk应该在out/target/product/sabresd_6dq/data/app/中才是正确的,在out/target/product/common是不正确的. 注意在运行mm之前,要source build/envsetup.sh 和lunch sabresd_6dq-eng

  • 编写的app在编译时候总提示:text localizated 本地化的问题,可以在Android.mk中加入

    LOCAL_MODULE_TAGS := tests   #omit the localization check 
    

总结:其实就是把应用程序当作系统应用进行编译~~这样之后就会有系统权限了。

Comments

comments powered by Disqus