用Androd studio 开发的app,编译出apk, 想获取system权限。
环境:编译好的apk, android 源码环境,有root权限和源码对应的开发板,我这里是user版本。
思路:1 可以的话直接把整个app源码移到 android源码上编译,但是问题重重,sdk版本和兼容包,依赖包等等。最后关键是,编译成系统app时,需要依赖的so库和动态jar包 是不会被打包到apk中的。(略坑,有可能是没有找着正确的android.mk)
2 app 添加上 android:sharedUserId="android.uid.system" 属性,然后编译出来的apk 用源码环境重签名。push 到设备 /system/app/xx_your_app_/. 再重启设备。
第二种方法,重签名:
重签名可以 直接用签名的工具和系统的签名文件,不过一般系统都有预制第三方app,一般源码工程中vendor(厂商)目录 就有,可以借鉴,直接用一个Android.mk文件去完成了。
1.0 修改原app的 AndroidManifest.xml文件,在 <mainfest ....> 标签中加入 android:sharedUserId="android.uid.system"
2.0 把编译好的apk拷贝到源码编译环境自己建立的空文件夹下,同时添加一个Android.mk
#vlc
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := java_sample-debug
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_DEX_PREOPT := false
LOCAL_PROGUARD_ENABLED := disabled
include $(BUILD_PREBUILT)
#LOCAL_MODULE -----------apk名称
#LOCAP_MODULE_TAGS := optional-----------optional:指该模块在所有版本下都编译
#LOCAL_MODULE_CLASS
#LOCAL_MODULE_SUFFIX ---------------------module的后缀,=.apk
#LOCAL_CERTIFICATE := platform -----------platform key签名
#LOCAL_DEX_PREOPT -----------------------apk 优化 #给fale
#LOCAL_PROGUARD_ENABLED-------------------java 混淆,防反编译
# BUILD_PREBUILT
进去mm一下即可。会在 out/target/product/**/system/app/xx/ 下得到对应重签名的apk.
xx 为LOCAL_MODULE 指定的名称 ** 编译的对应平台名
注意容易出错的点:
1.0 修改 AndroidMainfest.xml 文件的时候,xml 文件写错了 <> 没有匹配,但是android studio只是报了错误提示,apk还是可以编译安装?正确的是这样子:
失误第一次修改的时候copy过来,写成了这样:
在package= 这一行后面原先 ">" 已经结束了这个标签,所以后续一行添加的 android:shareUserId="android.uid.system"> 没有起作用的,但是android studio 只是给了个 ”灯泡“ 编译运行还是通过了,android studio 3.2 还以为是android studio buid.gradle又有什么机制把这个属性给覆盖了,找半天。
2.0 重签名后,push覆盖原来的apk,直接启动app可能还是没有以system用户启动app:用push的方法 “安装”到系统目录 。如果刚开始的时候已经push过 没有修改 shareUserId ="android.uid.system"的同名apk到同一个目录,重新修改再push进行覆盖,app可以再启动,但是启动是不会以system 用户来启动的。究其原因,push进去只是把文件拷贝进去,并不是安装,所以app启动的时候还是以上次安装的信息 来启动.
猜测---------------- 所以应该先删掉原来的,重启,(会清除原先的信息) ,再push新app,重启(会安装新的app),猜测重启后系统app应该有一次“安装”的过程,新的shareUserId属性在这个安装过程才起作用。这个需要去探究app安装和启动。
A: android studio编译出来的apk: build/outputs/debug/*.apk
B:查看app是否以system用户启动了: adb 登录进去,用linux的ps查看一下即可 执行 # ps | grep "xxx" xxx为app的包名的一部分即可: