獲取當前應用的佈局文件名稱,反編譯應用得出其佈局文件

frameworks/base/core/java/android/view/LayoutInflater.java
/*Inflate a new view hierarchy from the specified xml resource*/
private static final boolean DEBUG = false;
View inflate(){
    Resources res = getContext().getResources();
    res.getResourceName(resource);
    res.getResourcePackageName(resource);
    res.getResourceEntryName(resource);
    
    final XmlResourceParser parser = res.getLayout(resource); 
    inflate(parser, root, attachToRoot);
}

AttributeSet attrs = Xml.asAttributeSet(parser);

D LayoutInflater: packageName=:android,resName=input_method
D LayoutInflater: packageName=:com.microsoft.office.powerpoint,resName=disclaimer_check_box

frameworks/base/core/java/android/content/res/Resources.java
loadXmlResourceParser(id, "layout");
    openXmlBlockAsset//value.string.toString()=res/layout/disclaimer_check_box.xml

frameworks/base/core/java/android/content/res/AssetManager.java
native final int getResourceIdentifier(String type,String name,String defPackage);
native final String getResourceName(int resid);
native final String getResourcePackageName(int resid);
native final String getResourceTypeName(int resid);
native final String getResourceEntryName(int resid);

private native final long openXmlAssetNative(int cookie, String fileName);
openXmlAssetNative

frameworks/base/core/jni/android_util_AssetManager.cpp
openNonAsset

frameworks/base/libs/androidfw/AssetManager.cpp
android_content_AssetManager_getResourceIdentifier
    identifierForName()//name.package+name.type+name.name-->ident
android_content_AssetManager_getResourceName
    getResourceName()//name.package+name.type+name.name
android_content_AssetManager_getResourcePackageName
    getResourceName()//name.package
android_content_AssetManager_getResourceTypeName
    getResourceName()//name.type
android_content_AssetManager_getResourceEntryName
    getResourceName()//name.name

openNonAsset    
    openAssetFromFileLocked
        Asset::createFromFile
    
frameworks/base/libs/androidfw/ResourceTypes.cpp
getResourceName
    PackageGroup* const grp = mPackageGroups[p];
    outName->package = grp->name.string(); 
    
ResTable::parsePackage
    mPackageGroups.add(group);

    
AssetManager::openAssetFromZipLocked    
Asset::createFromCompressedMap


frameworks/base/libs/androidfw/Asset.cpp
pAsset->openChunk(dataMap, uncompressedLen);
new StreamingZipInflater(dataMap, uncompressedLen); 

frameworks/base/libs/androidfw/StreamingZipInflater.cpp


01-01 20:01:00.019  1714  2456 V asset   : In 0x5562c5b5b0 Asset zip path: /data/app/com.microsoft.office.powerpoint-1/base.apk
01-01 20:01:00.019  1714  2456 V asset   : +++ opening zip '/data/app/com.microsoft.office.powerpoint-1/base.apk'
01-01 20:01:00.020  1714  2456 V asset   : Opened compressed entry AndroidManifest.xml in zip /data/app/com.microsoft.office.powerpoint-1/base.apk mode 3: 0x55629a74e0
01-01 20:01:00.020  1714  2456 V asset   : Looking for resource asset in '/data/app/com.microsoft.office.powerpoint-1/base.apk'
01-01 20:01:00.020  1714  2456 V asset   : loading resource table /data/app/com.microsoft.office.powerpoint-1/base.apk
01-01 20:01:00.020  1714  2456 V asset   : Opened uncompressed entry resources.arsc in zip /data/app/com.microsoft.office.powerpoint-1/base.apk mode 3: 0x55629a74e0
01-01 20:01:00.020  1714  2456 V asset   : Parsing resources for /data/app/com.microsoft.office.powerpoint-1/base.apk
01-01 20:01:00.064  1714  1764 V asset   : Looking for non-asset 'res/drawable/ppt_splashscreen.xml' in '/data/app/com.microsoft.office.powerpoint-1/base.apk'
01-01 20:01:00.065  1714  1764 V asset   : Opened compressed entry res/drawable/ppt_splashscreen.xml in zip /data/app/com.microsoft.office.powerpoint-1/base.apk mode 3: 0x5562ca0fd0
01-01 20:01:00.066  1714  1764 V asset   : Looking for non-asset 'res/drawable-xhdpi-v4/powerpoint_splash.png' in '/data/app/com.microsoft.office.powerpoint-1/base.apk'
01-01 20:01:00.067  1714  1764 V asset   : Opened uncompressed entry res/drawable-xhdpi-v4/powerpoint_splash.png in zip /data/app/com.microsoft.office.powerpoint-1/base.apk mode 2: 0x5562ca0fd0

/data/app/com.microsoft.office.powerpoint:layout/disclaimer_check_box.xml

try { 
    InputStreamReader inputReader = new InputStreamReader( getResources().getAssets().open(fileName) );
    BufferedReader bufReader = new BufferedReader(inputReader);
    String line="";
    String Result="";
    while((line = bufReader.readLine()) != null)
        Result += line;
    return Result;
    } catch (Exception e) { 
        e.printStackTrace(); 
    }

AssetManager::SharedZip::SharedZip
AssetManager::openAssetFromZipLocked

apktool d app.apk
apktool b  ppt -c –o app1.apk
apk裏的AndroidManifest.xml 爲二進制文件,可通過AXMLPrinter2.jar包反編譯出來
cmd命令行運行一下命令:
java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest2.xml    
    
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章