android shareduseridd="android.uid.system"可以编译出apk吗

项目的发展离不开你的支持,请作者喝杯咖啡吧!
感谢您的开源项目!
Android手机屏幕助手,用来替换NavigationBar虚拟导航按键。由于涉及到系统按键消息。
所以需要在源码环境下编译,需要系统签名,需要声明android:sharedUserId=&android.uid.system&
由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...

MiPop
Android屏幕助手,可以代替Android原生的NavigationBar,释放更多的屏幕空间。由于需要替换系统按键消息,因此需要平台签名,具体可以参看Android.mk文件。

代码结构
本项目基于Android源码环境开发,需要在Android源码环境下编译,由于本人不会PhotoShop,所以测试截图中有一个menu按键图标与其他图标风格不符,请谅解。

联系我
way:





测试截图

正在加载...在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
标签:至少1个,最多5个
本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。Systemproperties的作用就不说了,先简述一下其用法:
SystemProperties.set("persist.sys.enable","true");//将persist.sys.enable的值设置为true
SystemProperties.get("persist.sys.enable","false");//获取persist.sys.enable的值,如果获取不到,以“false”作为默认值
如果想得到一个bool值,可以用:
SystemProperties.getBoolean("persist.sys.enable",false);
其他类似。
不过在这之前,应将该应用调为系统级别应用。AndroidManifest.xml:
&manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.setupwizard"
android:versionCode=""
android:versionName="1.0"
+android:sharedUserId="android.uid.system"&
但这只适用于Android Source的开发者,普通app开发只能使用反射方法。谷歌反对这种用法,但存在即合理,下面是我写的一个示例,可以直接拿去用,不谢:
package com.android.
import java.lang.reflect.InvocationTargetE
import java.lang.reflect.M
import android.content.C
import android.net.ConnectivityM
public class SysProp {
private static Method sysPropG
private static Method sysPropS
private SysProp() {
Class&?& S = Class.forName("android.os.SystemProperties");
Method M[] = S.getMethods();
for (Method m : M) {
String n = m.getName();
if (n.equals("get")) {
sysPropGet =
} else if (n.equals("set")) {
sysPropSet =
} catch (ClassNotFoundException e) {
e.printStackTrace();
public static String get(String name, String default_value) {
return (String) sysPropGet.invoke(null, name, default_value);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
return default_
public static void set(String name, String value) {
sysPropSet.invoke(null, name, value);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。可以通过命令adb shell :
getprop查看设备上所有属性状态值。
或者 getprop XX.XX查看某个属性状态
使用setprop XX.XX yy 设置某个属性的状态
下面问题来了,如果我要新增一个属性persist.backdata.enable怎么办?按照正常思路,应该是SystemProperties.set("persist.backdata.enable","false");可惜这个命名不符规则。编译不会出错,但什么也写不进去,当然也读不出来。我们的方法没有错,错的是规则,那么我们就来修改规则。打开external/sepolicy/property_contexts,加上一句:
@@ -56,6 +56,7 @@
persist.sys.
u:object_r:system_prop:s0
persist.service.
u:object_r:system_prop:s0
persist.service.bdroid. u:object_r:bluetooth_prop:s0
persist.security.
u:object_r:system_prop:s0
+persist.backdata.
u:object_r:system_prop:s0
整编系统后就可以正常使用persist.backdata.*本文原作者 长鸣鸟 ,未经同意,转载不带名的严重鄙视。That's all.
0 收藏&&|&&0
你可能感兴趣的文章
5 收藏,1.4k
91 收藏,6.2k
3 收藏,911
本作品 保留所有权利 。未获得许可人许可前,不允许他人复制、发行、展览和表演作品。不允许他人基于该作品创作演绎作品
分享到微博?
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。14:35 提问
在APK中通过adb shell命令启动UIautomator失败
源码如下:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
Button stButton = (Button)findViewById(R.id.start_test);
stButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Process pro = Runtime
.getRuntime()
.exec("uiautomator runtest TestHiDP.jar -c com.huawei.cases.TestAllCase");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
报错信息为:
12-03 08:17:24.452: E/UiAutomatorTestRunner(6046): java.lang.RuntimeException: Didn't find class "com.huawei.cases.TestAllCase" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/uiautomator.jar", zip file "/data/local/tmp/TestHiDP.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
12-03 08:17:24.452: E/UiAutomatorTestRunner(6046): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.huawei.cases.TestAllCase" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/uiautomator.jar", zip file "/data/local/tmp/TestHiDP.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
我在pc端输入“adb shell uiautomator runtest TestHiDP.jar -c com.huawei.cases.TestAllCase”是可以正常启动的。
手机端的APK有android:sharedUserId="android.uid.system",使用的是系统签名。在android 4.0的高通平台手机上可以运行,在MTK某些平台的手机上运行不了。在android 5.0上就都运行不了了。请大神帮忙看看
是不是权限,还是什么问题?
按赞数排序
这个问题折腾了这么久,我这里把原因贴出来,供大家分享,有错误的地方也请大家指正。
通过apk启动Uiautomator,在android 4.4可以,而5.0不可用,是因为我的apk使用的是systemId,在4.4上没有对用户权限进行限制。而5.0上强制开启了SELinux,这样对systemID的访问权限就限制了,因为/data/local/tmp目录的用户和属组是shell:shell,所以解决方法是,把APK改成shellID进行访问,就好了
错误信息里提示运行时并未找到该类,所以应该是版本的问题,可能不同手机平台的安卓版本移除了一些包。
你好LZ我这几天也在做这个东西,遇到了同样的问题,我对你的回复有一些疑问,“把APK改成shellID进行访问,就好了”shellID这个是什么?是我已通过adb shell进去后得到的这个吗?root@cancro:/ # ,还有是在manifest文件中修改apk改成shellID吗?能把你的这个修改的代码给个参考吗?,谢谢,另外我这边使用的是小米手机还报了一些虚拟机权限的问题,
Could not create image space with image file '/system/framework/boot.art'. Attempting to fall back to imageless running. Error was: Requiring relocation for image '/system/framework/boot.art' at '/system/framework/arm/boot.art' but we do not have any dalvik_cache to find/place it in.
No pending exception expected: java.lang.ClassNotFoundException: Didn't find class "com.android.commands.uiautomator.Launcher" on path: DexPathList[[zip file "/system/framework/android.test.runner.jar", zip file "/system/framework/uiautomator.jar", zip file "/data/local/tmp/UiautomatorFunction.jar"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]
之类的东西,我和你一样直接使用adb shell uiautomator是没有问题的,4.4.4的小米也没问题我怀疑是apk中调用的uiautomator和直接adb shell调用的不是一个,默认是不是/system/bin
希望能尽快得到你的恢复,谢谢
以前我也遇到了,android:sharedUserId="android.uid.system"权限改下android:sharedUserId="android.uid.shell"即可。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐当前位置:&&编程技术>
如何安装系统认证签名过的APK
&&&&来源:&互联网& 发布时间:
&&&&本文导语:&
解决方法有如下两种:
如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/apps 下面去 mm ,不过要记得在 Android.mk 中增加 LOCAL_CERTIFICATE 属性,这个属性具体有三个值:
系统中所有使用 android.uid.sy...
解决方法有如下两种:
如果你 repo sync 了 android 的整个源码,那么可以直接把你的 app 放到 /packages/apps 下面去 mm ,不过要记得在 Android.mk 中增加 LOCAL_CERTIFICATE 属性,这个属性具体有三个值:
系统中所有使用 android.uid.system 作为共享 UID 的 APK ,都会首先在 manifest 节点中增加android:sharedUserId=“android.uid.system”,然后在 Android.mk 中增加 LOCAL_CERTIFICATE := platform。可以参见 Settings 等
系统中所有使用android.uid.shared作为共享 UID 的 APK,都会在 manifest 节点中增加android:sharedUserId=“android.uid.shared”,然后在 Android.mk 中增加 LOCAL_CERTIFICATE := shared。可以参见 Launcher 等
系统中所有使用 android.media 作为共享 UID 的 APK,都会在 manifest 节点中增加android:sharedUserId=“android.media”,然后在 Android.mk 中增加 LOCAL_CERTIFICATE := media。可以参见 Gallery 等。
当然,毕竟不是每个人都有机会,或者有必要下载整个源码的。 简单地,当你用 IDE 编出 apk 之后,可以去 /build/tools/signapk/ 找到 signapk.jar 文件;再去 /build/target/product/security/ 里找到 platform.pk8 、 platform.x509.pem 这两个文件。把它们连同你的 apk 扔进一个文件夹,然后 cd 到该文件夹下执行 java -jar signapk.jar platform.x509.pem platform.pk8 Origin.apk Signed.apk,得到的 Signed.apk 就可以直接 adb install了。
您可能感兴趣的文章:
本站(WWW.169IT.COM)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。本站(WWW.169IT.COM)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
相关文章推荐
特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!
(C)9IT.COM,E-mail:www_169it_com#163.com(请将#改为@)}

我要回帖

更多关于 shareduserid system 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信