新建项目 名称 TestApp
把TestApp项目中的main目录直接 拷贝到Android源码 packages/apps/TestApp 目录中,
可以参考源码其他app android.bp文件
内容如下:
android_app {
name: "TestApp",
static_libs: ["com.google.android.material_material"], //导入相关包,不然编译不过
srcs: ["**/*.java"],
platform_apis: true,
}
最后目录结构如下:
在PRODUCT_PACKAGES 后面追加当前项目名
执行mm命令,编译该项目,可以编译成功,但是运行模拟器中并没有该App。
这个问题就和上次添加服务一样,必须执行make命令才可以。
执行make后,执行emulator命令, 再次运行模拟器。
看起来好像成功了。
我们在TestApp项目里调用bird服务看看
代码如下:
但是点击hello后,报错,
2022-07-19 15:12:41.796 1820-1820/com.android.mytest W/SystemServiceRegistry: No service published for: bird
2022-07-19 15:12:41.796 1820-1820/com.android.mytest D/AndroidRuntime: Shutting down VM
这个bird是我写的服务,详细可看 Android源码折腾(二)新增服务Bird
经过查看资料,我写的bird是系统服务,必须是系统应用才能访问服务,那么AndroidManifest.xml文件就要修改
必须要在配置文件的manifest标签中添加 android:sharedUserId="android.uid.system"属性,用于标记当前项目为系统应用。然后,我们需要对项目要使用的系统权限进行注册,以系统重启为例,我们需要注册 <uses-permission android:name="android.permission.REBOOT"/> 。
同时修改android.bp 文件,添加 certificate: "platform", 让apk打包用系统签名,不同签名app, android:sharedUserId不能一样,这里使用了android:sharedUserId="android.uid.system" 和其他系统app是一样的uid,那么只有他们签名一样才能打包。
android_app {
name: "TestApp",
certificate: "platform",
srcs: ["**/*.java"],
platform_apis: true,
}
再次make编译TestApp,打开模拟器,运行TestApp,点击hello。成功调用bird服务!
TestApp源码:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。