remove remaining dependencies on ARSClib

This commit is contained in:
Julian Winkler
2024-05-22 23:38:54 +02:00
parent 64b3a505b6
commit 778d19f268
11 changed files with 225 additions and 223 deletions

View File

@@ -16,22 +16,17 @@
package android.content.pm;
import android.R;
import android.content.Context;
import android.content.res.TypedArray;
import android.content.res.XmlResourceParser;
import android.util.TypedValue;
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
import com.reandroid.arsc.chunk.xml.ResXmlAttribute;
import com.reandroid.arsc.chunk.xml.ResXmlElement;
import java.io.InputStream;
import java.io.IOException;
/**
* Overall information about the contents of a package. This corresponds
* to all of the information collected from AndroidManifest.xml.
*/
public class PackageInfo {
private static AndroidManifestBlock manifest = null; // TODO: only ever load this once, in one place
/**
* The name of this package. From the <manifest> tag's "name"
@@ -242,64 +237,55 @@ public class PackageInfo {
*/
public String requiredAccountType;
static {
InputStream inStream = ClassLoader.getSystemClassLoader().getResourceAsStream("AndroidManifest.xml");
public PackageInfo() {
applicationInfo = new ApplicationInfo();
try {
manifest = AndroidManifestBlock.load(inStream);
} catch (IOException e) {
XmlResourceParser parser = Context.this_application.getAssets().openXmlResourceParser("AndroidManifest.xml");
for (; parser.getEventType() != XmlResourceParser.END_DOCUMENT; parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "manifest".equals(parser.getName())) {
packageName = parser.getAttributeValue(null, "package");
versionCode = parser.getAttributeIntValue("http://schemas.android.com/apk/res/android", "versionCode", -1);
versionName = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "versionName");
}
if (parser.getEventType() == XmlResourceParser.START_TAG && "application".equals(parser.getName())) {
for (; !(parser.getEventType() == XmlResourceParser.END_TAG && "application".equals(parser.getName())); parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "meta-data".equals(parser.getName())) {
TypedArray a = Context.this_application.getResources().obtainAttributes(parser, R.styleable.AndroidManifestMetaData);
String metadata_name = a.getString(R.styleable.AndroidManifestMetaData_name);
if (metadata_name == null || !a.hasValue(R.styleable.AndroidManifestMetaData_value)) {
a.recycle();
continue;
}
TypedValue metadata_value = new TypedValue();
a.getValue(R.styleable.AndroidManifestMetaData_value, metadata_value);
a.recycle();
switch(metadata_value.type) {
case TypedValue.TYPE_STRING:
System.out.println("PackageInfo(): applicationInfo.metaData.putString("+metadata_name+", "+metadata_value.string+")");
applicationInfo.metaData.putString(metadata_name, metadata_value.string.toString());
break;
case TypedValue.TYPE_INT_BOOLEAN:
System.out.println("PackageInfo(): applicationInfo.metaData.putBoolean("+metadata_name+", "+(metadata_value.data != 0)+")");
applicationInfo.metaData.putBoolean(metadata_name, metadata_value.data != 0);
break;
case TypedValue.TYPE_INT_DEC:
case TypedValue.TYPE_INT_HEX:
System.out.println("PackageInfo(): applicationInfo.metaData.putInt("+metadata_name+", "+metadata_value.data+")");
applicationInfo.metaData.putInt(metadata_name, metadata_value.data);
break;
default:
System.out.println("PackageInfo(): metaData: "+metadata_name+": type "+metadata_value.type+" not handled!");
break;
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public PackageInfo() {
packageName = manifest.getPackageName();
versionCode = manifest.getVersionCode();
versionName = manifest.getVersionName();
System.out.println("PackageInfo()");
applicationInfo = new ApplicationInfo();
ResXmlElement application = manifest.getApplicationElement();
for (ResXmlElement metaData : application.listElements(AndroidManifestBlock.TAG_meta_data)) {
ResXmlAttribute name = metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_name);
ResXmlAttribute value = metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_value);
if (name == null || value == null) {
continue;
}
String metadata_name = name.getValueAsString();
TypedValue metadata_value = new TypedValue();
int data = value.getData();
try {
Context.r.getValue(data, metadata_value, true);
} catch (android.content.res.Resources.NotFoundException e) {
System.out.println("PackageInfo(): error getting value for '"+metadata_name+"'");
e.printStackTrace();
continue;
}
switch(metadata_value.type) {
case TypedValue.TYPE_STRING:
System.out.println("PackageInfo(): applicationInfo.metaData.putString("+metadata_name+", "+metadata_value.string+")");
applicationInfo.metaData.putString(metadata_name, value.getValueAsString());
break;
case TypedValue.TYPE_INT_BOOLEAN:
System.out.println("PackageInfo(): applicationInfo.metaData.putBoolean("+metadata_name+", "+metadata_value.data != 0+")");
applicationInfo.metaData.putBoolean(metadata_name, metadata_value.data != 0);
break;
case TypedValue.TYPE_INT_DEC:
case TypedValue.TYPE_INT_HEX:
System.out.println("PackageInfo(): applicationInfo.metaData.putInt("+metadata_name+", "+metadata_value.data+")");
applicationInfo.metaData.putInt(metadata_name, metadata_value.data);
break;
default:
System.out.println("PackageInfo(): metaData: "+metadata_name+": type "+metadata_value.type+" not handled!");
break;
}
}
System.out.println("PackageInfo(): packageName: >"+packageName+"<, versionCode: >"+versionCode+"<, versionName: >"+versionName+"<");
}

View File

@@ -38,10 +38,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.reandroid.arsc.chunk.xml.AndroidManifestBlock;
import com.reandroid.arsc.chunk.xml.ResXmlAttribute;
import com.reandroid.arsc.chunk.xml.ResXmlElement;
class IPackageInstallObserver {}
class VerificationParams {}
class ContainerEncryptionParams {}
@@ -1693,32 +1689,37 @@ public class PackageManager {
* to modify the data returned.
*
* @return ProviderInfo containing information about the service.
* @throws Exception
*
* @see #GET_META_DATA
* @see #GET_SHARED_LIBRARY_FILES
*/
public ProviderInfo getProviderInfo(ComponentName component,
int flags) throws NameNotFoundException {
int flags) throws Exception {
ProviderInfo providerInfo = new ProviderInfo();
if ((flags & GET_META_DATA) == GET_META_DATA) {
String cls = component.getClassName();
List<ResXmlElement> providers = Context.manifest.getApplicationElement().listElements(AndroidManifestBlock.TAG_provider);
for (ResXmlElement providerElement : providers) {
String providerName = providerElement.searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString();
if (providerName.startsWith(".")) {
providerName = Context.manifest.getPackageName() + providerName;
}
if (providerName.equals(cls)) {
List<ResXmlElement> metaDatas = providerElement.listElements(AndroidManifestBlock.TAG_meta_data);
Bundle bundle = new Bundle(metaDatas.size());
for (ResXmlElement metaData : metaDatas) {
bundle.putString(metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_name).getValueAsString(),
metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_value).getValueAsString());
XmlResourceParser parser = Context.this_application.getAssets().openXmlResourceParser("AndroidManifest.xml");
for(; parser.getEventType() != XmlResourceParser.END_DOCUMENT; parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "provider".equals(parser.getName())) {
String providerName = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "name");
if (providerName.startsWith("."))
providerName = Context.this_application.getPackageName() + providerName;
if (!providerName.equals(cls))
continue;
Bundle bundle = new Bundle();
for (; !(parser.getEventType() == XmlResourceParser.END_TAG && "provider".equals(parser.getName())); parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "meta-data".equals(parser.getName())) {
String metaName = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "name");
String metaValue = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "value");
bundle.putString(metaName, metaValue);
}
}
providerInfo.metaData = bundle;
break;
}
}
parser.close();
}
return providerInfo;
}
@@ -2424,23 +2425,29 @@ public class PackageManager {
*
* @return ContentProviderInfo Information about the provider, if found,
* else null.
* @throws Exception
*/
public ProviderInfo resolveContentProvider(String authority, int flags) {
public ProviderInfo resolveContentProvider(String authority, int flags) throws Exception {
ProviderInfo providerInfo = new ProviderInfo();
List<ResXmlElement> providers = Context.manifest.getApplicationElement().listElements(AndroidManifestBlock.TAG_provider);
for (ResXmlElement providerElement : providers) {
String providerAuthority = providerElement.searchAttributeByResourceId(AndroidManifestBlock.ID_authorities).getValueAsString();
if (providerAuthority.startsWith("."))
providerAuthority = Context.manifest.getPackageName() + providerAuthority;
if (!providerAuthority.equals(authority))
continue;
for (ResXmlElement metaData : providerElement.listElements(AndroidManifestBlock.TAG_meta_data)) {
ResXmlAttribute metaName = metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_name);
ResXmlAttribute metaRes = metaData.searchAttributeByResourceId(AndroidManifestBlock.ID_resource);
providerInfo.metaData.putInt(metaName.getValueAsString(), metaRes.getData());
XmlResourceParser parser = Context.this_application.getAssets().openXmlResourceParser("AndroidManifest.xml");
for (; parser.getEventType() != XmlResourceParser.END_DOCUMENT; parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "provider".equals(parser.getName())) {
String providerAuthority = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "authorities");
if (providerAuthority.startsWith("."))
providerAuthority = Context.this_application.getPackageName() + providerAuthority;
if (!providerAuthority.equals(authority))
continue;
for (; !(parser.getEventType() == XmlResourceParser.END_TAG && "provider".equals(parser.getName())); parser.next()) {
if (parser.getEventType() == XmlResourceParser.START_TAG && "meta-data".equals(parser.getName())) {
String metaName = parser.getAttributeValue("http://schemas.android.com/apk/res/android", "name");
int metaRes = parser.getAttributeResourceValue("http://schemas.android.com/apk/res/android", "resource", -1);
providerInfo.metaData.putInt(metaName, metaRes);
}
}
break;
}
break;
}
parser.close();
return providerInfo;
}