前言

在推荐中看到了这篇文章 《运用ComposeDesktop开发一款桌面端多功能APK东西》 感觉这个东西很不错,自己也会用到。早就知道Compose可以跨平台了,也写过Flutter,不知道和Flutter Desktop哪个好用。

正好,趁这个时机,自己也动手写一个符合自己事务需求的APK东西。

效果

Compose for Desktop桌面端简单的APK工具
没错,主题布局颜色不能说和 《运用ComposeDesktop开发一款桌面端多功能APK东西》很像,几乎就是如出一辙,哈哈哈。

但功能比较,这个就差许多了。《运用ComposeDesktop开发一款桌面端多功能APK东西》是互联网一整套APK打包流程。由于咱们应用是内网环境,结合本身需求和发布流程(水平有限 0-0),开发了一个简略的APK东西。功能也主要集中在 APK签名部分!

APK打包

主要是通过代码跳转到浏览器的 Jenkins 打包,也没什么好说的了。

Desktop.getDesktop().browse(URI("http://..."))

Compose for Desktop桌面端简单的APK工具

APK加固

加固部分用的是 360加固助手,由于没有会员,不能运用命令行执行,也只能享受最简略的dex加固。想着自己来完成dex加密加壳,水平有限,暂时没有完成!希望有相关经验的小伙伴给予辅导,万分感谢!

APK签名

签名部分

签名用的是官方的 apksigner。目前是V3级。

Compose for Desktop桌面端简单的APK工具

文件挑选器

运用的是 JFileChooser 。假如文件和文件夹都可以挑选,fileSelectionMode 设置成 JFileChooser.FILES_AND_DIRECTORIES

文件拖拽

《运用ComposeDesktop开发一款桌面端多功能APK东西》中博主现已贴出了主要代码。但有几个点博主没有细说,这儿弥补一下:

  • ComposeWindow,这个window应该是 main() applicationFrameWindowScopewindow。用大局的 window 去添加一个 JPanel
  • DropTarget,这个target 要赋值给 window 中 Component 的 dropTarget。如:window.contentPane.getComponent(1).dropTarget = target
  • window 的 contentPane 会有多个,需求找到自己想要可以拖拽区域的 JPanel 并进行 target 赋值。如:window.contentPane.getComponent(1)

完整代码:

@Composable
fun DropBoxPanel(
    modifier: Modifier,
    window: ComposeWindow,
    component: JPanel = JPanel(),
    onFileDrop: (String) -> Unit
) {
    val dropBoundsBean = remember {
        mutableStateOf(DropBoundsBean())
    }
    Box(
        modifier = modifier.onPlaced {
            dropBoundsBean.value = DropBoundsBean(
                x = it.positionInWindow().x,
                y = it.positionInWindow().y,
                width = it.size.width,
                height = it.size.height
            )
        }) {
        LaunchedEffect(true) {
            component.setBounds(
                dropBoundsBean.value.x.roundToInt(),
                dropBoundsBean.value.y.roundToInt(),
                dropBoundsBean.value.width,
                dropBoundsBean.value.height
            )
            window.contentPane.add(component)
            //https://dev.to/tkuenneth/from-swing-to-jetpack-compose-desktop-2-4a4h
            val target = object : DropTarget() {
                @Synchronized
                override fun drop(evt: DropTargetDropEvent) {
                    evt.acceptDrop(DnDConstants.ACTION_REFERENCE)
                    val droppedFiles = evt.transferable.getTransferData(DataFlavor.javaFileListFlavor) as List<*>
                    droppedFiles.first()?.let {
                        onFileDrop.invoke(it.toString())
                    }
                }
            }
            window.contentPane.getComponent(1).dropTarget = target
        }
        SideEffect {
            component.setBounds(
                dropBoundsBean.value.x.roundToInt(),
                dropBoundsBean.value.y.roundToInt(),
                dropBoundsBean.value.width,
                dropBoundsBean.value.height
            )
        }
        DisposableEffect(true) {
            onDispose {
                window.contentPane.remove(component)
            }
        }
    }
}

效果:

Compose for Desktop桌面端简单的APK工具

APK上传到手机

手机APK需求传到定制手机衔接VPN发布,就是那么独特。这个本来想做一个adb读取手机内存卡的东西呢,最终仍是算了吧,直接用电脑驱动读取复制粘贴不香吗…

最终

东西十分简略,满足现在事务的发包需求。 Compose 开发,仍是那个味,仅仅增加了window的一些内容。Android的许多东西都能拿来用,比如:Retrofit。 比较较Flutter 的 Dart,Compose 用起来就太爽了。Flutter的 widget 太多了。有利有弊,Flutter多就相对完善一些,Compose for Desktop库就少许多。

参阅

《运用ComposeDesktop开发一款桌面端多功能APK东西》