如何取得Android应用apk的UI资源和布局

如何取得Android应用apk的UI资源和布局,第1张

第一步: 通过Hierarchy Viewer 工具学习别人的UI布局

第二步:获得apk中的和xml文件,方法一是将扩展名apk改为zip,但是xml有可能打开的时候是乱码。

在这种情况下,使用文件名来得到资源ID显得事半功倍。 通过调用Resources的getIdentifier可以很轻松地得到资源ID。 几个简单的示例:

复制代码代码如下:

Resources res = getResources();

final String packageName = getPackageName();

int imageResId = resgetIdentifier("ic_launcher", "drawable", packageName);

int imageResIdByAnotherForm = resgetIdentifier(packageName + ":drawable/ic_launcher", null, null);

int musicResId = resgetIdentifier("test", "raw", packageName);

可以采用“抓包”的方式进行数据包的获取。

也可以采用资源包下载完毕后通过三方文件浏览器(如:ES、MT等)因为是模拟器一般都可以直接读取到「/sdcard/Android/data/…」这个安卓系统的常见应用数据路径。

找到对应的“包名”并打开就会看到占用了1GB以上的一个/数个文件(夹)了,那些就是下载完成的资源包

通过模拟器自带的文件导出到根目录就可以提取了

在java类中实现构造方法,然后实例化该类时,可以获取资源信息,具体事例如下所示。

Java类

public class AfpUtil {

private Context context;

public AfpUtil(Activity context) {

thiscontext = context;

}

public void getString(){

String s = contextgetResources()getString(Rstringabout_weixin_labe);

}

在Activity中使用

AfpUtil afpUtil = new AfpUtil(MainActivitythis);

通过以上方法,就可以在java中使用资源文件了。

private ImageView imageView,imageView2;

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutactivity_main);

imageView=(ImageView)superfindViewById(RidimageView);

imageView2=(ImageView)superfindViewById(RidimageView2);//找到你layout中对应的imageView

Drawable drawable=imageViewgetBackground();//获取它的资源,返回类型是Drawable

//假设你想把imageView的设置到其他容器中,比如imageView2,

imageView2setBackground(drawable);//imageView2就显示和imageView一样的了

}

把文件放在res/raw下,程序运行时把它释放到指定目录,代码如下:(供楼主参考)

private final String DATABASE_PATH = androidosEnvironmentgetExternalStorageDirectory()getAbsolutePath() + "/db_exam";

private final String DATABASE_FILENAME = "teldb";

public void extractDBFileFromRes(){

try {

String dbFileName = DATABASE_PATH + "/" + DATABASE_FILENAME;

File dir = new File(DATABASE_PATH);

if (!direxists()){

dirmkdir();

Logi("SQLite", "dir made:" + DATABASE_PATH);

} else {

Logi("SQLite", "dir exist:" + DATABASE_PATH);

}

try {

//如果数据库已经在SD卡的目录下存在,那么不需要重新创建,否则创建文件,并拷贝/res/raw下面的数据库文件

if (!(new File(dbFileName)exists())){

Logi("SQLite", dbFileName + ":file not exist");

//res/raw数据库作为输出流

InputStream inputStream = thisgetResources()openRawResource(Rrawtel);

//测试

int size = inputStreamavailable();

Logi("SQLite", "DATABASE_SIZE:" + 1);

Logi("SQLite", "count:" + 0);

//用于存放数据库信息的数据流

FileOutputStream fileOutputStream = new FileOutputStream(dbFileName);

byte[] buffer = new byte[8192];

int count = 0;

Logi("SQLite", "count:" + count);

//把数据写入SD卡目录下

while ((count = inputStreamread(buffer)) > 0 ) {

fileOutputStreamwrite(buffer, 0, count);

}

fileOutputStreamflush();

fileOutputStreamclose();

inputStreamclose();

}

} catch (FileNotFoundException e) {

Loge("Database", "File not found");

eprintStackTrace();

}

} catch (IOException e) {

Loge("Database", "IO exception");

eprintStackTrace();

}

}

以上就是关于如何取得Android应用apk的UI资源和布局全部的内容,包括:如何取得Android应用apk的UI资源和布局、Android 怎样根据资源的名字获取其ID值、安卓游戏安装包怎么提取联网下载资源包等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9557708.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存