安卓逆向新增View
2020-08-13 本文已影响0人
约你一起偷西瓜
简介AAPT
打包一个安卓apk除了处理代码为smali之外,还要处理资源文件
打包资源用的就是SDK的tools/目录下AAPT(Android Asset Packaging Tool)
主要作用是把资源文件编译成特定格式的二进制文件
- "assets"和"res/raw"目录下的所有资源进行打包,可压缩,不生成资源ID
- 对assets资源之外所有的资源赋予一个资源ID常量,并且会生成一个资源索引表resources.arsc
- 编译AndroidManifest.xml成二进制的XML文件
- 把上面3个步骤中生成结果保存在一个“.ap_”文件,并把各个资源ID常量定义在一个R.java中
用法参考
- aapt l[ist]:列出资源压缩包里的内容
- aapt d[ump]:查看APK包内指定的内容
- aapt p[ackage]:打包生成资源压缩包
- aapt r[emove]:从压缩包中删除指定文件
- aapt a[dd]:向压缩包中添加指定文件
- aapt v[ersion]:打印aapt的版本。
下面介绍两种动态向app里面添加View的方法
1.用代码的方式实现
private void initViewButton() {
Button button = new Button(this);
button.setText("Chang");
button.setTextColor(Color.RED);
button.setPadding(50,50,50,50);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.RIGHT);
this.addContentView(button,layoutParams);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ReqChange(v);
}
});
button.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
ShowDialog(v);
return false;
}
});
}
2.用LayoutInflater获得View
public View getAssetsLayout(Context ctx,String filename) {
AssetManager am = ctx.getResources().getAssets();
try {
XmlResourceParser parser = am.openXmlResourceParser(assetsFile + filename);
LayoutInflater inflater = (LayoutInflater) mcontext.getSystemService(mcontext.LAYOUT_INFLATER_SERVICE);
return inflater.inflate(parser, null);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
//这里的xml是编译后的xml,原xml文件直接放在目录下会报错
//这里的mDialogView里面的子View使用findViewWithTag来获得
mDialogView = getAssetsLayout(context,"assets/dialog_dynamic.xml")
View viewByTag = helper.getViewByTag(assetsLayout, "UUID");