我正在ApplicationInfo使用packageManager.getInstalledApplications(0)获取对象列表,并尝试根据它们是否是系统应用程序对它们进行分类.
有一段时间我一直在使用这里描述的技术,但是在我的应用程序中看到之后,一些应用程序不在非系统应用程序列表中(例如Facebook,当可用时要求系统在SD上安装自己)卡).在下次阅读ApplicationInfo.FLAG_SYSTEM的实际文档并了解它实际上没有过滤系统应用程序之后,我现在正在寻找一种新方法.
我的猜测是,系统和非系统应用程序的UID之间存在很大差距,我可以收集这些差异来进行区分,但到目前为止我还没有找到答案.我也查看了其他标志,例如ApplicationInfo.FLAG_EXTERNAL_STORAGE,我支持API 1.5.
有没有人有这个真正的解决方案(不涉及FLAG_SYSTEM)?
我正在开发我的第一个Android应用程序,我很好奇是否有任何"标准"方法来执行特权shell命令.我只能够找到这样做的一种方式,通过执行su,然后再追加我的命令stdin的的su过程.
DataOutputStream pOut = new DataOutputStream(p.getOutputStream());
DataInputStream pIn = new DataInputStream(p.getInputStream());
String rv = "";
// su must exit before its output can be read
pOut.writeBytes(cmd + "\nexit\n");
pOut.flush();
p.waitFor();
while (pIn.available() > 0)
rv += pIn.readLine() + "\n";
Run Code Online (Sandbox Code Playgroud)
我已经读过关于包装特权(superuser)调用的内容JNI:这可能吗?如果是这样,一个人将如何完成它?除此之外,是否还有其他方式来调用特权指令Java?
作为一个实验,我想使用我定制的Android平台的平台密钥来签署一个通过NDK构建的任意APK.这样做的过程是什么?
我正在使用反射方法freeStorageAndNotify:
Method freeStorageAndNotify = null;
freeStorageAndNotify = service.packageManager.getClass().getMethod(
"freeStorageAndNotify", long.class, IPackageDataObserver.class);
freeStorageAndNotify.invoke(PackageManager.class, maxCache + freeSpace, packageDataObserver);
Run Code Online (Sandbox Code Playgroud)
这会导致InvocationTargetException:
java.lang.SecurityException: Neither user 10199 nor current process has android.permission.CLEAR_APP_CACHE.
Run Code Online (Sandbox Code Playgroud)
一些要点: - 我已经有android.permission.CLEAR_APP_CACHE - 这只发生在android"M"版本中(从开发者网站闪烁预览sdk)
我知道这是一个黑客攻击,谷歌没有为此提供一些官方API,但是有很多清洁应用程序只需点击一下即可清除所有设备缓存,所以如果有人知道如何通过另一种解决方法绕过这个问题我我很高兴看到这一点.
非常感谢你的帮助
在我的Android应用程序中,我想在按钮单击时重新启动我的Android设备.但它不起作用.
到目前为止我已经这样做了.
ImageButton restartmob = (ImageButton) this.findViewById(R.id.restartmob);
restartmob.setOnClickListener(new ImageButton.OnClickListener() {
@Override
public void onClick(View v) {
Process proc = null;
try {
//proc = Runtime.getRuntime().exec(new String[] { "su", "-c", "reboot" });
proc = Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});
proc.waitFor();
} catch (Exception ex) {
Log.i(TAG, "Could not reboot", ex);
}
}
});
Run Code Online (Sandbox Code Playgroud)
我还在清单文件中添加了以下权限.
<permission android:name="android.permission.REBOOT"/>
Run Code Online (Sandbox Code Playgroud)
当我单击图像按钮重新启动时,我得到以下异常.
java.io.IOException: Error running exec(). Command: [/system/bin/su, -c, reboot now]
Working Directory: null Environment: null
at java.lang.ProcessManager.exec(ProcessManager.java:211)
at java.lang.Runtime.exec(Runtime.java:173)
at java.lang.Runtime.exec(Runtime.java:128)
at com.android.onlinepayment.activity.SystemSubMenuActivity$1.onClick(SystemSubMenuActivity.java:49)
at android.view.View.performClick(View.java:5184)
at android.view.View$PerformClick.run(View.java:20910) …Run Code Online (Sandbox Code Playgroud) 我有一个Android服务试图绑定到服务器套接字端口24.因为它是特权端口,它失败了绑定异常.我想知道我需要做些什么来使这个工作.我看到这个论坛有几次被问过,但没有解决方案.
此服务在Android上运行的设备上运行.我们为设备构建了android平台.我们拥有所需的一切控制权.
如何使用root previleges执行一个完整的应用程序(不只是几个命令)?
我正在研究一个有根的Android设备.
在Android应用程序中,我需要播放通过接收的H.264流eth0.我需要root权限才能打开(raw open)eth0.
相应的代码在JNI中.由于JNI代码和Java代码之间需要交换很多缓冲区,因此可执行的方式(Process.exec(su))非常不方便.
JNI代码在与Java代码相同的进程上下文中执行.因此,授予我的android进程的root权限应该可以解决我的问题.但我不知道该怎么做.
system app/priv-app.我认为这会给应用程序root访问权限.但那并没有发生.我有两个jar库使用相同的共享库的情况.在每个库中,"主接口"类加载.so文件System.loadLibrary.我的问题是:如果用户决定在一个项目中使用这两个jar库,第二次调用System.loadLibrary同一个.so文件是否会导致任何异常?或者系统"以某种方式处理"以防止共享库被加载两次?或者也许有一种"众所周知的模式"来处理这种情况?
jni包装器的目标是在android上使用.我是两个包装器库的作者,所以回答你可以完全控制java源代码.
我正在从源代码编译Android ROM,我有几个可编译的应用程序,但是在手机上的数据/应用程序中.它们可以通过手机设置卸载.我希望他们不可能从手机上卸载,并编译到系统/应用程序而不是数据/应用程序.
有什么建议?
编辑:错字
我只是好奇是否有办法获得platform.pk8和platform.x509.pem用于在Android设备内签署rom.
我的目标不过是开发用于测试和使用我自己的设备的系统应用程序.
对于那些不熟悉创建系统apks的人: 使用系统签名签署apk [WITHOUT ROOTING]