背景
我想以编程方式获取 Android 操作系统的所有字符串(包括所有字符串),包括那些被认为是私有的字符串。
例如,我想获得 packageManager 应用程序的那些,如此处所示。
问题
使用 android.R.string 只返回一小部分字符串。
我试过的
我找到了这个链接,它显示了下一个代码,但我不确定要在参数中添加什么:
private String GetAttributeStringValue(Context context, AttributeSet attrs, String namespace, String name, String defaultValue)
{
//Get a reference to the Resources
Resources res = context.getResources();
//Obtain a String from the attribute
String stringValue = attrs.getAttributeValue(namespace, name);
//If the String is null
if(stringValue == null)
{
//set the return String to the default value, passed as a parameter
stringValue = defaultValue;
}
//The String isn't null, so check if it starts with '@' and contains '@string/'
else if( stringValue.length() > 1 &&
stringValue.charAt(0) == '@' &&
stringValue.contains("@string/") )
{
//Get the integer identifier to the String resource
final int id = res.getIdentifier(context.getPackageName() + ":" + stringValue.substring(1), null, null);
//Decode the string from the obtained resource ID
stringValue = res.getString(id);
}
//Return the string value
return stringValue;
}
过去我见过一些应用程序可以列出其他应用程序的各种资源,包括系统本身的资源(示例here)。
后来我发现了如何从您希望的任何应用程序中获取字符串,但它假设您知道标识符的名称,并且不让您列出它们:
fun getStringFromApp(context: Context, packageName: String, resourceIdStr: String, vararg formatArgs: Any): String? {
try {
val resources = context.packageManager.getResourcesForApplication(packageName)
val stringResId = resources.getIdentifier(resourceIdStr, "string", packageName)
if (stringResId == 0)
return null
return resources.getString(stringResId, *formatArgs)
} catch (e: Exception) {
return null
}
}
例如,如果要获取“more”的字符串(key为“more_item_label”),可以使用:
val moreString = getStringFromApp(this,"android", "more_item_label")
问题
这样的事情可能吗?如果没有,是否可以使用root来完成?