使用android.os.SystemProperties的方法

本文详细介绍了如何使Android应用程序获取系统权限,并修改系统时间的方法。包括使用eclipse编译apk文件并修改权限,以及在源码环境下编译apk文件并使用特定密钥进行签名。此外,文章还解释了使用AndroidManifest.xml和Android.mk文件配置权限的步骤,并提供了签名apk文件所需的密钥文件路径。

android.os.SystemProperties在SDK的库中是没有的,需要把Android SDK 目录下data下的layoutlib.jar文件加到当前工程的附加库路径中,然后在源程序中就可以Import了。

但是这样做会出现一个问题,编译的时候会报错:Unable to execute dex: Java heap space 。在网上找了一下,这个链接比较有帮助:http://programfeelings.blogspot.com/2011/03/unable-to-execute-dex-java-heap-space.html

上面这个链接需要才能访问,我把内容复制在下面:

最近要用到第三方的庫android-sdk-windows\platforms\android-8\data\layoutlib.jar,但出現Conversion to Dalvik format failed: Unable to execute dex: null這個問題。且出現對話方塊


下面是解法:
(註:紅色標記表示有試過但不行,綠色標記表示有試過可行。)

As Android developer, I have met a strange problem when I want use a third party jar, it remained me that:
Dex Loader] Unable to execute dex: null
Conversion to Dalvik format failed: Unable to execute dex: null
out of memory error…An internal error occurred during: “Build Project”.
Java heap space

This is the DEX Error,I find the solutions by Google, one way is to modify the eclipse.ini, you can increase the memory allocated in eclipse.ini to this:-Xms128m -Xmx512m or something higher, but this didn’t work for me. After modify the eclipse.ini, I cannot start the eclipse. By StackOverflow, I find a solution:

eclipse.ini file must have -vm on first line and path on second line. don’t try to put everything into one line!
-vm
C:\Program Files\Java\jdk1.6.0_07\bin\javaw.exe

After add the -vm and the path in my eclipse.ini, I can start my Eclipse and the problem has been resolved.

Another way to solve the ” Conversion to Dalvik format failed: Unable to execute dex: null” problem is using the user library, the concrete steps are as follows:
1. Right-click the project in Eclipse and select “Build Path -> Add Libraries…”.
2. Select User Library from the list and click Next.
3. Click the “User Libraries…” button.
4. Click “New…” in the User Libraries dialog.
5. Give the user library a name and select the System library checkbox and click OK.
6. Highlight the newly added user library in the list and click the “Add JARs…” button and add the desired jar files.
7. Click OK on the User Libraries dialog.
8. Make sure the new user library is checked in the Add Library dialog and …


按照绿色的操作就可以了

Systemproperties类在android.os下,但这个类是隐藏的, 上层程序开发无法直接使用。其实用java的反射机制是可以使用这个类。何谓java反射机制,请自行研究学习,在此不做介绍,放到后续文章中。用JNI 的方式,可以绕过Systemproperties这个类,直接本地调用来实现创建、获取及修改系统属性。在此也不做介绍,也放到后续文章中。这篇文章主要介绍android系统属性的命名方式:创建与修改android属性用Systemproperties.set(name, value),获取android属性用Systemproperties.get(name),需要注意的是android属性的名称是有一定的格式要求的,如下: 前缀必须用system\core\init\property_service.c中定义的前缀 ,进行系统属性设置的程序也必须有system或root权限,如何将android程序的权限提升到system权限?方法是这样的:

1、在AndroidManifest.xml中,在manifest加入android:sharedUserId="android.uid.system "。

2、在Android.mk中,將LOCAL_CERTIFICATE := XXX修改成LOCAL_CERTIFICATE := platform 。经过以上两步就可以把ap的权限提升到system权限了。 但是用这种方法提升权限有两个弊端,如下:1、程序的拥有都必须有程序的源码;2、程序的拥有都还必须有android开发环境,就是说自己能make整个android系统。

------------------------------------------------------------------

如何使Android应用程序获取系统权限
2010-07-06 09:52

转自:http://blog.youkuaiyun.com/liujian885/archive/2010/03/22/5404834.aspx

在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用。

本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久,知道这个目的还是可以达到的。

第一个方法简单点,不过需要在Android系统源码的环境下用make来编译:

1. 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。

2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行

3. 使用mm命令来编译,生成的apk就有修改系统时间的权限了。

第二个方法麻烦点,不过不用开虚拟机跑到源码环境下用make来编译:

1. 同上,加入android:sharedUserId="android.uid.system"这个属性。

2. 使用eclipse编译出apk文件,但是这个apk文件是不能用的。

3. 用压缩软件打开apk文件,删掉META-INF目录下的CERT.SF和CERT.RSA两个文件。

4. 使用目标系统的platform密钥来重新给apk文件签名。这步比较麻烦,首先找到密钥文件,在我的Android源码目录中的位置是"build\target\product\security",下面的platform.pk8和platform.x509.pem两个文件。然后用Android提供的Signapk工具来签名,signapk的源代码是在"build\tools\signapk"下,用法为"signapk platform.x509.pem platform.pk8 input.apk output.apk",文件名最好使用绝对路径防止找不到,也可以修改源代码直接使用。

这样最后得到的apk和第一个方法是一样的。

最后解释一下原理,首先加入android:sharedUserId="android.uid.system"这个属性。通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中。那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就有权限来修改系统时间了。

只是加入UID还不够,如果这时候安装APK的话发现无法安装,提示签名不符,原因是程序想要运行在系统进程中还要有目标系统的platform key,就是上面第二个方法提到的platform.pk8和platform.x509.pem两个文件。用这两个key签名后apk才真正可以放入系统进程中。第一个方法中加入LOCAL_CERTIFICATE := platform其实就是用这两个key来签名。

这也有一个问题,就是这样生成的程序只有在原始的Android系统或者是自己编译的系统中才可以用,因为这样的系统才可以拿到platform.pk8和platform.x509.pem两个文件。要是别家公司做的Android上连安装都安装不了。试试原始的Android中的key来签名,程序在模拟器上运行OK,不过放到G3上安装直接提示"Package ... has no signatures that match those in shared user android.uid.system",这样也是保护了系统的安全。

最最后还说下,这个android:sharedUserId属性不只可以把apk放到系统进程中,也可以配置多个APK运行在一个进程中,这样可以共享数据,应该会很有用的。


博主补充:

signapk编译结束后在 android目录下/out/host/linux-x86/framework/signapk.jar
使用方法:java -jar signapk.jar platform.x509.pem platform.pk8 test.apk test_signed.apk
实践证明,第二种方法不需要删掉META-INF目录下的CERT.SF和CERT.RSA两个文件,直接signapk就可以。


<think>嗯,用户想了解android.os.SystemProperties.getBoolean的使用方法和示例。首先,我需要回忆一下这个方法的参数和返回值。记得这个方法有两个参数,第一个是键(key),第二个是默认值(def)。当系统属性不存在或无法解析时,会返回这个默认值。 接下来,我需要确认权限问题。因为系统属性通常受保护,普通应用可能没有权限读取或写入某些属性。特别是像ro.debuggable这样的属性,可能需要系统签名或系统权限才能访问。这一点在引用[1]和[3]中都有提到,所以必须提醒用户注意权限限制。 然后,用户可能需要一个实际的示例代码。我应该提供一个简单的Java示例,展示如何调用getBoolean方法。例如,检查系统是否处于调试模式,使用默认值false。同时,要指出需要导入android.os.SystemProperties类,但根据引用[2],有些情况下这个类可能不可见,特别是在非系统应用中。这时候可能需要反射或者其他方法,但用户的问题主要是关于直接使用,所以先给出标准用法,再提到可能的兼容性问题。 另外,常见问题部分需要涵盖类找不到的情况,权限不足的解决方法,以及如何处理默认值。比如,如果遇到类缺失,可以考虑反射或系统级SDK;权限问题可能需要系统签名或提升应用权限。这些信息在引用[2]和[3]中都有涉及,需要整合到回答中。 还要注意用户可能是在开发系统应用或需要特定系统权限的应用,所以示例和解决方案需要针对这些场景。比如,系统应用可以直接使用,而普通应用可能需要其他变通方法。同时,确保示例代码语法正确,避免错误。 最后,生成相关问题时要围绕SystemProperties的其他方法、权限问题、替代方案等,帮助用户扩展了解相关内容。确保引用标记正确,比如权限问题引用[1][3],类找不到引用[2]。</think>### android.os.SystemProperties.getBoolean 方法解析 #### 1. 方法定义 `SystemProperties.getBoolean` 用于读取Android系统属性中的布尔值,语法为: $$boolean\ getBoolean(String\ key,\ boolean\ def)$$ - **参数说明**: - `key`:系统属性名称(如`persist.sys.debug`) - `def`:当属性不存在或无法解析时的默认返回值 #### 2. 使用条件 - **系统级权限**:需`android.uid.system`权限或系统签名[^1][^3] - **可见性限制**:部分属性仅对系统进程可见(如`ro.`开头的属性) #### 3. 示例代码 ```java // 检查系统调试模式状态 boolean isDebuggable = SystemProperties.getBoolean("ro.debuggable", false); Log.d("SystemProp", "Debug mode: " + isDebuggable); ``` #### 4. 常见问题解决 | 问题场景 | 解决方案 | |---------|----------| | 类找不到错误 | 添加`frameworks-base-core.jar`依赖[^2] | | 权限不足 | 配置`AndroidManifest.xml`添加系统权限[^3] | | 返回值异常 | 检查属性命名规范及作用域限制 | #### 5. 兼容性建议 对于非系统应用,建议改用`Settings.Global`或反射机制获取属性值
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值