APK文件构成

没有aidl文件的解决方法:在build.gradle中添加如下代码:

android{
buildFeatures {
aidl = true
}
}

DexClassLoader

DexClassLoader(参数1,参数2,参数3,参数4);
参数1:要加载的Jar的路径
参数2:缓存目录
参数3:Native目录,可以为空
参数4:父类加载器

静态资源文件

不需要编译的文件夹:assets

assets目录的添加方法:

MainActivity.java,部分代码

findViewById(R.id.btn_startLoad).setOnClickListener(new View.OnClickListener()
{
AssetManager assetManager = MainActivity.this.getAssets();//通过获取MainActivity实例的AssetManager对象,使我们能够访问和管理Android应用程序中包含的原始资产文件。
try
{
InputStream in = assetManager.open("test2.jar");
File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/" + "jarSaveDir");
if(!dir.exists())
{
dir.mkdir();
}
String fullFilePath = dir + "/" + "test.jar";
File jar = new File(fullFilePath);
if(jar.exists())
{
jar.delete;
}
File jar = new File(fullFilePath);

FileOutputStream fos = new FileOutputStream(jar.getAbsolutePath(),false);
//false: 这是 FileOutputStream 构造函数的第二个参数,它表示是否追加写入。在这里,false 表示不进行追加写入,而是直接覆盖原文件内容
byte[] buff = new byte[1024];
int len = 0;
while((len = in.read(buff))>0)
{
fos.write(buff,0,len);
}
fos.flush();
fos.close();
in.close();
}catch(Exception e)
{
e.printStackTrace();
}
loadJar();
});
private void loadJar()
{
File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS + "/" + "jarSaveDir");
File tmp = Environment.getExternalStoragePublic(Environment.DIRECTORY_DOWNLOADS + "/" + "jarTmpDir");
String fullFilePath = dir + "/" +"test2.jar";

DexClassLoader loader = new DexClassLoader(FullFilePath,tmp.getAbsolutePath(),null,this.getClassLoader());
//这行代码的作用是创建一个 DexClassLoader 对象 loader,用于从指定的 DEX 文件 (fullFilePath) 加载类和资源。加载后的类和资源会存放在临时目录 (tmp.getAbsolutePath()),并使用当前类 (this) 的类加载器来加载。这样可以实现在 Android 应用程序运行时动态加载外部提供的类和资源,增强了应用的灵活性和扩展性。
try
{
Class clz = loader.loadClass("com.example.mylibrary2.OneFun2");
Object ins_OneFun2 = clz.newInstance();
Method method_add2 = clz.getMethod("add2",int.class,int.class);
Object ret = method_add2.invoke(ins_OneFun2,11,22);
Log.i("qqqqqqqq","add2 ret "+(String)ret );
}catch (Exception e)
{
e.printStackTrace();
Log.i("qqqqqqqq",e.toString());
}
}

库文件

build.gradle->android->defaultConfig->ndk abiFilters->属性->abd install–abi arm64-v8a

注意:这里配置ndk的写法不同的版本会有不同

安卓apk文件代码

可以看到被安装到data.data中

强制安装x86架构的

签名文件

CERT.RSA、CERT.SF和MANIFEST.MF

生成Release版本的签名的方法

编译资源文件

编译的文件夹:res

代码会引用的文件,位置统一,名字固定,系统分配资源ID

配置清单文件

android:usesCleartextTraffic="true" <!--允许使用不安全的传输协议-->

可用Android逆向助手 解码,这里注意java环境一定要配置好,我这里出现的问题是jre没配置

逆向时,可重点关注继承application的类,因为application的生命周期贯穿整个应用,重点看下图中标出的部分

核心代码

代码:classes.dex classes.1.dex classes2.dex(命名是固定的)

安装后会被放到私有目录下,Dalivik虚拟机加载运行

资源映射文件

resources.arsc(用010Editor打开)

包含了应用程序的ID和资源类型的映射关系