乱码三千 – 分享实用IT技术

乱码三千 – 码出一个新世界


  • 首页

  • 归档

  • 搜索

android NDK编译涉及的cpu架构种类

发表于 2020-10-28

在使用NDK编译过程中发现针对不同的CPU架构,部分支持编译调试,部分不支持调试,故记录下来,以防忘记

在Application.mk文件中有个预定义命令参数APP_ABI,是指明编译与调试的CPU架构。

目前Android系统支持以下七种不同的CPU架构:ARMv5,ARMv7(从2010年起),x86(从2011年),MIPS(从2012年),ARMv8,MIPS64和x86_64(从2014年),每一种都对应相应的ABI。

CPU架构 ABI
ARMv5 armeabi 32位,从2010年
ARMv7 armeabi-v7a 32位,从2010年
x86 x86 32位,从2011年
MIPS mips 32位,从2012年
ARMv8 arm64-v8a 64位,从2014年
MIPS64 mips64 64位,从2014年
x86_64 x86_64 64位,从2014年

相应生成arm64-v8a,mips64,x86_64下的文件需要NDK_r10以上版本支持。在Application.mk文件里配置APP_ABI的内容。例如指明某个具体的CPU架构

1
APP_ABI := arm64-v8a

或者直接生成所有的版本

1
APP_ABI := all

注意:根据不同的NDK版本,APP_ABI := all仅能生成当前版本支持的ABI信息库文件,如果需要生成最新的必须更新相应的NDK版本。

或者明确写明支持的CPU架构

1
APP_ABI := armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64

建议采用该方法

注意:由于目前版本支持的问题,采用Eclipse+NDK+Windows集成方式开发,对应编译生成对应CPU架构的so文件是没有问题的。但是不一定可以执行调试工作,启动NDK调试模式时将会提示无法识别对应的ABI。

注意:

(1)、目前模拟器只有x86_64的没有arm64-v8a的;

(2)、在用真机测试armv8-a时,最好先通过adb shell, cat /proc/cpuinfo ,来查看下真机是否是支持armv8-a;

(3)、arm32和arm64有些配置参数不能共存,如-msoft-float仅在arm32位下支持,在arm64位下是不支持的.

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Termux:Android 上的一款终端神器

发表于 2020-10-28

Termux 是一款基于 Android 平台的开源 Linux 终端模拟器,使用 pkg(apt) 进行软件包的管理。最重要的是,它无需 root 权限,因此,绝大多数 Android 都可以运行。

目前来说,它能做一些简单的 Linux 任务:

  • 享受 Bash 和 Zsh
  • 使用 Vim 编辑文件
  • 通过 SSH 访问服务器
  • 使用 GCC 和 Clang 编译代码
  • 使用 Git 检查项目
  • 运行 MySQL,Redis 等服务器
  • …

使用方法

因为 Termux 是一款 Linux 终端模拟器,因此,在命令的使用方面和 Linux 是一致的。在这里,我将介绍一些针对 Termux 工具的一些使用方法。

初次使用的准备工作

业内已经有了一种共识,在涉及包管理方面,尽量都会将官方源替换成国内镜像源,Termux 也不例外。初次进入 Termux 后,我们可以使用 TUNA 的 Termux 镜像:

1
$ sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux stable main@' $PREFIX/etc/apt/sources.list # 更换源文件$ pkg up # 更新源文件$ pkg udpate -y && pkge upgrade # 更新系统及软件

替换为国内镜像后,接下来,需要开启 Termux 的存储权限:

1
$ termux-setup-storage

执行命令之后,会弹出权限确认窗口,选择「始终允许」即可。

权限确认

pkg 使用命令速记

  • pkg search 搜索包
  • pkg install 安装包
  • pkg uninstall 卸载包
  • pkg update 更新源
  • pkg upgrade 升级软件包
  • pkg shoe 显示某个包的详细信息

长按屏幕

如果需要对 Termux 中的内容进行复制以及粘贴内容至 Termux,可以通过长按屏幕实现。

额外按键视图

可以看到,在正常的键盘上方,还有一盘额外的功能键,分别是:ESC 键,Tab 键,CTRL 键,ALT 键,- 符号,向下以及向上功能键。有了这一行额外视图,可以更加方便地实现 Android 键盘上没有,而电脑键盘上有的功能。

音量+组合

因为 Android 键盘没有电脑键盘上的一些功能按键,此时,我们可以通过按住音量键+,再输入键盘某个字母数字键,可以达到一些功能键的作用。

  • 音量+ Q:显示/隐藏额外按键视图
  • 音量+数字键:Fx(电脑键盘上的数字功能键)
  • 音量+L:|(管道字符)
  • 音量+H:~(波浪字符)
  • 音量+U:_(下划线字符)
  • 音量+P:上一页
  • 音量+N:下一页

一些简单的应用

HTTP Server

有些时候,我们需要将 Android 上的某些文件发送到其他设备(例如笔记本,分享)。以往的解决方案一般是用微信或者 QQ 来作为中转站,现在,可以利用 Termux 搭建一个简单的文件服务器来实现。

1
$ pkg install python -y # 需要使用 Python$ ifconfig wlan0 # 查看 Android 在局域网中的 IP 地址(我的为 192.168.2.104)$ python -m http.serverServing HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)...

命令成功运行之后,可以看到输出信息中包含了端口地址(我这里是 8000)。此时,用另外一台处于相同局域网(例如 Wi-Fi)的设备在浏览器地址输入 192.168.2.104:8000 即可访问文件服务器了。

看起来像黑客

一提到命令行,怎能少得了那些酷炫的字符如降雨一般,这看起来就很黑客。我们可以通过安装 pkg install cmartix 来实现这种效果。

参考文章

Learn Termux

Termux 高级终端安装使用配置教程

Termux 入门教程:架设手机 Server 下载文件

本文转自:https://sspai.com/post/56031

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

apk逆向工具之脱壳神器反射大师(附脱壳环境搭建、脱壳实战)

发表于 2020-10-27

相信点击进入这篇博客的小伙伴都知道并且搞过App逆向,不过有时候会遇到各种加壳的App,不让你反编译。但是道高一尺,魔高一丈,有正向加密,就有逆向解密。此篇博客博主带大家搭建脱壳环境,并且手动脱一个加了某60的壳的App。闲话少叙,直接开始吧!

一、Android系统

  环境需要一个Android系统,并且系统的版本控制在4.0-6.0之间。建议使用虚拟机/模拟器,不然你还要获取root权限,容易搞坏真机。我这里用的是网易模拟器,Android系统的版本为6.0.1.

二、安装Xposed框架

  需要root权限,虚拟机直接允许即可,真机要用第三方工具获取,网上有很多教程。

1、下载Xposed Installer

官网地址:https://repo.xposed.info/module/de.robv.android.xposed.installer

2、安装Xposed Installer

下载完毕后,直接拖入模拟器安装即可。然后打开这个App


  由于我之前安装过,所以没提示要root权限,第一次安装的时候会提示授权的,授予即可。

三、安装反射大师

  反射大师是一个支持一键脱壳的神器,貌似什么壳都能脱,不过后面更新的壳会不会添加检测机制就说不清了。。。

1、下载反射大师

下载地址:https://www.lanzous.com/i6x1kaf

2、安装ReflectMaster并授权

  直接拖入模拟器中进行安装,然后打开。会提示让你激活Xposed。




然 后 重 启 模 拟 器 ! \color{red}然后重启模拟器!然后重启模拟器!

四、脱壳实战

1、安装待脱壳的软件

  首先在模拟器中安装好待脱壳的软件,用MT管理器可以查看软件加的是什么壳。(反射大师不区分壳类型,是壳都可以脱。)

2、用反射大师打开待脱壳App

  先把软件选中,然后打开待脱壳的App。


3、脱壳(核心步骤)






4、用jadx反编译

  jadx工具可以将dex反编译成java代码。

五、总结与体会

  以上就是脱壳环境搭建与脱某60壳实战的主要内容。壳确实脱了,但是没有修复步骤,比如修改Apk中的xml、程序入口等操作。这主要是由于不同的壳,修复步骤不同

六、附上视频教程

本文转载自https://blog.csdn.net/qq_41855420/article/details/106276824

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

Android常见App加固厂商脱壳方法的整理

发表于 2020-10-27

目录简述(脱壳前学习的知识、壳的历史、脱壳方法)

  • 第一代壳
  • 第二代壳
  • 第三代壳
  • 第N代壳

    简述Apk文件结构Dex文件结构壳史壳的识别Apk文件结构

1

Dex文件结构

2

壳史

第一代壳 Dex加密

  1. Dex字符串加密
  2. 资源加密
  3. 对抗反编译
  4. 反调试
  5. 自定义DexClassLoader

第二代壳 Dex抽取与So加固

  1. 对抗第一代壳常见的脱壳法
  2. Dex Method代码抽取到外部(通常企业版)
  3. Dex动态加载
  4. So加密

第三代壳 Dex动态解密与So混淆

  1. Dex Method代码动态解密
  2. So代码膨胀混淆
  3. 对抗之前出现的所有脱壳法

第四代壳 arm vmp(未来)

  1. vmp

壳的识别

1.用加固厂商特征:

  • 娜迦: libchaosvmp.so , libddog.solibfdog.so
  • 爱加密:libexec.so, libexecmain.so
  • 梆梆: libsecexe.so, libsecmain.so , libDexHelper.so
  • 360:libprotectClass.so, libjiagu.so
  • 通付盾:libegis.so
  • 网秦:libnqshield.so
  • 百度:libbaiduprotect.so
  • 腾讯御安全: libshell-super.so, libshella.so

2.基于特征的识别代码

3

第一代壳

  1. 内存Dump法
  2. 文件监视法
  3. Hook法
  4. 定制系统
  5. 动态调试法

内存Dump法

  • 内存中寻找dex.035或者dex.036
  • /proc/xxx/maps中查找后,手动Dump

4

android-unpacker https://github.com/strazzere/android-unpacker

5

  • drizzleDumper https://github.com/DrizzleRisk/drizzleDumper

  • 升级版的android-unpacker,read和lseek64代替pread,匹配dex代替匹配odex

6

IDA Pro + dumpDEX**dumpDex https://github.com/CvvT/dumpDex**

7

文件监视法

  • Dex优化生成odex
  • inotifywait-for-Android https://github.com/mkttanabe/inotifywait-for-Android
  • 监视文件变化

8

  • notifywait-for-Android https://github.com/mkttanabe/inotifywait-for-Android
  • 监视DexOpt输出

9

10

Hook法

  • Hook dvmDexFileOpenPartial
  • http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp

11

12

定制系统

  • 修改安卓源码并刷机

13

  • DumpApk https://github.com/CvvT/DumpApk
  • 只针对部分壳

14

动态调试法

  • IDA Pro

15

16

17

gdb gcore法

1
.gdbserver :1234 –attach pid .gdb (gdb) target remote :1234 (gdb) gcore

coredump文件中搜索“dex.035”

18

第二代壳

  1. 内存重组法
  2. Hook法
  3. 动态调试
  4. 定制系统
  5. 静态脱壳机

内存重组法

Dex篇

ZjDroid http://bbs.pediy.com/showthread.php?t=190494

对付一切内存中完整的dex,包括壳与动态加载的jar

19

20

so篇

elfrebuild

21

22

构造soinfo,然后对其进行重建

23

24

Hook法

针对无代码抽取且Hook dvmDexFileOpenPartial失败

Hook dexFileParse

http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp

25

https://github.com/WooyunDota/DumpDex

26

针对无代码抽取且Hook dexFileParse失败

Hook memcmp

http://androidxref.com/4.4_r1/xref/dalvik/vm/DvmDex.cpp

27

28

定制系统

修改安卓源码并刷机-针对无抽取代码

https://github.com/bunnyblue/DexExtractor

29

Hook dexfileParse

30

31

DexHunter-最强大的二代壳脱壳工具

https://github.com/zyq8709/DexHunter

DexHunter的工作流程:

32

DexHunter的工作原理:

33

绕过三进程反调试

http://bbs.pediy.com/showthread.php?p=1439627

34

35

修改系统源码后:

36

http://www.cnblogs.com/lvcha/p/3903669.html

37

1
ls /proc/345/task

38

./gdbserver :1234 –attach346 … (gdb) gcore

1
2


gcore防Dump解决方案:

http://bbs.pediy.com/showthread.php?t=198995

断点mmap调试,针对Hook dexFileParse无效

原理: dexopt优化时, dvmContinueOptimization()->mmap()

39

静态脱壳机

分析壳so逻辑并还原加密算法

http://www.cnblogs.com/2014asm/p/4924342.html

40

自定义linker脱so壳

https://github.com/devilogic/udog

main() -> dump_file()

1
2


41

第三代壳

  1. dex2oat法
  2. 定制系统

dex2oat法

ART模式下,dex2oat生成oat时,内存中的DEX是完整的

http://bbs.pediy.com/showthread.php?t=210532

43

定制系统

Hook Dalvik_dalvik_system_DexFile_defineClassNative

枚举所有DexClassDef,对所有的class,调用dvmDefineClass进行强制加载

44

第N代壳so + vmp动态调试 + 人肉还原

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

逆向工具之unidbg(在pc端模拟执行so文件中的函数)

发表于 2020-10-27

 昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功解决了问题。

一、unidbg引入

  逆向某App,反编译dex得到Java代码,但是有两个加密工具类中的方法放到so文件中。



  方法的实现用的C语言编写的,放在了so文件中。在Java中,动态加载so文件,使用native方法的形式隐藏了方法的方法体。难道伟大的逆向工程就此放弃?这显然不符合我们技术人的性格,肯定要想方设法弄出来。

二、unidbg概述

  unidbg 是一个基于 unicorn 的逆向工具,可以直接调用Android和iOS中的 so 文件。项目的GitHub地址为https://github.com/zhkl0228/unidbg
  我使用unidbg,直接调用libbaseEncryptLib.so、libencryptLib.so中的方法,这样就不用想破脑袋去逆向so文件了。

备 注 : \color{red}备注:备注:so文件是unix系统中的动态连接库,属于二进制文件,作用相当于windows系统中的.dll文件。在Android中也可调用动态库文件(*.so),一般会将加密算法、密码等重要的方法、信息使用C语言编写,然后编译成so文件,增强了软件的安全性。

三、unidbg使用姿势

1、下载unidbg项目

  下载地址:https://github.com/zhkl0228/unidbg

2、导入到IDEA中

  unidbg项目用Java编写,并且上面下载的是一个标准的maven项目。我这里演示导入到IDEA中,如果你熟悉其它的IDE,也可以自己去弄。(顺带一提,如果你之前没接触过Java语言,要确保电脑安装好JDK、maven)

①、解压压缩包

②、打开IDEA,导入解压的项目


  浏览到刚刚解压好的文件夹


  后面一路无脑next即可。。。




  第一次导入此项目会自动下载一些jar包,和网速、maven服务器有关,耐心等待吧。

3、测试unidbg

  项目中的src/test/java/com/xxxx/frameworks/core/encrypt路径中有一个TTEncrypt测试用例,直接执行其中的main方法。

  控制台打印相关调用信息,说明项目导入成功。

4、运行自己的so文件

  在前面,我们不是遇到了libbaseEncryptLib.so、libencryptLib.so文件么,利用unidbg直接调用so文件中 的方法。下面演示调用libencryptLib.so文件中的getGameKey函数。

①、编写EncryptUtilsJni类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package cn.hestyle;

import com.github.unidbg.Module;
import com.github.unidbg.arm.ARMEmulator;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;


import java.io.File;
import java.io.IOException;

/**
* description: EncryptUtils调用so
*
* @author hestyle
* @version 1.0
* @className unidbg->EncryptUtilsJni
* @date 2020-05-20 22:01
**/
public class EncryptUtilsJni extends AbstractJni {
// ARM模拟器
private final ARMEmulator emulator;
// vm
private final VM vm;
// 载入的模块
private final Module module;

private final DvmClass TTEncryptUtils;

/**
*
* @param soFilePath 需要执行的so文件路径
* @param classPath 需要执行的函数所在的Java类路径
* @throws IOException
*/
public EncryptUtilsJni(String soFilePath, String classPath) throws IOException {
// 创建app进程,包名可任意写
emulator = new AndroidARMEmulator("cn.hestyle");
Memory memory = emulator.getMemory();
// 作者支持19和23两个sdk
memory.setLibraryResolver(new AndroidResolver(23));
// 创建DalvikVM,利用apk本身,可以为null
vm = ((AndroidARMEmulator) emulator).createDalvikVM(null);
// (关键处1)加载so,填写so的文件路径
DalvikModule dm = vm.loadLibrary(new File(soFilePath), false);
// 调用jni
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
// (关键处2)加载so文件中的哪个类,填写完整的类路径
TTEncryptUtils = vm.resolveClass(classPath);
}

/**
* 调用so文件中的指定函数
* @param methodSign 传入你要执行的函数信息,需要完整的smali语法格式的函数签名
* @param args 是即将调用的函数需要的参数
* @return 函数调用结果
*/
private String myJni(String methodSign, Object ...args) {
// 使用jni调用传入的函数签名对应的方法()
Number ret = TTEncryptUtils.callStaticJniMethod(emulator, methodSign, args);
// ret存放返回调用结果存放的地址,获得函数执行后返回值
StringObject str = vm.getObject(ret.intValue() & 0xffffffffL);
return str.getValue();
}

/**
* 关闭模拟器
* @throws IOException
*/
private void destroy() throws IOException {
emulator.close();
System.out.println("emulator destroy...");
}

public static void main(String[] args) throws IOException {
// 1、需要调用的so文件所在路径
String soFilePath = "src/test/resources/myso/libencryptLib.so";
// 2、需要调用函数所在的Java类完整路径,比如a/b/c/d等等,注意需要用/代替.
String classPath = "com/.../EncryptUtils";
// 3、需要调用函数的函数签名,我这里调用EncryptUtils中的getGameKey方法,由于此方法没有参数列表,所以不需要传入
String methodSign = "getGameKey()Ljava/lang/String;";
EncryptUtilsJni encryptUtilsJni = new EncryptUtilsJni(soFilePath, classPath);
// 输出getGameKey方法调用结果
System.err.println(encryptUtilsJni.myJni(methodSign));
encryptUtilsJni.destroy();
}
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990

②、参数说明

  EncryptUtilsJni类中最重要的设置为main方法中的soFilePath、classPath、methodSign三个参数,它们的作用在main方法中已经注释过了,这里再次解释一下。

soFilePath,填写你需要调用的so文件路径
classPath,填写你需要调用的函数所在Java类的完整类路径。

methodSign,填写你要调用的函数签名,语法为smali。(在jadx中,直接可以看smali代码)


备 注 : \color{red}备注:备注:如果你要调用的函数还需要传入参数,直接传入myJni方法中即可,myJni方法中省略args参数就是供你传入参数。

③、执行结果

四、分析so文件的IDA工具

  IDA工具是反汇编so文件的强大工具,由于libencryptLib.so文件比较简单,并且getGameKey函数返回的是一个常量,并没有复杂的处理过程,所以可以直接查看。

  首先用IDA打开libencryptLib.so文件



  查看反汇编得到的代码。


五、总结

  unidbg确实很强大,直接在pc端模拟调用so文件,省去了反汇编逆向so文件的麻烦。上面的教程只演示了unidbg项目的导入、封装自己的调用so文件的API,其实这只是入门了,unidbg还支持断点调试so文件,也能导入到IDA中进行动态调试

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

android原生shell中端可使用的命令

发表于 2020-10-27

android系统本身属于简化版的linux, 有些功能缺失,很多linux命令用不了,这边总结几个可以使用的命令

首先

1.使用adb进入shell中端

1
adb -s 设备名 shell

2.更改读写权限,否则无法操作指令

1
mount -o remount ,rw /

可用指令

  1. ping
1
ping baidu.com
  1. cat
1
2
cat xxx.txt //查看文件
cat /proc/cpuinfo //查看cpu信息
  1. curl
1
curl -o xxxxx //下载文件
  1. mv
1
mv ./a.txt  ../  //移动文件
  1. date
1
date //查看当前时间
  1. top
1
top //查看当前系统资源消耗
  1. 调用Dalvik VM执行apk文件

创建java文件

1
2
3
4
5
public class Foo{
public static void main(String [] args){
System.out.println("Hello, world!haha");
}
}

将.java转换成.class文件

1
dx --dex --output=foo.apk Foo.class

安装到设备上

1
adb push foo.apk /sdcard/

调用Dalvik VM执行foo.apk

1
2
3
adb shell

dalvikvm -cp /sdcard/foo.apk Foo

  1. 查看当前Activity信息
1
adb shell dumpsys activity top   //可快速定位当前activity路径
  1. 命令行启动调试模式
1
adb shell am start -D -n packagename/ MainActivity
  1. 获取进程pid
1
ps | grep packagename
  1. 建立端口转发
1
adb forward tcp:8700 jdwp:pid
  1. 查看设备参数
1
getprop  #该指令可以查看设备所有信息 包括cpu 网络 model等等
  1. 查看设备可用命令
1
cd system/bin  #该目录下可以查看所有可用的指令

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

apk逆向之so库的破解和调用

发表于 2020-10-27

当你习惯了python的便捷,在逆向安卓是碰到so库的加密分析时,除了使用ida进行函数分析之外,so库的调用也成了一个问题,尤其是遇到只有arm架构的so时,明显感觉到头疼

so库调用方式尝试

1.重新编写一个app进行so库的调用 (不推荐)

痛点:

  • 前期开发费时费力,
  • 开发完毕后只能运行在真机或者模拟器,
  • 如果要执行定时任务相较python或者javaweb而言效率和性能相差太大

2.使用javaweb的形式进行调用(局限性太大,若熟悉树莓派可优选)

优势:

  • 调试方便
  • 可拉进服务器直接定时执行

痛点:

  • 如果使用windows的服务器那么只支持x86的so库, linux的服务器同样不支持arm的so库,即便使用docker也无法运行arm的容器, 除非服务器系统是arm架构, 目前现存的arm系统除了android之外估计都在树莓派了

3.使用python调用so库(若熟悉树莓派可优选)

痛点:

  • 和上面的问题一样, 不支持arm的so库

4.使用 python第三方库 AndroidNativeEmu 调用so(观望)

  • 项目连接:https://github.com/AeonLucid/AndroidNativeEmu

  • 简介: AndroidNativeEmu是基于Unicron实现的一个指令解析器, 让您能够使用python跨平台模拟安卓虚拟机环境

  • 使用资料参考:

    • https://blog.csdn.net/zhangmiaoping23/article/details/101708171
    • https://blog.csdn.net/qq_26914291/article/details/103395857#Invalid%20get_reference%28%25d%29%E9%97%AE%E9%A2%98
    • https://www.anquanke.com/post/id/95199

痛点:

  • 该库目前只支持简单的函数调用,很多功能还未实现,期待后期的发展

5. 使用unidbg(推荐)

优势:

  • 虚拟jvm环境,支持arm32和arm64的so库
  • 弥补了上面javaweb的不足

痛点:

  • 该库的原理是从so中寻找函数,面对动态加载的so比较麻烦, 不如原生System.loadXXX加载方便

总结

有条件折腾的话还是选择树莓派吧

小记

  1. 最近在ubuntu x86 32位的系统上启动springboot调用so库,出现以下问题:
1
/tmp/lib/jniLibs/libkey.so: libstdc++.so: cannot open shared object file: No such file or directory

由于自身能力有限,对C语言不熟,暂时搁置, 来日再处理

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

android在adb shell进入linux之后mkdir提示Read-only file system解决方法

发表于 2020-10-26

前提是你手机拥有root权限, 这边以模拟器为例

1.进入shell模式

1
adb shell

2.切换root用户

1
su

3.更改system权限

1
mount -o remount ,rw /

4.接下来即可成功创建文件夹

1
mkdir mydir

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

linux查看系统架构的几种方法

发表于 2020-10-26

有时候,咱们不清楚自己安装的操作系统是什么架构的x86还是arm, 64位还是32位, 可以通过以下指令进行查询

查看是x86还是arm系统

1.uname -a 命令

1
uname -a  //如果输出带有x86字样即为x86系统 带有arm字样则位arm系统

2. file 命令

1
file /sbin/init //如果输出带有x86字样即为x86系统

查看系统是64位还是32位

1.getconf 命令

1
getconf LONG_BIT  //如果输出32即为32位系统 输出64即为64位系统

2.dpkg 命令

1
dpkg --print-architecturemkdir mydir //如果当前 Linux 是 64 位则输出 amd64,是 32 位则会输出 i386

3.arch 命令

1
arch   //如果输出 x86_64 则表示为 64 位系统,如果输出 i686 或 i386 则表示为 32 位系统

4. hostnamectl 指令

1
hostnamectl

​ 如下:image-20210914145006176

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

arm32系统的树莓派4b docker安装32位java镜像并部署springboot项目

发表于 2020-10-26

最近通过docker在树莓派上部署springboot项目,然而报错了,因为直接下载的jdk不支持。
先看一下之前的docker文件

1
2
3
4
5
FROM java:8
ADD meeting-0.0.1-SNAPSHOT.jar /meeting-1.0-SNAPSHOT.jar
EXPOSE 8084
ENTRYPOINT ["java", "-jar", "/meeting-1.0-SNAPSHOT.jar", ""]
1234

这里从docker镜像官网获取的java是64位的,树莓派32位系统不能用,所以需要自己弄一个镜像。

  1. 首先去oracle下载一个32位的arm镜像,我下载了jdk-8u241-linux-arm32-vfp-hflt.tar.gz,注意不能下载错。
  2. 将镜像解压缩并放置到Linux的/usr/lib/jvm文件夹下
  3. 打开文件~/.bashrc,增加以下内容
1
2
3
4
5
6
7
nano ~/.bashrc
1
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_241
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
1234

  1. 查看是否生效
1
2
3
source ~/.bashrc
java -version
12

  1. 编写Dockerfile文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#Docker image of JDK8 in ARM32
# VERSION 8
# Author: yuwen
#基础镜像使用的是OpenJDK官方镜像公用的
FROM buildpack-deps:stretch-scm
#作者
MAINTAINER yuwen <yuwengoku@163.com>
# Default to UTF-8 file.encoding
ENV LANG C.UTF-8
ENV JAVA_HOME /usr/local/jdk8
ENV PATH $JAVA_HOME/bin:$PATH
ENV JDK_FILE jdk-8u241-linux-arm32-vfp-hflt.tar.gz
COPY $JDK_FILE /usr/local/
RUN mkdir -p "$JAVA_HOME"; \
tar --extract \
--file /usr/local/$JDK_FILE \
--directory "$JAVA_HOME" \
--strip-components 1 \
--no-same-owner; \
rm /usr/local/$JDK_FILE
1234567891011121314151617181920

其中,from不要修改,作者可以修改,其他的不要变化即可。

  1. 将Dockerfile文件和下载的镜像一起拷贝到同一个目录,并创建镜像

    然后执行创建镜像命令:
1
2
docker build -t arm32jdk:8 .
1


\7. 创建好了以后,就可以利用这个我们自己创建的jdk镜像部署springboot项目了
我创建自己的springboot项目的Dockerfile文件:

1
2
3
4
5
FROM arm32jdk:8
ADD meeting-0.0.1-SNAPSHOT.jar /meeting-1.0-SNAPSHOT.jar
EXPOSE 8084
ENTRYPOINT ["java", "-jar", "/meeting-1.0-SNAPSHOT.jar", ""]
1234
  1. 这里我创建好自己的镜像后,创建容器还遇到了一个问题,就是容器创建默认的时区是中时区,即(UTC+0)

    那么获取的系统时间就不对,所以创建容器的时候需要指定时区为上海(UTC+8),即东八区:
1
2
docker run --name meeting -e TZ="Asia/Shanghai" -p 8084:8084 -d --restart=always meeting
1

然后进入容器重新查看时区:

1
2
3
docker exec -i -t  gateway-server /bin/bash
date -R
12

本文为作者原创 转载时请注明出处 谢谢

乱码三千 – 点滴积累 ,欢迎来到乱码三千技术博客站

1…323334…48

乱码三千

android程序员一枚,擅长java,kotlin,python,金融投资,欢迎交流~

479 日志
139 标签
RSS
© 2024 乱码三千
本站总访问量次
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4
0%