基于 Eclipse 的 IDE 下进行 Android项目的创建

创建 Android 工程

1)启动 Eclipse,菜单栏选择 File -> New -> Project…。

新建工程

2)在 New Project 窗口的列表中找到 Android,选择 Android Application Project。

选择 Android Application Project

3)填写创建 Android 项目所需的基本信息。

  • Application Name (Android 应用的名称)
  • Project Name (在 Eclipse 中的项目名称)
  • Package Name (存放 Java 类的包名称,其实质是存放的文件夹路径,“.”号为文件分隔符,编写的 Java 文件都会放在项目的 src 目录下,com.example.firstandroidapp 表示类放在 src/com/tencent/helloworld 文件夹中)
  • Minimum Required SDK (应用程序所支持*低的 SDK 版本及所对应的 Android 平台版本)
  • Target SDK (应用程序的目标 SDK 版本及所对应的 Android 平台版本,即测试过的*高版本)
  • Compile SDK (表示在编译时的应用程序的 SDK 版本及所对应的 Android 平台版本, 这个一般为默认或者同 Target SDK)
  • Theme (指定适用于该应用程序的 Android UI 风格)

输入前三项项目信息,之后选项可根据需要修改,本文操作中保持默认选项,点击 Next。

填写基本信息

4)进行项目配置。

  • Create custom launcher icon (用户自定义应用图标)
  • Create Activity (创建主程序 Activity 的 Java 类)
  • Mark this project as a library (将该项目作为其他项目的引用库)
  • Create Project in Workspace (创建项目到 Eclipse 工作区)
  • Add project to working sets (添加项目到 Eclipse 工作集)

保持默认选项,点击 Next。

项目配置

5)由于在之前勾选了 Create custom launcher icon,这里需要进行应用程序的图标配置,在这里可以选择原图库的备选图标,也可以选择目标文件目录下的图片,并能对图标进行样式的调整。

保持默认选项,点击 Next。

应用图标配置

6)由于在之前勾选了 Craete Activity,这里可以对 Activity 创建,在勾选”Craete Activity“的状态下可以选择一种界面风格进行自动创建。

保持默认选项,点击 Next。

创建 Activity

7)接着上一步,定义 Activity 相关文件名。

  • Activity Name (应用程序主界面所对应 Activity 的 Java 文件名)
  • Layout Name (应用程序主界面界面布局的 xml 文件名)

保持默认配置,点击 Finish 完成工程的创建。

定义 Activity

 

一个关于 APK 签名验证的问题

高德地图车机版及以前版本可以通过 NP 管理器去除签名验证,

*新版本不行了,有没有哪位知道原因以及办法的?

*新版某个 beta 版本安装包出现过 android_armeabi_v7a_signed 字样,会是与此相关的改动导致了原有的去除签名验证方法的失效吗?

5 条回复    2021-04-09 20:58:58 +08:00
hyb1996
    1

hyb1996   17 小时 0 分钟前 via Android

这个取决于去除签名验证的实现吧。比如说通过替换 package manager 相关调用的,可以自己计算签名之类
YouKnowIt
    2

YouKnowIt   16 小时 20 分钟前

应该是人家的签名验证方式更新了
ch2
    3

ch2   15 小时 47 分钟前

想知道你得多想想办法是不是,要不然人家为什么要防你
mitong3269
    4

mitong3269   14 小时 10 分钟前 via iPhone

不是很理解
是手机上要安装这个 app 吗?
为啥要去掉验证啊?
tistest
    5

tistest   13 小时 48 分钟前

逻辑实现改了吧。

`signed`是签名的时候自带的后缀,没啥影响

android 系统中的后台限制与电池优化是什么意思?

android 中的后台限制和电池优化分别是什么意思,二者有什么关系 感觉两个的意思差不多,但是既然分开了肯定有区别吧

3 条回复    2021-01-20 14:04:55 +08:00
jinyang656
    1

jinyang656   83 天前   ❤️ 1

电池优化是 Android 6.0 开始的一个限制:通常称为 Doze 和 App Standb: https://developer.android.com/training/monitoring-device-state/doze-standby,

开启电池优化且进入 Doze 或 Standby 模式后应用在后台行为会受到限制,限制网络请求,限制 CPU 唤醒,(不是完全限制,会有周期性的唤醒窗口,以及一些例外情况,比如 FCM 唤醒)具体的限制参考 : https://developer.android.com/topic/performance/power/power-details

后台限制是 Android 8.0 开始的另一个限制 https://developer.android.com/about/versions/oreo/background
进入 “后台” 的应用,”Service 组件“ 会完全停止。

如果要让微信等应用保持在后台运行,能即时收到消息,这两项限制都需要关闭。

S179276SP
    2

S179276SP   82 天前

如果你在外国的话,开启微信的电池优化,打开微信的后台限制,FCM 无延迟。
q15673355
    3

q15673355   79 天前 via Android

@S179276SP 国内,好像只有关闭电池优化才能正常收到消息提醒。另外 Android11 消息通知中的静音,说的是关闭声音和振动,但是如果开启静音的话微信也是没有提醒的

像 VMOS 这类能够在 Android 手机上面运行其他版本的 Android 系统,技术原理是什么?

本来自己想写一个类似的,但是 Google 半天没有找到相关技术介绍. 是不是我搜索的关键词不对?

我搜索的是: “Virtual Machine in Android”

19 条回复    2021-01-26 20:59:41 +08:00

shily
    1

shily   84 天前

在哪看到 “在 Android 手机上面运行其他版本的 Android 系统”?
我搜索了一下,看官网介绍,就是应用双开而已。
xiyuesaves
    2

xiyuesaves   84 天前

@shily 人家确实是独立的系统啊,甚至可以根据需要下载不同版本的安卓系统
zarvin
    3

zarvin   84 天前

虚拟机
0A0
    4

0A0   84 天前 via Android

类似的 app 有很多。相当于创建了一个虚拟硬件环境,然后在虚拟硬件环境里安装 Android os 。因为虚拟硬件是直接调用手机真实硬件,所以耗损会比 pc 虚拟机好很多。
sky96111
    5

sky96111   84 天前

@shily virtualxposed 那种用的才是双开,VMOS 确实运行了一个虚拟系统。原理不详,目前只有这个 APP 做到了模拟一个完整系统。但在评论区吃瓜的时候听说可能和 anbox https://anbox.io/ 的实现方式有关系
gam2046
    6

gam2046   84 天前

这玩意就是自己实现了一个中间层,相当于被模拟系统的 framework,然后隔离开系统自身的 framework 。讲原理没啥难度,写起来巨麻烦,到处都是坑。

但这个玩意,宣传里带上了微信、梦幻西游一类的第三方厂商,法律风险*大。现在是南山必胜客没搞,一必死。

rust
    7

rust   84 天前

@0A0
@zarvin
有没有相关技术文档可以详细了解下?
Jirajine
    8

Jirajine   84 天前 via Android

这个大概就是自己实现了 HAL,在一个容器里运行单独的 system image,和宿主机共享内核。文档可以看 aosp 的文档,实现可以参考 anbox
https://source.android.com/devices/architecture
20015jjw
    9

20015jjw   84 天前 via Android

chroot ?
rust
    10

rust   84 天前

@Jirajine 我刚开始也以为是 Anbox,但是后来我发现它内核和宿主机都不是同一个…
Jirajine
    11

Jirajine   84 天前 via Android

@rust 不可能吧,内核不同的话就是虚拟化了,用户态的虚拟化无论实现难度还是性能都不太可能达到这样的效果。
marczhao
    12

marczhao   84 天前 via Android

proot 容器。
rust
    13

rust   84 天前

@Jirajine 所以我才觉得神奇,虽然 arm64-v8a 支持硬件虚拟化,但是这得 root 权限啊.它这个都没有 root 权限就可以安装使用了.然后虚拟出来的系统还挺流畅…
Jirajine
    14

Jirajine   84 天前 via Android

@rust 内核应该是共享的,你看到的不一样可能是接口修改了数值。
1073850525
    15

1073850525   83 天前

还有一个叫光速虚拟机,声称比 VMOS 快
反正我是看不懂,你可以看看
yanqiyu
    16

yanqiyu   83 天前

@rust 虽然 uname 之类途径看到的好像是不一样的版本,但是通过在 anbox 内拿到 root 之后试图干一些对内核的特权操作(比如操纵 SELinux )会 denied,所以应该还是同一个内核,只是 hook 掉了一些调用。
cathedrel
    17

cathedrel   83 天前

@rust 现在这个 VMOS 还是要给予一大堆权限才肯运行吗?
rust
    18

rust   81 天前

@cathedrel 是的,电话权限,储存权限,定位权限等等
yaeio
    19

yaeio   72 天前

给你个思路:Android 上可以运行 Linux,Linux 内核可以运行 Android 虚拟机 Android-linux-Android

现在[2021 年]用于开发调试的 android 机有推荐的吗?

39 条回复    2021-03-05 13:03:40 +08:00
blueaurora
    1

blueaurora   87 天前   ❤️ 1

我的感觉是 pixel, 然后是小米, 然后是华为,然后是 ov 。

pixel 可以 build 原生 rom, 堆栈跟源码能无风险对上;
小米的开发版对开发者很友好,之前都用小米 8,小米 6 调试;
华为和 ov 主要是因为 线上用户比较多, 出线上 bug 需要类似机型的 backup

blueaurora
    2

blueaurora   87 天前

不是堆栈,是调用栈
zpxshl
    3

zpxshl   87 天前 via Android

pixel *强,不刷机也是*强
华为用着也行,就是不能断点在 activity 启动阶段太久
小米小问题太多,限制也多,比如*次开 usb 调试要插卡还是登录来着? and shell input text 要权限。 有的小米有问题有的没问题。
zpxshl
    4

zpxshl   87 天前 via Android

当你需要调试系统类的源码时,就知道 pixel 的好了
yinzhili
    5

yinzhili   87 天前

建议各种大厂的都至少要买 1 台,魔改的地方太多了,你都不知道哪里会有奇怪问题
cmostuor
    6

cmostuor   87 天前

看需求, 如果只是开发 app 那就得如#5 说的多人用的机型都买一台用来测试, 如果是系统层的开发那 pixel *好.
also24
    7

also24   87 天前

@blueaurora #1
大概两三年前,尝试用小米当开发机的时候被折腾的够呛。

adb 调试需要插卡,好像还需要绑手机号?
然后 bootloader 解锁,需要小米帐号在设备上登录了多少天之后才行,我按官方的提示和工具折腾了半个月也没弄好,*后投降放弃。

haaro
    8

haaro   87 天前

小米开调试要登陆小米账号还得插 sim 卡,特别麻烦
amok
    9

amok   86 天前

小米不错啊,连“显示布局边界” 都可以放到下拉通知栏里,用起来方便*了。
以前用的 oppo *无语,usb 调试 10 分钟不用自动关闭。。。
hackerwgf
    10

hackerwgf   86 天前

@zpxshl #3
“华为用着也行,就是不能断点在 activity 启动阶段太久”
太真实了,单步的时候总得找别的机器来搞
swsh007
    11

swsh007   86 天前 via Android

google 亲儿子
android one 里的 mi,nokia,moto 这些可以解 bootloader 的
一加
miui,emui,coloros 等等
rungit
    12

rungit   86 天前

目前也有这种需求,有性价比比较高的机型推荐吗
blueaurora
    13

blueaurora   86 天前

楼上们都说小米的不好用.. 我 debug 从来没插过卡啊,我还刷 cm .. 可能我都用的小米的老手机吧, 小米 3-小米 8
MaxLi77
    14

MaxLi77   86 天前

开发用 pixel,适配不得国产机一个牌子来一台?
huage2580
    15

huage2580   86 天前

我现在自用 essential ph1 调试,公司就啥牌子都来一个,体感华为的比较好用,安装 app 很快(不知道为啥,我 ph1 安装要 20s,华为 mate30 仅 5s ),也没有那些煞笔确认,安装,还要输入账号密码还要插卡。。。
frantic
    16

frantic   86 天前

之前贪便宜买了个 Lg v35 600 块钱的 845 但是那个系统真拉胯,删除软件要删 2 次,系统 bug 又多,现在很后悔
zpxshl
    17

zpxshl   86 天前   ❤️ 1

@hackerwgf 有个小技巧。 在启动阶段且运行到你的断点时,手机熄屏,这样就可以继续调试。
zpxshl
    18

zpxshl   86 天前

@amok 连“显示布局边界” 都可以放到下拉通知栏里 pixel 也有,应该是原生功能
zpxshl
    19

zpxshl   86 天前

@amok opp ousb 调试 10 分钟不用自动关闭 可以解决。 网上百度下,有条命令。曾经我也被这折磨过一段时间。。。
zpxshl
    20

zpxshl   86 天前

小米*次 run 一个 app,还要弹圈确认,还有倒计时默认拒*。。。
john6lq
    21

john6lq   86 天前 via iPhone

推荐 ov 的都是傻逼
john6lq
    22

john6lq   86 天前 via iPhone

除了 ov 随便买
orannge
    23

orannge   86 天前

调试的话,国产机 一加 > 小米 > 其它? 调试用中等配置,低配手机安装速度慢
boileryao
    24

boileryao   86 天前

三星很不错,没有刷机 root 需求的话体验接近 pixel ;至于小米、华为、OV 体验则要差一截(排名越往后越差)
WebKit
    25

WebKit   86 天前 via Android

推荐华为 mate 30 然后升级成鸿蒙系统,鸿蒙里的 Android 是 Android11 你可以一方面调试在新系统下的问题,另一方面可以测试一下鸿蒙的兼容性。

不管你喜不喜欢,在国内你就要适配鸿蒙(自己是老板除外?),华为手机的用户很多 Android 11 又是个文件系统更新比较大的版本。

WebKit
    26

WebKit   86 天前 via Android

@zpxshl 这个开发者选项里关了 MIUI 优化就行
WebKit
    27

WebKit   86 天前 via Android   ❤️ 1

@also24 开发者里面关了 MIUI 优化,然后切换开发版,
also24
    28

also24   86 天前

@WebKit #27
好的谢谢,下次如果再用小米手机折腾的时候我试试看。

我自己目前主要使用 一加 和 Pixel 来折腾了。

NexTooo
    29

NexTooo   86 天前

看到这个突然想起来为啥我的 mix2s 是开发版了,估计是我为了调试省事啥时候自己改的(
yklaxds
    30

yklaxds   86 天前 via Android

@WebKit 就是安卓套壳可别吹了
shaobin0604
    31

shaobin0604   86 天前

能刷 lineageos( https://download.lineageos.org/) 或 mokee( https://download.mokeedev.com/) 等第三方 ROM 的机型都行
WebKit
    32

WebKit   85 天前 via Android

@yklaxds 是你语文的理解能力不行吗?你哪里看出我在吹了?华为作为国内出货量*大的手机厂商,不应该去兼容吗?多大的人了,别这么幼稚行吗?
yklaxds
    33

yklaxds   85 天前 via Android

@WebKit 还在吹?你多大的人了,别这么幼稚行吗?
yklaxds
    34

yklaxds   85 天前 via Android

@WebKit 麻烦你清醒点,华为那个就是套壳安卓,会和安卓不兼容?谁语文有问题?
WebKit
    35

WebKit   85 天前 via Android

@yklaxds 管他是不是套壳,我求求你去自己适配一下再来这里云行吗?我手机两个测试机一个 p40 pro 一个 mate30 你能别云了吗?
WebKit
    36

WebKit   85 天前 via Android

@yklaxds 你可真能☁,别说套壳了,国内的 MIUI 还有新出的原 OS 都是对 Android 进行深度订制的,部分情况下都需要匹配。更别说鸿蒙了。还吹?怎么只要提到华为就是吹了?小学生吧! B 了
yklaxds
    37

yklaxds   85 天前

@WebKit 求求你了,可别吹了,小学生
KunMinX
    38

KunMinX   82 天前

当下推荐 pixel 3,价格在 1000 以内,做测试机十分流畅,
Android 11 在 Android Studio 4.3 以上版本可以扫二维码连接调试(不必经过 adb ),
且 pixel 3 可以一直支持到 Android 12
langrenfengzi
    39

langrenfengzi   35 天前

@KunMinX 感谢,刚好也需要 11 测试机,研究了决定某宝买 Pixel 3a 好了

安卓能对浏览器刷新率锁帧吗?

安卓能对浏览器刷新率锁帧吗?  h5 requestAnimationFrame 动画会随着刷新率改变速度

一个安卓 h5 内置的动画, 用到了 requestAnimationFrame 遇到高刷手机, 特别是设置了动态高刷的设置, 在屏幕按压的时候自动进入高刷, 然后页面动画就变速了, 想问下有没有能限制 或 锁住应用刷新率的, 又或者是 h5 有没有固定 fps 的, 感谢!

18 条回复    2021-01-20 17:13:08 +08:00
1OF7G
    1

1OF7G   79 天前 via iPhone

根据时间在 requestAnimationFrame 计算下一帧的位置大小等参数,而不是根据调用次数每次 currentpos.x+2px 这样根据当前帧修改
muzuiget
    2

muzuiget   79 天前

requestAnimationFrame 本来就是那样用的,你应该在回调函数里取那个时间参数,然后根据时间差来计算绘图速度。
soulmt
    3

soulmt   79 天前

固定的 fps 是不存在的…. requestAnimationFrame 只是让你一帧改一次, 你可以使用 requestIdleCallback 来控制你每一次渲染和时间之间的关系,就算是高刷,那么无非每一帧变化的值小了,但是离你真正预设的动画时间和距离,不会发生改变,就比如你本来 60fps 的时候一次走 10px,高刷在 120fps 的时候一次只走 5px,
fengjianxinghun
    4

fengjianxinghun   79 天前   ❤️ 1

按帧率计算逻辑 ×
按时间计算逻辑 √

帧率无关动画

wdspro
    5

wdspro   79 天前

@1OF7G 现在的动画就是这样的 每回调一次 x + speed 来渲染动画 导致高刷新率的时候速度快 性能差的手机 fps 低的时候一卡一卡的

@muzuiget 具体可以讲一下吗 时间差是指的什么时间差

@soulmt 是要先算出 fps 然后 再根据 fps 来算每帧需要走的距离是吗

fengjianxinghun
    6

fengjianxinghun   78 天前

@wdspro 你要忘记有 FPS 这个东西,当他不存在。
wdspro
    7

wdspro   78 天前

@fengjianxinghun 通过上面帧间差的方式实现了不同刷新率下速度相同的实现 现在更多的问题是会不必现的直接卡死几秒钟 就是两帧之间间隔 5~6s 钟 canvas 的性能这么差吗 还是说有其他的优化项没有做到 *开始的每帧清空画布 主要就是用的这个 drawImage 文中有提到坐标去浮点 但是这个是 10 年前的了 不知道 canvas 有没有针对优化 https://seblee.me/2011/02/html5-canvas-sprite-optimisation/
wdspro
    8

wdspro   78 天前

也尝试了在所有素材开始游戏前的 部分预渲染
fengjianxinghun
    9

fengjianxinghun   78 天前

@wdspro

canvas 性能在几种技术中是*差的。
替代选择
1. css 动画
2. webgl

wdspro
    10

wdspro   78 天前

@fengjianxinghun 这样的吗 选型技术的时候 *开始就是舍弃了 css3 webgl 适合做小游戏吗 有合适案例吗
soulmt
    11

soulmt   78 天前

@wdspro fps 不用管, 每一帧渲染浏览器会通过 requestIdleCallback 告诉你这一帧还有多少时间是空闲的,比如浏览器处理 5ms 那么在 60 帧的时候,你能拿到的时间分片就是 11.7ms , 如果是 120 帧的话,你拿到的时间可能是 3.3ms ,那么,假设你的动画是走 100px 需要 100ms,那么速度就是 1px/ms, 那么在上述条件下,如果给你 11.7ms 那么你就走 11.7px ,在 120 帧的时候给你 3.3ms 你就走 3.3px , 这个时间是浏览器给你的时间,可以不用管具体帧数是多少。
fengjianxinghun
    12

fengjianxinghun   78 天前

@wdspro 5 年前做 h5 手游的时候,当时 webgl 普及率不高,引擎是纯 canvas 写的慢的要死,部分内容就用 html/css3 动画代替优化。webgl 做 3d 游戏都够了何况小游戏。
wszgrcy
    13

wszgrcy   78 天前

@fengjianxinghun 但是 webgl 也是绘制在 canvas 上的…..你指的是默认的那种 canvas context 2d 的吗?
fengjianxinghun
    14

fengjianxinghun   78 天前

@wszgrcy 对
fengjianxinghun
    15

fengjianxinghun   78 天前

@wdspro 找个成熟 h5 游戏引擎吧,比如 cocos 之类的。
wdspro
    16

wdspro   78 天前

@wszgrcy 是的 context 2d 的

@soulmt 是的 现在是按照这样的思路达到了 所有刷新率一个速度值了 但是现在就是性能有问题 会爆掉的样子 两个帧之间 有时候会达到几秒钟 在等下一次渲染的时候我的页面状态是直接卡住的 现在其实就只用到了 ctx.drawImage 同屏一个背景图 几个道具 加人物动态图在渲染 我想不出是需要优化什么地方 图已经压缩到*限了

wdspro
    17

wdspro   78 天前

@fengjianxinghun 有考虑 但是现在已经到了快验收阶段了 一时间想着先优化过去 暂时没时间折腾了 只能后面有时间研究研究了
fengjianxinghun
    18

fengjianxinghun   78 天前

@wdspro 背景图之类的静态部分能用 html 的就用 html,不要用 ctx.drawimage 每帧 draw

webgl 可以 batch draw 节约 drawcall count,context 2d 不行。

安卓有类似IOS的垃圾短信静默处理 app 吗?

忘记苹果 IOS 哪个版本了,好多垃圾短信 系统自动给我 归类到垃圾短信。平时完全感知不到 有垃圾短信的到来。而且苹果很少会将重要的通知类短信归类垃圾短信去。

自从搞了台安卓,电信,股票等各种垃圾每天定时发生过来,安卓都会响起提醒。我给安卓机的短信添加了一些关键词,但是过一段时间,这些关键词改了,又失效了。

所以安卓有类似苹果的垃圾短信处理 app 吗?

14 条回复    2021-01-22 10:23:29 +08:00
ldlywt
    1

ldlywt   79 天前   ❤️ 1

通知盒子 可以试下
juded
    2

juded   79 天前

这个国产 rom 基本标配,至于提醒,设置为拦截时不提示就好了。
原生安卓就要折腾了。
tnjin
    3

tnjin   79 天前

小米手机自带的应该可以满足你的需求了吧,也是自动归类
draguo
    4

draguo   79 天前

miui 自带的就挺好的,唯一问题会把一些可以薅羊毛的短信也给屏蔽了
saltxy
    5

saltxy   79 天前

有没有类似 MIUI 的短信拦截 app,之前下了个 app 时不时的吞短信,找不回来那种,把我整怕了
job
    6

job   79 天前

大多数情况下,系统自己就给屏蔽了,不会提示用户的;垃圾短信骚扰电话这部分,国内的 android 要强于 ios ;
azkaban
    7

azkaban   79 天前

用的 MIUI,我以为安卓每家都有这功能呢,感觉是基础标配啊
zxcslove
    8

zxcslove   79 天前

MIUI+1,感觉天经地义了,没注意过
Infinite2K
    9

Infinite2K   79 天前

我想了想………一加短信直接系统自动屏蔽了,各种优惠折扣信息,垃圾信息都直接拦截了,想看的话也可以自己去看,通知类短信验证码类你觉得正经的短信不会

我认为国内安卓厂商只要不是很小众的厂商,这个问题都可以搞定的吧……系统能搞定的为什么要安装 app 搞定

相比较短信,电话才是真的恶心,现在只是标记为骚然推销,但是不会自动禁止,需要你这边挂掉以后设置封禁,迷惑的是我这个手机号*近一个月甚至半年的时间都没怎么用,我实在想不明白哪个混蛋泄露了我的手机号,或者早几年的现在才倒卖出去广告推销的,*近两天一天 5 个以上,着实恶心,也有可能是*近经常隔三岔五打电话升级办业务的联通倒手的………

little_cup
    10

little_cup   79 天前   ❤️ 1

如 1 楼所说,欢迎试试我写的通知滤盒 https://play.google.com/store/apps/details?id=com.catchingnow.np
其实过滤 95% 的垃圾短信只需要 td 退订 t 退 之类的几个关键字就好了。
weixiangzhe
    11

weixiangzhe   79 天前 via Android

@little_cup 千万不能回 td,现在大家的短信服务商都是通用的,退订了 app a 回导致某些 app 甚至。收不到验证码
little_cup
    12

little_cup   79 天前

@weixiangzhe 没有回啊,只是用这几个关键字识别营销短信而已。
weixiangzhe
    13

weixiangzhe   79 天前 via Android

@little_cup 看错啦 不过现在有的短信退订文案乱七八糟的 比如招行的是 #A ?
Kamiyu0087
    14

Kamiyu0087   77 天前

国产 ROM 标配功能吧应该
我 Mate 系手机用了三四年,各种营销垃圾短信很少收到的

Android OKHttp 获取服务器的 Json 数据,没有双引号?

我服务器使用 SpringBoot 写的,如下:

    @GetMapping(value = "/GetImageByUser",produces = "application/json;charset=UTF-8")
    @ApiOperation("获取用户图片,每个分类前 100 张")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "userId", value = "userId", dataType = "String", paramType = "query")
    }
    )
    public Result getImageByUser(String userId) {
        return imageService.getImageByUser(userId);
    }

返回值 Result 对象如下:

public class Result {
    private int code;
    private boolean message;
    private Object detail;
    ...省略 setter 和 getter 方法
}

然后在浏览器访问这个接口的时候,响应结果是带双引号的:

{"code":200,"message":true,"detail":[{"category":{"objectId":"0c0a0ddaa1b84ce286be4343cd9d3438","categoryId":"c5341c1d8ac547589899514516d0768a","categoryName":"WeiXin","categoryUser":"84f6e0d8d94348ccab981e364661a419","isPrivate":-1,"categoryStatus":1,"createTime":3},"images":[{"objectId":"f6d97d24556348a4ac342cb321397718","imageId":"e50ba0a75359432f89390d85daefb10a","sha1":"c3063275501e0f8ef87703473c7263168771f21b","fileCategory":"c5341c1d8ac5475898
省略...

然后使用 Swagger 做调试的时候也是同样的效果。

但是在 Android 端使用 OKHttp 访问接口的时候,json 的 key 和 value 都不带双引号:

[{category={objectId=0c0a0ddaa1b84ce286be4343cd9d3438, categoryId=c5341c1d8ac547589899514516d0768a, categoryName=WeiXin, categoryUser=84f6e0d8d94348ccab981e364661a419, isPrivate=-1.0, categoryStatus=1.0, createTime=3.0}, images=[{objectId=f6d97d24556348a4ac342cb321397718, imageId=e50ba0a75359432f89390d85daefb10a, sha1=c3063275501e0f8ef87703473c7263168771f21b, 
省略...

因为 json 中有时候会含有网址,所以在解析 JSON 的时候就会出错。

我感觉问题应该是出在 OKHttp 上,因为在浏览器是正常的(带双引号),使用 swagger 调试接口的时候也是正常的

请问这个问题该如何解决啊?如何让 key 和 value 中的字符串都是带双引号的呢?

14 条回复
grantonzhuang
    1

grantonzhuang   73 天前

你这打印的不是 json,是 toString 方法打印出来的
w292614191
    2

w292614191   73 天前

OKHttp 可不会出这种低级错误。
qwerthhusn
    3

qwerthhusn   73 天前

目测 lz 新人,这个 JSON 已经反序列化成对象了,打印的是 toString 又不是 json
beichenhpy
    4

beichenhpy   73 天前

访问接口这个打出来的已经是反序列化的对象了,自然没有引号
Helsing
    5

Helsing   73 天前 via iPhone

找一个可以打印 json 的库,xlog 、logger 之类的
hongch
    6

hongch   73 天前

response.body.string 就是带双引号的
kingfalse
    7

kingfalse   73 天前 via Android

okhttp 直呼内行并表示你还是换个 HTTP 请求库吧
yinzhili
    8

yinzhili   73 天前

楼主需要补一补基础知识了
Paaranoia
    9

Paaranoia   73 天前

建议看看 okhttp 的文档
scxiazi
    10

scxiazi   73 天前

这打印的是对象

amok
    11

amok   73 天前

应该只是打印的问题,看看打印的代码是怎么写的,是否打印的 toString ?这里应该用拦截器打印 http 报文。
Vegetable
    12

Vegetable   73 天前   ❤️ 2

还建议看 okhttp 文档呢?这显然是需要重学 java 啊
lychs1998
    13

lychs1998   73 天前

这是 toString 出来的结果吧。看看有没有实体类自己输出 jsonStr 的方法。
unco020511
    14

unco020511   73 天前

你这是对象的 toSting(),不是 json

Android 对 JVM 生态圈的兼容*限在哪里?

*近才意识到,实际上当年 Google 仅仅是把 Java 的 api 接口搬了过来,接口下面的代码完全重新写了一遍,虚拟机也是完全自己实现。这样的东西从标准来说应该不能算 JDK,本质其实是语法像 java 语言的全新语言。在当时确实可以把 java 生态圈里的很多东西,直接拿来用。

但是,我的疑惑是,这样的实现,它的技术*限在哪里,Google 是否真的做到了二进制级别的兼容?

12 条回复    2021-04-09 11:49:43 +08:00
guyeu
    1

guyeu   1 天前

显然没有,语法层面的兼容都没有做到,所以很多库会同时有 jre 版本和 android 版本。另外,Google 也复用了一大堆 JDK 的原始代码,后来因为官司问题都替换成了自己的实现而已。
abcbuzhiming
    2

abcbuzhiming   21 小时 32 分钟前

@guyeu 能不能举个同时有 jre 版本和安卓版本库的例子
guyeu
    3

guyeu   21 小时 25 分钟前

@abcbuzhiming #2 *著名的大概就是 guava 了
iminto
    4

iminto   20 小时 19 分钟前

@guyeu 这个例子不应该被认为是 API 不兼容导致,它的安卓版本是做了内存方面的优化和编码风格的改变,虽然某些 API 确实输出上有不同,但是 android 在语法层面应该认为是兼容某个特定 JRE 的。
ychost
    5

ychost   20 小时 8 分钟前

Guava 还好,后面 JDK 都借鉴了相关 api 比如 Optional,Future 之类的
wobuhuicode
    6

wobuhuicode   20 小时 7 分钟前

我记得 12 年刚学安卓 2.X 开发的时候,很多底层就是 JDK 的,好像安卓 4.4 之后才全部换过来。
bigbyto
    7

bigbyto   20 小时 6 分钟前

应该是取决于 android 的虚拟机。 很久没接触安卓,像早期的 dalvik 虚拟机,dex 是由 jvm bytecode(class 文件)转译过去的,因此一些新的 jvm 特性(如 invokedynamic 指令)需要等待安卓的虚拟机进行兼容,才能在代码中使用 lambda 表达式。
guyeu
    8

guyeu   19 小时 39 分钟前

@iminto #4 的确,guava 的 android 和 jre 版本更多在于编码风格和特定于 android 的优化。android 在编写和编译的层面也兼容某一个特定的 java 版本,可以说合法的 java 代码就是合法的 android 代码。不同的是运行时。
cjh1095358798
    9

cjh1095358798   19 小时 0 分钟前

android 符合 jvm 规范
ikas
    10

ikas   16 小时 46 分钟前

android 就是一个独立的平台,本身也是事实分裂了 java 生态,并且 android 的虚拟机不符合 jvm 规范,安卓跑的是 dex,jvm 跑的是 class, java 代码是先编译成 class,然后再转换成 dex.
ikas
    11

ikas   16 小时 33 分钟前

置于兼容,他根本不需要符合 jvm,同样也不需要去完整兼容,事实也是,他现在 java8 兼容完整了吗?
chenyu8674
    12

chenyu8674   1 小时 46 分钟前

java 程序员随便学两下就可以去写 Android,算不算另一种形式的“兼容”

android 打包 aar,第三方远程依赖无法打入包内

试过很多方法,fat-aar-android 打包之后,还是没有打入包内,请大佬指教

16 条回复    2021-02-02 16:36:10 +08:00
anxiousPumpkin
    1

anxiousPumpkin   69 天前

这 是不是应该贴一点信息或特征出来?
JayFang1993
    2

JayFang1993   69 天前

https://github.com/kezong/fat-aar-android 亲试有效,可能你的姿势不对
ZoteTheMighty
    3

ZoteTheMighty   69 天前

@JayFang1993 正解,打 jar 或者 aar 包时如果是远程的依赖 as 不会打进包里,要用这个插件,或者下载下来手动依赖。apk 包就可以。
chenjiajia9411
    4

chenjiajia9411   69 天前

也有可能是你开了 minifyEnabled 然后被优化掉了。
hotlook10
    5

hotlook10   69 天前

@JayFang1993
我们用的就是这个,打包的库引用了 Retrofit
集成进去之后调用会报错
java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)
hotlook10
    6

hotlook10   69 天前

@ZoteTheMighty 因为 retrofit 依赖 okhttp 的,所以会报上述错误,有解决方案吗

java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)

hotlook10
    7

hotlook10   69 天前

@anxiousPumpkin

打包的库引用了 Retrofit,集成进去之后调用会报错,因为 retrofit 依赖 okhttp 的,所以会报上述错误,请问下有解决方案吗
java.lang.NoClassDefFoundError: Failed resolution of: Lokhttp3/HttpUrl;
at retrofit2.Retrofit$Builder.baseUrl(Retrofit.java:506)
at com.zh.pocket.base.http.impl.RetrofitCallFactory.<init>(RetrofitCallFactory.java:20)
at com.zh.pocket.base.http.impl.ApiFactory.<init>(ApiFactory.java:23)
at com.zh.pocket.base.http.impl.ApiFactory.<clinit>(ApiFactory.java:16)
at com.zh.pocket.base.http.impl.ApiFactory.create(ApiFactory.java:41)

JayFang1993
    8

JayFang1993   69 天前

@hotlook10 姿势不对 我之前是可以的
hotlook10
    9

hotlook10   69 天前

@JayFang1993 换了 3 种体位了
xmt328
    10

xmt328   69 天前

不建议把外部依赖打进去,让使用方自己去导入相关依赖
HangoX
    11

HangoX   69 天前

我提供另外一个思路吧,普通发布之后,新建一个 java 项目依赖这个依赖,然后打 war 包,这个时候你这个包需要的依赖都会出现在 war 包中,只是不是都在 aar 中,但是能都导入
katana97
    12

katana97   66 天前

先把 aar 传到 maven 仓库里,再引用就有了
hotlook10
    13

hotlook10   66 天前

@katana97 这种,我不知道怎么做混淆。。。
AoEiuV020
    14

AoEiuV020   65 天前

记得某个版本 android studio 有一个相关 bug, 其他没头绪的话更新 as 试试,
AoEiuV020
    15

AoEiuV020   65 天前   ❤️ 1

https://issuetracker.google.com/issues/140508065
as3.5.0 提的 bug,3.6.0 解决的,版本在这范围的话先更新 as 再说,
hotlook10
    16

hotlook10   64 天前

@AoEiuV020 好的,谢谢,我试试