精华内容
下载资源
问答
  • 2017-12-03 22:31:45

    前言

    在接入360 Android SDK时遇到在有些机型的Android机器上报错,具体错误提示为:

    Failure to initialize! Your hardware does not support this application

    Unity生成的原生包可以正常运行,那问题很明显出在360 SDK身上。遇到问题时,我的习惯首先是去想自己哪里有问题,排除掉自身原因,在找其他问题。翻看了360 SDK接入文档,怀疑是签名不对,因为360 SDK只支持V1签名,我编译Android project 使用的是Gradle 2.2版本。检查build.gradle文件内容如下:

      android {
        ...
        defaultConfig { ... }
        signingConfigs {
          release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
            v2SigningEnabled false
          }
        }
      }

    是按照官方设置做的,那这里就没啥问题。排除完自己的问题,就去问360SDK的同学了。

    沟通问题

    在我连续加了十几次对方包打听的QQ后,终于接受了我的请求。在这里不得不感叹以前公司和360有合作关系时,都是运营同学拉个群,任何问题都是及时解答。现在只能通过这种无限骚扰的方式才能沟通。沟通过后,让我自己查明我所用的引擎支持哪些动态库,不用的就删除。真是无语啊,你提供的动态库,文档里也不说明一下,而让开发者自己去研究你提供的库,是否适配游戏。

    后面又找之前的同事,专业接入SDK的同学问了下是否遇到此类问题,说没遇到过这个问题。提供了思路,让我挨个添加,使用二分法定位那个库不支持。跑去提供的文件看了下目录结构,大概明白了啥情况。目录结构如下:

    1. arm64-v8a
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    2. armeabi
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    3. armeabi-v7a
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    4. mips
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    5. mips64
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    6. x86
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so
    7. x86_64
      • liblegend.so
      • libonlywechat_plugin.so
      • libqhsdk.so

    看了一下Unity官方文档,说明如下:

    Android: OS 4.1 or later; ARMv7 CPU with NEON support or Atom CPU

    Unity设置里: File->BuildSetting->Android->PlayerSetting->Device Filter,这里只有Armv7,x86的选项。删除掉多余的so文件,问题解决。

    动态库和静态库

    动态库和静态库都是程序代码编译后导出不同类型的库文件。

    静态库特性如下:
    1. 在程序链接时,静态库将被写入可执行文件
    2. 程序在启动时,静态库将被加载到代码区
    3. 每个进程的静态库是独立的

    动态库特征如下:
    1. 程序在链接时,只写入动态库的路径
    2. 程序在需要时加载动态库
    3. 所有进程共享一份动态库

    首先搞清楚动态库,也就是so文件后。我就更加不明白了,既然so文件是自己需要时加载,为啥360SDK自带的so文件会导致Unity报错?

    ABI简介

    不同的CPU对应不同的指令集,为了兼容不同的CPU,在生成动态文件时,可以指定不同的CPU生成对应的文件。文件对应的类型就是API(Application binary interface)。具体文档参考这里

    为不同类型CPU设备生成对应的动态文件,如果不指定生成对应CPU架构的APP,所有动态文件将包含在APP中。

    程序运行时如何找到对应的动态库?
    1. 默认路径加载
    2. 指定的路径加载

    Android APP在安装时会生成如下目录:

    /data/data/<package_name>/lib/lib<name>.so
    list 我们应用,目录如下:
    libil2cpp.so
    liblegend.so
    libmain.so
    libonlywechat_plugin.so
    libqhsdk.so
    libunity.so
    libxlua.so

    程序在安装时,安装程序将扫描:

    1. lib/<primary-abi>/lib<name>.so   // 设备主ABI,设备对应cpu支持的ABI
    2. lib/<secondary-abi>/lib<name>.so // 设备辅助ABI,如果主ABI没有,使用辅助ABI

    刨根问底

    测试使用的一加5手机,小米5,都有问题,骁龙825和骁龙820肯定是支持arm64-v8a。如果是360 SDK自己使用这些库那肯定没有问题。为啥Unity会报错?只能说Unity在启动时加载了所有放在lib目录下的库。由于so文件带有cpu使用信息,Unity只支持armabi-v7a,x86。这样整个问题算是清楚了。

    更多相关内容
  • 文章目录查看依赖库执行命令查看程序依赖的动态库名字用machoview查看安装insert_dylib 查看依赖库 先进入app包所在目录 执行命令查看程序依赖的动态库名字 otool -L 可执行程序名 例如:得到5个动态库 otool -L ...

    预备条件

    本文假设你已经学会了在越狱手机上使用tweak给app添加自制的动态库.dylib
    如果不会请查看下面这个目录,里面有我写的关于tweak的文章
    tweak教程目录

    导出越狱手机上的app包和自己注入的动态库

    usb链接手机,登录root账户
    使用下面工具查看要读取的app包目录

    MJAppTools -l
    

    例如:

    # 04 【testCrackPwd】 <tdw.testCrackPwd>
      /private/var/containers/Bundle/Application/9692FA06-4755-406C-A3F0-66651CA1BC05/testCrackPwd.app
    

    导出自己写的tweak动态库文件

    使用iFunBox到Device\Library\MobileSubstrate\DynamicLibraries目录下查找你写的.dylib扩展名的tweak动态库文件

    在这里插入图片描述
    例如我这里的是testCrack.dylib

    查看依赖库

    先进入app包所在目录

    执行命令查看程序依赖的动态库名字

    otool -L 可执行程序名
    

    例如:得到5个动态库

    otool -L testCrackPwd
    testCrackPwd:
    	/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1858.112.0)
    	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    	/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 5522.2.101)
    

    注意L要大写

    用machoview查看

    打开 Load Commands里面的 LC_LOAD_DYLIB开头的都是动态库
    在这里插入图片描述
    然后Load Commands段落的结尾添加LC_LOAD_DYLIB(自己的动态库),就可以注入自己的动态库了.一定要在结尾,否则被插入后面的位置就往后移动了.

    安装insert_dylib

    地址
    https://github.com/Tyilo/insert_dylib
    下载好,以后选择release编译,然后把product文件夹下的insert_dylib 可执行文件,复制到 usr/local/bin 目录下,这样就可以在任意目录下运行了

    把动态库插入到app里

    • 先把动态库dylib文件放到app包里,跟可执行文件放在同一目录,例如下面把testCrack.dylib 和可执行文件testCrackPwd放在同一目录

    在这里插入图片描述

    insert_dylib @executable_path/动态库名 app包名 --all-yes
    

    executable_path 意思是动态库就在可执行文件同一目录 --all-yes是自动替你输入2次y和回车
    例如:

    insert_dylib @executable_path/tweak_crack.dylib testCrackPwd --all-yes
    

    这种结尾没有 --weak的app加载找不到动态库会闪退,添加 --weak的不会闪退
    例如:

    insert_dylib @executable_path/动态库名 app包名 --all-yes --weak
    
    
    insert_dylib @executable_path/tweak_crack.dylib testCrackPwd --all-yes --weak
    

    之后在app包里会多出一个文件以_patched结尾
    在这里插入图片描述
    把它拖拽到machoview里查看Load Commands段结尾,发现已经多了我们添加的动态库
    LC_LOAD_DYLIB开头的,如下图:
    在这里插入图片描述
    –weak 加载动态库找不到不闪退的是这样 LC_LOAD_WEAK_DYLIB开头的,如下图
    在这里插入图片描述

    optool 代替insert_dylib 更方便

    安装动态库

    optool install -c load -p "@executable_path/tweak_crack.dylib" -t testCrackPwd
    

    删除动态库

    optool uninstall -p "@loader_path/libsubstrate.dylib" -t tweak_crack.dylib
    

    删掉 libsubstitute.0.dylib

    optool uninstall -p /usr/lib/libsubstitute.0.dylib -t libsubstrate.dylib
    

    添加/usr/lib/libstdc++.6.dylib

    optool install -c load -p "/usr/lib/libstdc++.6.dylib" -t libsubstrate.dylib
    

    查看自己写的动态库都依赖哪些库

    otool -L 自己的动态库名
    

    例如:testCrack.dylib

    otool -L testCrack.dylib
    

    显示结果:

    testCrack.dylib (architecture armv7):
    	/Library/MobileSubstrate/DynamicLibraries/testCrack.dylib (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    	/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 5522.2.101)
    	/System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)
    	/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    testCrack.dylib (architecture arm64):
    	/Library/MobileSubstrate/DynamicLibraries/testCrack.dylib (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    	/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 5522.2.101)
    	/System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)
    	/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    testCrack.dylib (architecture arm64e):
    	/Library/MobileSubstrate/DynamicLibraries/testCrack.dylib (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
    	/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1858.112.0)
    	/System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 5522.2.101)
    	/System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)
    	/Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    	/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1300.23.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1311.100.3)
    

    这里出现了3次 /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate (compatibility version 0.0.0, current version 0.0.0)
    Cydia是越狱的动态库,其他的都是系统的动态库.

    或者用machoview打开 testCrack.dylib
    也会找到段落LC_LOAD_DYLIB(CydiaSubstrate)如下图:

    在这里插入图片描述
    把这个越狱手机的动态库,从越狱手机上用iFunbox复制到app包里,如下图,虽然在iFunbox显示0b,复制到mac上就会显示真实大小150k
    在这里插入图片描述
    在这里插入图片描述
    把app包里的_patched结尾的可执行文件覆盖原来的可执行文件
    如下图:
    在这里插入图片描述

    testCrackPwd_patched改成testCrackPwd

    修改越狱动态库的加载路径

    /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate
    

    看上面CydiaSubstrate的路径,是越狱手机的路径,现在要把这个路径修改成跟自己的动态库动态库相同路径,使用下面指令,@loader_path是指被修改的动态库的路径是加载路径,表示自己的动态库和被修改的动态库是相同路径

    install_name_tool -change  旧的动态库路径 @loader_path/越狱动态库名 自己的动态库名
    

    例如上面的例子完整指令如下:

    install_name_tool -change  /Library/Frameworks/CydiaSubstrate.framework/CydiaSubstrate @loader_path/libsubstrate.dylib tweak_crack.dylib
    

    运行结果显示会让 testCrack.dylib的armv7 arm64 arm64e 的签名无效

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: warning: changes being made to the file will invalidate the code signature in: testCrack.dylib (for architecture armv7)
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: warning: changes being made to the file will invalidate the code signature in: testCrack.dylib (for architecture arm64)
    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool: warning: changes being made to the file will invalidate the code signature in: testCrack.dylib (for architecture arm64e)
    

    使用machoview查看自己的动态库 testCrack.dylib,里面依赖的越狱动态库cydiaSubstrate里面的路径已经被修改了
    在这里插入图片描述

    给自己的动态库重签名

    因为刚才我们修改了自己动态库里面加载越狱动态库的路径所以,文件签名被破坏了,使用指令重签名,这个签名不能使用ios App Signer工具,ios App Signer只会对最外层的app包重签名.
    获取证书id

    security find-identity -v -p codesigning
    

    得到结果,下面其中一行是我要的 前面的数字 是我要的id :
    07CA4B77ED192A9294DB84EBD74BC5159793DF69

      5) 07CA4B77ED192A9294DB84EBD74BC5159793DF69 "Apple Development: guangyu shi (6NRAA7665L)"
    

    使用指令重签名动态库

    codesign -fs 证书id 自己的动态库名
    codesign -fs 证书id 越狱动态库名 
    

    例如下面:

    codesign -fs 07CA4B77ED192A9294DB84EBD74BC5159793DF69 tweak_crack.dylib
    codesign -fs 07CA4B77ED192A9294DB84EBD74BC5159793DF69 libsubstrate.dylib
    

    对外面app包重签名

    使用ios app signer重签名,下面是我写的关于这个工具的教程
    ios重签名工具ios-app-signer的使用
    在这里插入图片描述
    生成新的ipa包

    把ipa包安装到手机上

    用爱思助手或者其他工具,安装ipa包到手机上,发现这个app会运行自己写的动态库.

    展开全文
  • 一、Android 应用安装、 二、APK 文件格式、 三、使用 Python 提取 APK 文件





    一、Android 应用安装



    APK 是 Android 应用的安装文件 , 现在也有 AAB 格式的 , AAB 安装包也可以导出 APK 安装文件 ;

    应用安装时 , 会将 APK 安装包拷贝到 /data/app/packageName/ 目录下的 base.apk ,

    如 : 某应用会将 apk 文件拷贝到 /data/app/com.qidian.QDReader-GTqLCxuMlq6CJtnOVz1LgQ==/base.apk 位置 ;

    APK 安装目录参考 【Android 逆向】应用安装目录 ( Android 应用的默认安装目录 | 查找 Android 应用的安装目录 | 查询当前正在运行的应用包名 | 根据包名查询应用安装路径 ) 博客 ;


    /data/data/package.name/lib 是应用自带的 so 动态库 , 在应用安装时安装的文件 ;

    /data/data/com.qidian.QDReader/lib文件是软链接文件 , 真实的文件地址是 /data/app/com.qidian.QDReader-GTqLCxuMlq6CJtnOVz1LgQ==/lib/arm 地址 , 这是应用的安装目录 ;

    lrwxrwxrwx  1 root    root            66 2021-10-26 10:10 lib -> /data/app/com.qidian.QDReader-GTqLCxuMlq6CJtnOVz1LgQ==/lib/arm
    

    参考 【Android 逆向】应用数据目录 ( files 数据目录 | lib 应用自带 so 动态库目录 | databases sqlite3 数据库目录 | cache 缓存目录 ) 博客 ;





    二、APK 文件格式



    Android 的 APK 安装包使用的数据格式就是 zip 格式 , 直接使用 zip 工具解压即可 , 也可以将文件命后缀改为 .zip 后解压 ;

    Zip 文件格式中 , 每个文件都是由 文件头 + 文件数据 + 数据描述符 构成 , 如果有多个文件 , 则上面的 文件头 + 文件数据 + 数据描述符 数据 重复存放 即可 ;

    Zip 文件中 还有一个 核心目录 , 以及 目录结束标识 ;

    在 010 Editor 工具中 , 打开 apk 文件 , 然后选择 " 菜单栏 / 模板 / Zip 模板 " , 即可以 Zip 格式解析该 APK 文件 ;

    在这里插入图片描述

    50 4B 03 04 开始的文件 , 就是 Zip 文件 , 这是 Zip 文件的标识 ;

    在这里插入图片描述





    三、使用 Python 提取 APK 文件



    使用 Python 提取 APK 文件完整代码 :

    import os
    # 如果没有使用 pip install zipfile 安装
    import zipfile
    
    
    # 提取 APK 中的文件
    def extract_apk(apk_path: str):
        # 创建 ZipFile 实例对象
        zip_file = zipfile.ZipFile(apk_path)
        # 解压目录 , 删除 "app.apk" 的后 4 个字符 ".apk" , 即 "app"
        out = apk_path[:-4]
        # 创建目录
        os.mkdir(out)
        # 提取 zip 文件
        zip_file.extractall(out)
        # 关闭 zip 文件
        zip_file.close()
    
    
    def main():
        extract_apk('app.apk')
    
    
    if __name__ == '__main__':
        main()
    

    执行后会将 app.apk 文件解压到 app 目录中 ;

    在这里插入图片描述

    展开全文
  • 一、APK 文件结构、 二、APK 打包流程、 三、APK 安装流程、 四、安卓虚拟机、





    一、APK 文件结构



    Android 应用的安装包时 以 " .apk " 为后缀的 APK 文件 ;

    APK 是 " Android Package " 的缩写 ;

    将打包好的 APK 文件安装到 Android 手机中 , 就是可运行的应用程序 ;


    APK 文件结构 :

    ① assets : 资源文件 , 该目录下的资源文件不经过 aapt 工具编译 ;

    ② lib : 存放 动态库 “.so” 文件 , NDK 中 C / C++ 调用的函数库 ;

    ③ META-INF : 该目录中存放 apk 的签名文件 ;

    • CERT.SF : 摘要加密 , 使用私钥 对 摘要明文 加密后的 密文信息 , 是加密文件 , 如果要解密该文件 , 必须使用与私钥配对的公钥进行解密 ;
    • CERT.RSA : 文件是签名证书文件 , 存放的是公钥和加密算法的描述 ;
    • MANIFEST.MF : 文件摘要 , 存放程序清单文件 , 包含了 APK 安装包 中所有文件的 摘要明文 ;
    • 剩余文件 : 都是可忽略的资源文件 ;

    在这里插入图片描述

    ④ res : 资源文件 , 经过了 aapt 工具编译后的文件 ; 这个目录下的文件不再介绍 , 太熟悉了 ;

    ⑤ AndroidManifest.xml : 清单文件 , 声明了 Application , 组件 , 权限 , 元数据 等信息 ;

    ⑥ classes.dex : Dalvik 字节码文件 , Android 中的可执行文件 , 可以在 Android 系统中运行 ;

    ⑦ resources.arsc : 资源文件映射表 , 使用 aapt 编译 res 目录下的资源文件形成的文件 , 用于根据 id 查找资源路径 ;





    二、APK 打包流程



    APK 打包流程 :

    ① 使用 AAPT 工具打包资源文件 , 生成 R.java , resources.ap 文件 ;

    ② 使用 AIDL tool 工具 , 处理 AIDL 文件 , 生成对应的 Java 文件 ;

    ③ 使用 javac 工具编译 Java 源码为 class 字节码文件 ;

    ④ 使用 dx 工具将 class 字节码文件打包成 dex 字节码文件 , 这是 Dalvik 虚拟机字节码文件 ;

    ⑤ 使用 apkbuilder 工具生成未签名的 apk 文件 ;

    ⑥ 使用 jarsigner 工具对 apk 文件进行签名 , 生成签名后的文件 ;

    ⑦ 使用 zipalign 工具对签名后的 apk 文件进行对齐操作 ;

    在这里插入图片描述





    三、APK 安装流程



    APK 4 4 4 种安装方式 :

    ① 系统程序安装 ;

    ② 使用应用市场安装 ;

    ③ 手机自带安装 ;

    ④ 使用 ADB 调试工具安装 ;


    APK 安装流程 :

    ① 将 APK 安装包复制到 /data/app 目录下解压 , 扫描安装包 ;

    ② 将 dex 文件保存 /data/dalvik-cache 目录中 ;

    ③ 在 /data/data/包名 下创建对应 apk 包名的应用数据目录 ;


    系统自带程序在 /system/app 目录下 , 获得 adb root 权限后才能删除 ;


    应用卸载 , 就是将 /data/app/ , /data/dalvik-cache/ , /data/data/ 等目录下的相关文件删除 ;





    四、安卓虚拟机



    虚拟机是一个可以运行 class , odex , oat 可执行文件的运行环境 ;

    常见的虚拟机有 Java 虚拟机 , Dalvik 虚拟机 , ART 虚拟机 ;


    Java 虚拟机 :
    运行的 class 字节码文件 , 运行程序时解码 class 文件中的内容 ;
    基于栈架构 , 需要频繁在栈上读写数据 , 造成较多的指令分派 , 更多的内存访问次数 , 比较耗费 CPU 时间 ;

    编译时 : Java 源码 , 使用 javac 编译器 , 编译成 class 字节码文件 ;
    运行时 : 类加载器通过 Java 类库验证字节码 , 验证通过会后进入 Java 虚拟机 , 进入 Java 解释器 或 即时编译器 , 然后进入运行时系统 , 之后进入操作系统 , 然后调用硬件 ;


    Dalvik 虚拟机 :
    基于 JIT 机制 ( 即时编译技术 ) , Android 5.0 5.0 5.0 以下使用的虚拟机是 Dalvik 虚拟机 , 该虚拟机的可执行文件是 dex 文件 , 该文件比 class 字节码文件更小 ;
    JIT ( Just In Time ) 即时编译技术 , 对应 Dalvik 虚拟机 ;
    基于寄存器架构 , 通过寄存器间接访问数据 , 该方式比基于栈架构速度更快 ;


    ART 虚拟机 :
    Android 5.0 5.0 5.0 以上使用的虚拟机是 ART 虚拟机 ;
    AOT ( Ahhead Of Time ) 预编译技术 , 对应 ART 虚拟机 ;


    Java 虚拟机 / Dalvik 虚拟机 / ART 虚拟机 都向上层提供了 3 3 3 个接口 ,
    JNI_GetDefaultJavaVMInitArgs
    JNI_CreateJavaVM
    JNI_GetCreatedJavaVMS ;

    虚拟机之间可实现无缝衔接 ;


    Dalvik 虚拟机 与 ART 虚拟机区别 : 虚拟机中有个 persist.sys.dvlvik.vm.lib 字段 ,
    如果该字段存储的是 libdvm.so , 该虚拟机是 Dalvik 虚拟机 ;
    如果该字段存储的是 ;ibart.so , 该虚拟机是 ART 虚拟机 ;


    Dalvik 虚拟机 与 ART 虚拟机可执行文件 :

    Dalvik 虚拟机加载 dex 文件加载时不是直接加载 dex 文件 , 加载执行的是 odex 文件 , odex 文件是通过 dexopt 工具对 dex 进行优化生成的 ;

    ART 虚拟机加载 dex 文件时加载的是 oat 文件 , oat 文件时通过 dex2oat 工具对 dex 文件进行优化生成的 ;

    展开全文
  • OA系统+手机版源码t源代码

    热门讨论 2016-12-06 21:36:06
    回收站 --- 删除文件,可恢复或者彻底删除 扩展应用: 资产管理--- 管理固定资产、仪器、办公用品等 培训管理--- 管理培训信息 会议管理 --- 各项会议会议、上传会议记录 车辆管理 --- 车辆信息、使用、维修...
  • 依赖的so都是音视频的必要的核心SDK,不能删除,但是又不想上传一个超级大的apk到市场, 那么解决的方案就是浪费用户流量,毕竟现在网速那么快,流量也几乎等于不要钱了… 这叫从技术角度伪减小apk,其实在用到的时候还是...
  • 怎么在手机上查看建筑模型图??

    千次阅读 2020-12-22 21:52:36
    一、BIMBOX功能介绍:BIM文件内的多个视图与图纸:一个Revit文件中包含多个二维、三维视图、以及平立剖面、图纸等,BIMBox可将其无损解析并将其呈现在浏览器上。文件详细信息:可查看文件大小、修改时间、修改者,以及...
  • Python 程序打包成 exe 可执行文件

    千次阅读 2020-12-08 21:11:50
    可执行文件:对于非码农用户或者一些小白用户,你让他装个 Python 同时还要折腾一堆依赖,那简直是个灾难。对于此类用户,最简单的方式就是提供一个可执行文件,只需要把用法告诉他即可。比较麻烦的是需要针对不同...
  • iOS Hacker 重签名实现无需越狱注入动态库 dylib一、获取 ipa 文件iOS 的应用都是打包成 ipa 的文件格式,ipa 文件实际上就是 zip 格式的文件,通过 unzip 可以解压,和安卓下的 apk 包类似。App Store 下载完应用,...
  • exo是什么文件

    千次阅读 2020-12-19 04:27:46
    匿名用户1级2014-07-21 回答扩展名是文件名的一部分,每个文件的名中最后一个小点后边的部分(文件可以无扩展名)就是文件的扩展名,通常文件扩展名由3或4个不同的字符组成,可以是数字、字母、符号.你可以把文件的扩展...
  • OPPO子午实验室在Black Hat Asia黑帽大会上分享了针对免安装应用的研究与分析成果,如何从普通接口调用到应用权限的远程命令执行,我们将在本篇文章中进行更为详尽的分析。
  • 一、App Bundle 简介、 二、App Bundle 定制化分发、 1、应用内更新、 ①、即时更新、 ②、灵活更新、
  • 又复杂又杂的一周,react和vue的增查改的不同,react偏向原生的js写法,vue有v-modal双向数据绑定功能,所以vue的增查改就一个v-modal,而react就要三个方法类,还望大家注意~~,来说说这周用到的库吧,动态库gsap,...
  • class文件与dex文件解析

    千次阅读 2019-12-18 23:42:56
    这篇笔记是我去年的时候创建的,结果放到草稿箱里给忘记了,大写的尴尬啊,所以急忙给补上了,此处鄙视一下自己!今天的正题——解析class文件和dex文件
  • android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件 删除应用 android.permission.DELETE_PACKAGES,允许程序删除应用 电源管理 android.permission.DEVICE_POWER,允许访问底层电源...
  • 无奈还是没搞定,我就在猜测是不是静态版本的问题,因为我的Xcode已经升级到了最新的版本,而项目是挺老的项目了,所以秉承着打破砂锅问到底的精神果断去下载老版本的Xcode,通常我们可以在App Store应用商店中...
  •  本书不仅适合android应用程序开发人员阅读,还为qa测试人员提供指导。另外本书还可以帮助项目经理更好地管理项目进程和项目团队,帮助市场推广人员更好地把握市场、创造令人瞩目的销售业绩。 作译者  Shane ...
  • Android应用程序安装过程解析 1.程序安装的4大步骤 (1) 拷贝apk文件到指定目录 在Android系统中,apk安装文件是会被保存起来的,默认情况下,用户安装的apk首先会被拷贝到 /data/app 目录下。 /data/app...
  • Android应用漏洞及常见解决方案

    千次阅读 2021-01-12 19:33:49
    源文件安全2.1 应用完整性2.2 程序签名包2.3 Java代码加壳程度2.4 Java代码混淆2.5 SO文件加固2.6 H5文件加固2.7 Java层关键函数风险2.8 资源文件泄露风险2.9 单元测试配置三. 数据存储风险3.1 WebView明文存储密码...
  • 对于手机用户来说,“存储空间不足” 警告有时会显得非常烦人。时至今日,手机存储容量仍然是有限的。虽然存储容量多年来一直在增长,但是填充在我们手机里的东西:音乐、应用、游戏...
  • Android 动态加载sd卡里面so

    千次阅读 2018-09-26 21:03:38
    有些so文件太大,可以从手机内存或者sd卡里面拷贝到运行的应用程序里面。接口都是之前打包在里面了。还可以做so更新,就是把之前拷贝进行删除,然后进行不重新打包apk,进行重新拷贝进去。 1,封装好的类 package...
  • 2020-08-11 15:45:00 浏览量:7000apk文件一般都是安卓手机的软件,当然,我们也可以用windows系统打开。但是苹果系统怎么办呢?有些朋友想要通过苹果电脑玩安卓的手机游戏,却不知道从何下手,那么apk文件用苹果...
  • Android应用加固原理

    千次阅读 2019-12-18 23:11:49
    打包资源文件,包括res和assets文件夹下的资源、AndroidManifest.xml文件、Android基础类 aidl 将.aidl接口文件转换成.java文件 javaComiler 编译java文件,生成.class字节码文件 dex ...
  • 大体了解Android应用安装过程及原理

    千次阅读 2020-03-24 14:03:54
    Android应用安装的流程及路径: ...system/app 系统自带的应用程序,无法删除 data/app 用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录 data/data 存放应用程序的数据 Data/dalvik-cache 将apk...
  • CSDN 上收到一条私信,内容大致...互联网时代最不缺的就是学习资源,学习教程,网上随便找找,就找到一大筐,只要你每天花 6-8 个小时用于高效学习,半年就入门 Java 了。 高效学习期间,一定要杜绝抖音、游戏的
  • Android 将自己的应用改为系统应用

    万次阅读 多人点赞 2016-11-30 16:19:11
    所谓系统程序就是system/app目录中的程序,普通应用转换成系统程序后有稳定、减少...第一种:使用ADB命令将app安装在system/app目录下转载:android 将自己的应用改为系统应用这种方法的原理就是:1、把apk文件移动到
  • 应用简介

    千次阅读 2019-04-20 10:01:18
    应用是一种新的应用形态,以往的手机应用主要有两种方式:网页、原生应用;网页无需安装,却体验不是很好;原生应用体验流畅,却需要从应用商店下载安装,难以一步直达用户;快应用的出现,就是希望能够让用户...
  • 课程学习目标 ...CO4:掌握数据库应用编程技术及其开发工具的使用,培养数据库应用编程能力,同时培养解决复杂工程问题的数据库应用系统开发能力。 本课程教学内容 数据库系统概论 数据库关系模型 结构
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    详细讲解了Crypt++的加密解密的使用以及其它的加密解密方法(例如base64加解密、哈希加解密以及其它的文件加解密),分静态库和动态库方法。 JSCalls_demo js调用的演示源码 树控件拖动 演示了在树控件中来回拖动...
  • 部署手机文件要点

    千次阅读 2010-12-02 17:09:00
    部署的附加文件列表格式是:一行一个文件,每行格式为 文件名|本地磁盘目录|目标路径|注册表否Visual Studio 环境准备 本文使用的WindowsMobile开发环境是Visual Studio 2008版本,要求在安装VS2008的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,708
精华内容 12,283
关键字:

手机应用动态库文件能删吗