为了利用debug工具,大多数程序猿开发的时候使用AS的debug版本,最终发布版本是release版本,但是在这个转变的过程中可能会出现一些意外。
创新互联-专业网站定制、快速模板网站建设、高性价比临湘网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式临湘网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖临湘地区。费用合理售后完善,十多年实体公司更值得信赖。
1、releas版本与debug版本的applicationId不一样
为了客户端上两个版本共存,通常debug设置不同applicationId,这会导致需要填写applicationId申请的第三方平台使用不正常,比如小米推送和微信分享等。
2、混淆问题: 一般情况下,debug版本的混淆是关闭的,release版本是打开的
这个坑我是多次涉入。
(1)使用Gson或者FastGson 转换Json字符后提供给某些类使用,比如Adapter。Release版本发现列表不能正常显示,结果是因为混淆的时候没有keep相关的Entity类。
(2) 使用反射,利用类名调起类时,注意keep该类,防止混淆。
使用案例: Switch 分支很多,导致代码很长,阅读困难。因此把switch的String作为类名, 使用反射调起。有新的情况时,只需要增加新类,不需要看以前的分支,也不用放在一个类里面。
我是初学者小白,所以很多看法不深,理解也不够透彻。但是很适合小白们一起从低角度往高处探索。文中有错误的,感谢指正,一起进步。
趁着假期做一个Flutter的地图功能,因为后端选用了百度地图,所以前端没得挑。找了遍插件,并没有现成可用的。(不过发现了百度官方也自开发Flutter插件,目前功能只有一个获取本地位置信息,后期会继续增加吧?很期待!)
参考帖子:
这个实际上跟功能之间没太大关系,只是我按照个人摸索的过程来写。
当对一个“领域/知识块”完全不懂的时候,360°的方向都不确定的话。先了解基础概念,有利于你确定自己的摸索方向。
参考帖子:
中间我跳过了几十,上百个帖子的摸索过程。这个才是关键能够真正做事的参考。
因为百度的sdk还算是很完善的,所以一旦出问题,都会有对应的报错提示。
我是使用flutter插件:permission_handler,来解决安卓的动态授权问题,用法简单而且设计合理。
这个错误直接来看,就是签名有问题。怎么查看SHA1码和包名,这里不多说,网上有极其多的方法,百度Sdk开发指南里也有。没那么复杂,也没那么麻烦。按照流程操作就是对的。
实在不放心?跟我一样,flutter打包后,把apk反过来解SHA1码不就行了?
参考帖子:
红色框框基本就是帖子讲解的那样。
蓝色框框见下图:release标签里好像是自己设置了。所以debug标签里面,箭头指向的位置,是我多设置的一个参数。
uid: -1 appid -1 msg: httpsPost failed,IOException:Unable to resolve host "api.map.baidu.com": No address associated with hostname
这一步我是哭笑不得,一开始老是和问题(2)混淆,导致浪费很多时间。仔细阅读后,发现是不能连接到“api.map.baidu.com”。
我打开模拟器的chrome浏览器,发现不能上网。查看手机的dns是10.0.2.3(默认的),和家里wifi不一样,所以不能上网也正常,之前居然没发现这个问题!!!
终端执行:adb shell 和 getprop,就可以查看所有的属性参数了。(window小伙伴自行百度,这个没多大差别。如果你有多个设备,记得自己选好设备。)
在里面找到这一项,就是你的dns参数。有些人是net.dns1,我的是net.eth0.dns1。这个没关系,只是等下指令 稍微改动 就行。
修改dns指令:setprop net.eth0.dns1 192.168.2.1
后面的192.168.2.1是我自己的dns,这个根据自己的情况来填写。不懂的百度下怎么查看自己的dns。
虽然提示设置失败,但是回到模拟器一看,地图已经显示出来了。
嘿嘿,在flutter设定多大的区域,地图就是多大的区域。用起来就很方便了。
过程十分痛苦,因为对flutter不是很熟悉,对Android原生更是了解很少。所以自己就像突然不能讲话,被丢到一个陌生的环境,却要我去找一个人。所以细心很重要,一定要看清楚错误提示,不要错过每一个细节和可能性。
幸好最后解决了问题,开心~
其实如果你仔细阅读过百度官方的文档,会发现里面有关于 地图的生命周期管理 。然后在这里面没有提及到,这一点虽然没提,但不可或缺,小伙伴就自行思考吧。
最后还有一点,其实我的初衷是想实现一个百度地图的plugin,但是苦于能力有限,对Android的不熟悉,最后折戟。我不得已另起项目,然后重新实现地图sdk接入。经过这次对于这些有更多更全面的认知后,有空会再次研究flutter 插件的开发,共勉,奥利给!!!
Straybirdsofsummercometomywindowtosingandflyaway.Andyellowleavesofautumn,
whichhavenosongs,flutterandfalltherewithasign.
Otroupeoflittlevagrantsoftheworld,leaveyourfootprintsinmywords. Theworldputsoffitsmaskofvastnesstoitslover.Itbecomessmallasonesong,asonekissoftheeternal.
Itisthetearsoftheearththatkeephersmilesinbloom.
Themightydesertisburningfortheloveofabladeofgrasswhoshakesherheadandlaughsandfliesaway.
Ifyoushedtearswhenyoumissthesun,youalsomissthestars. Thesandsinyourwaybegforyoursongandyourmovement,dancingwater.Willyoucarrytheburdenoftheirlameness?
Herwishfulfacehauntsmydreamsliketherainatnight.
Oncewedreamtthatwewerestrangers.Wewakeuptofindthatweweredeartoeachother.
夏天的飞鸟,来到我的窗前,歌唱,又飞走了。秋天的黄叶,它们没有什么曲子可唱,一声叹息,飘落在地上。世界上一队小小的流浪者啊,在我的字里行间留下你们的足迹吧!
世界对着它的爱人,扯下它那庞大的面具。它变小了,小得宛如一首歌,小得宛如一个永恒的吻。
大地的泪珠,使她的微笑如鲜花般盛开。
广袤的沙漠,狂热追求一叶绿草的爱,但她笑着摇摇头,飞走了。
如果你因错过太阳而哭泣,那么你也会错过群星。
舞动着的流水啊,在你途中的泥沙,正乞求你的歌声,你的舞蹈呢!你是否肯背负跛足的泥沙向前奔腾?
她热切的脸,如夜晚的雨水,萦绕在我的梦中。
有一次,我们梦见彼此竟是陌生人。醒来时,才发现我们本是亲密无间。
Sorrowishushedintopeaceinmyheartliketheeveningamongthesilenttrees.
Someunseenfingers,likeanidlebreeze,areplayinguponmyheartthemusicoftheripples.
Whatlanguageisthine,Osea?”Thelanguageofeternalquestion.Whatlanguageisthyanswer,Osky?”
Thelanguageofeternalsilence.”
Listen,myheart,tothewhispersoftheworldwithwhichitmakeslovetoyou!
Themysteryofcreationislikethedarknessofnight—itisgreat.Delusionsofknowledgearelikethefogofthemorning.
Donotseatyourloveuponaprecipicebecauseitishigh.
Isitatmywindowthismorningwheretheworldlikeapasserbystopsforamoment,nodstomeandgoes.
Therelittlethoughtsaretherustleofleaves;theyhavetheirwhisperofjoyinmymind.
Whatyouareyoudonotsee,whatyouseeisyourshadow.
忧伤在我心中沉静下来,宛如降临在寂静山林中的夜色。
一些看不见的手指,如慵懒的微风,在我心上奏着潺潺的乐章。
“大海啊,你说的是什么?”“是永恒的质疑。”“天空啊,你回答的是什么?”“是永恒的沉默。”
听,我的心啊,听那世界的呢喃,这是它对你爱的召唤!
创造的神秘,有如夜的黑暗——它是伟大的,而知识的幻影却如清晨之雾。
不要因为峭壁的高耸,而让你的爱情坐在上面。
今天早晨,我坐在窗前,世界就如一个过客,稍歇片刻,向我点点头,便走了。
这些零碎的思想,是树叶沙沙之声;它们在我的心里,欢快地低语着。
你看不见自己,你所见到的只是自己的影子。
Mywishesarefools,theyshoutacrossthysong,mymaster.Letmebutlisten.
Icannotchoosethebest.Thebestchoosesme.
Theythrowtheirshadowsbeforethemwhocarrytheirlanternontheirback.
ThatIexistisaperpetualsurprisewhichislife.
We,therustlingleaves,haveavoicethatanswersthestorms,butwhoareyousosilent?”Iamamereflower.”
Restbelongstotheworkastheeyelidstotheeyes.
Manisabornchild,hispoweristhepowerofgrowth
Godexpectsanswersfortheflowershesendsus,notforthesunandtheearth..
Thelightthatplays,likeanakedchild,amongthegreenleaveshappilyknownotthatmancanlie.
Obeauty,findthyselfinlove,notintheflatteryofthymirror. Myheartbeatsherwavesattheshoreoftheworldandwritesuponithersignatureintearswiththewords,Ilovethee.
主啊,我的那些愿望真是傻透了,它们喧闹着穿越你的歌声。只让我聆听吧。
我不能选择那最好的。是那最好的选择
那些背着灯的人,他们的影子投到了前面。
我的存在,是一个永恒的惊奇,这就是人生。
“我们,簌簌的树叶,都应和着暴风雪。而你又是谁,如此沉默着?”“我只是一朵花。”
休憩之于工作,正如眼睑之于眼睛。
人是一个初生的孩子,成长是他的力量。
上帝企盼着我们的回答,乃是因为他送给了我们花朵,而不是阳光和大地。
光明游玩于绿叶丛中,好似一个赤裸的孩子,不知道人是可以撒谎的。
美啊,在爱中寻找你自己吧,别到你镜子的恭维里去寻觅。
在世界之岸,我的心随着她的涟漪搏动,我用热泪写就了她的名字:“我爱你。”
“Moon,forwhatdoyouwait?”“TosalutethesunforwhomImustmakeway.”
Thetreescomeuptomywindowliketheyearningvoiceofthedumbearth.
HisownmorningsarenewsurprisestoGod.
Lifefindsitswealthbytheclaimsoftheworld,anditsworthbytheclaimsoflove.
Thedryriverbedfindsnothanksforitspast.
Thebirdwishesitwereacloud.Thecloudwishesitwereabird.
Thewaterfallsings,“Ifindmysong,whenIfindmyfreedom.”
Icannottellwhythisheartlanguishesinsilence.Itisforsmallneedsitneverasks,orknowsorremembers.Woman,whenyoumoveaboutinyourhouseholdserviceyourlimbssinglikeahillstreamamongitspebbles.
Thesungoestocrossthewesternsea,leavingitslastsalutationtotheEast.
Donotblameyourfoodbecauseyouhavenoappetite.
Thetrees,likethelongingsoftheearth,standatiptoetopeepattheheaven.
“月儿啊,你在等候什么?”
“等待向太阳致敬,因为我得给它让路。”
绿树长到了我的窗前,仿佛是无言的大地发出饥渴的声音。
上帝感到自己的清晨无比新奇。
世界的需求使生命富裕起来,爱情的需求使之价值连城。
干涸的河床,并不感谢它的往昔。
鸟儿愿为一朵云。云儿愿为一只鸟。
瀑布歌唱着:“我得到自由时,也就有了歌声。”
我不懂这心为何静默地忍受煎熬。它是为了那不曾要求、不曾知晓、不曾记得的小小需求。
女人,你在料理家务的时候,你的手脚歌唱着,宛如山涧溪流歌唱着从卵石中流过。
当太阳横穿西海时,在东方留下他最后的致意。
当你没胃口时,不要抱怨食物。
绿树仿佛在表示对大地的渴望,踮起脚尖,窥视天空。
YousmiledandtalkedtomeofnothingandIfeltthatforthisIhadbeenwaitinglong. Thefishinthewaterissilent,theanimalontheearthisnoisy,thebirdintheairissinging.ButManhasinhimthesilenceofthesea,thenoiseoftheearthandthemusicoftheair.
Theworldrushesonoverthestringsofthelingeringheartmakingthemusicofsadness.
Hehasmadehisweaponshisgods.Whenhisweaponswinheisdefeatedhimself.
Godfindshimselfbycreating.
Shadow,withherveildrawn,followsLightinsecretmeekness,withhersilentstepsoflove.
Thestarsarenotafraidtoappearlikefireflies.
IthanktheethatIamnoneofthewheelsofpowerbutIamonewiththelivingcreaturesthatarecrushedbyit.
Themind,sharpbutnotbroad,sticksateverypointbutdoesnotmove.
Youridolisshatteredinthedusttoprovethatgod’sdustisgreaterthanyouridol.
Mandoesnotrevealhimselfinhishistory,hestrugglesupthroughit.
Whiletheglasslamprebukestheearthenforcallingitcousin,themoonrises,andtheglasslamp,withablandsmile,callsher,“Mydear,dearsister.”
你对我微笑着,沉默不语。我觉得,为了这个,我已等候很久。
水里的鱼儿沉默着,陆上的野兽喧哗着,天上的鸟儿歌唱着。然而,人类却兼有大海的沉默、大地的喧闹和天空的乐曲。
世界在缠绵的心弦上跑过,奏出忧伤的音乐。
他把自己的武器当做他的上帝。当武器胜利之时,他自己却失败了。
上帝从创造中找到了自己。
影子蒙上她的面纱,悄悄地,温柔地,用她沉默的爱的脚步,跟在“光”之后。
群星毫不畏惧自己会看似萤火虫。
感谢上帝,我不是一个权力的车轮,而是被压在它下面的一个生灵。
这意念是犀利的,不是开阔的,它执著于每一点,却并不动弹。
你的偶像消散在尘埃中,这足以证明神的尘埃比你的偶像还伟大。
人类不能在他的历史中表现自我,只能在这中间挣扎着向前。
玻璃灯责备瓦灯叫他表兄。但月亮出来时,玻璃灯却温柔一笑,叫月亮:“我亲爱的,亲爱的姐姐。” Likethemeetingoftheseagullsandthewaveswemeetandcomenear.Theseagullsflyoff,thewavesrollawayandwedepart.
Mydayisdone,andIamlikeaboatdrawnonthebeach,listeningtothedancemusicofthetideintheevening Lifeisgiventous,weearnitbygivingit.
Wecomenearesttothegreatwhenwearegreatinhumility.
Thesparrowissorryforthepeacockattheburdenofitstail.
Neverbeafraidofthemoments—thussingsthevoiceoftheeverlasting.
Thehurricaneseekstheshortestroadbythenoroad,andsuddenlyendsitssearchintheNowhere.
Takemywineinmyowncup,friend.Itlosesitswreathoffoamwhenpouredintothatofothers.
Theperfectdecksitselfinbeautyfortheloveoftheimperfect.
Godsaystoman,IhealyouthereforeIhurt,loveyouthereforepunish.Thanktheflameforitslight,butdonotforgetthelampholderstandingintheshadewithconstancyofpatience.
Tinygrass,yourstepsaresmall,butyoupossesstheearthunderyourtread.
Theinfantfloweropensitsbudandcries,揇earworld,pleasedonotfade.”
如海鸥与波涛相遇一般,我们邂逅了,靠近了。海鸥飞散,波涛滚滚而逝,我们也分别了。
我的白昼已经完了,我就像一只停泊在海滩上的小船,聆听着晚潮奏起的舞曲。
生命是上天赋予的,我们唯有献出生命,才能真正得到它。
我们最谦卑时,才最接近伟大。
麻雀为孔雀担忧,因为它不得不负担着硕大的尾翎。
决不要害怕“刹那”——永恒之声如此歌唱着。
飓风在绝路中寻找捷径,又突然地在“无影之国”终止了它的寻觅。
快在我的杯中饮了我的酒吧,朋友。若是倒入别人的杯里,这酒激荡的泡沫便要消失了。
“完美”为了对“不完美”示爱,把自己装扮得美丽至极。
上帝对人类说:“我治愈你,所以才伤害你;我爱你,所以才惩罚你。”
感谢火焰的光明,但是别忘了执灯人,他正坚韧地站在黑暗之中。
小草啊,你的足迹虽小,但你拥有脚下的土地。
小花绽放出蓓蕾,高喊着:“亲爱的世界啊,请不要凋零。”
1.夏天的飞鸟,飞到我的窗前唱歌,又飞去了。秋天的黄叶,它们没有什么可唱,只叹息一声,飞落在那里。Stray birds of summer come to my window to sing and fly away.And yellow leaves of autumn, which have no songs, flutter and fallthere with a sign.2.如果你因失去了太阳而流泪,那么你也将失去群星了。If you shed tears when you miss the sun, you also miss the stars.3.无垠的沙漠热烈追求一叶绿草的爱,她摇摇头笑着飞开了。The mighty desert is burning for the love of a bladeof grass whoshakes her head and laughs and flies away.
不久前,谷歌正式推出 Jetpack Compose 1.0 版本。近日,JetBrains 在此基础上发布了 Compose Multiplatform Alpha 版本,旨在将 Compose 扩展到桌面和 Web 端。
Compose Multiplatform 由 Compose for Desktop 和 Compose for Web 组成,通过 Kotlin Multiplatform 支持许多不同的平台。其中,Compose Desktop 采用 Google 的 Skia 图形库,来实现在 Windows、macOS 和 Linux 上的 UI 绘制,借此在所有支持的操作系统中提供统一的体验,类似于 Flutter 的做法。
根据 Kotlin 团队的说法,相比起 Electron 框架,Compose Multiplatform 在内存消耗、安装大小和 UI 渲染性能等方面将有更明显的优势。随着 Alpha 版本的发布,Compose Multiplatform 还收获了新的 Android Studio 插件,包括对在 IDE 中显示组件预览的支持以及许多附加功能。
我们希望通过本文帮助大家进一步了解 Compose 的跨平台能力,以及 JetBrains 将 Compose 从 Android 扩展到这些其他平台背后的主要驱动力是什么。
基于 Jetpack Compose 1.0
由谷歌打造的 Jetpack Compose 是一款用于在 Android 应用程序之内构建用户界面的官方框架,上周刚刚发布 1.0 版本。与此同时,Android Studio 代号“极狐”的首个稳定版 2020.3.1 也正式亮相。
尽管才刚迎来 1.0,但谷歌表示“目前 Play Store 中已经有超过 2000 款应用程序在使用 Compose——更重要的是,就连 Play Store 这款应用本身也在使用 Compose。”谷歌方面还表示,“我们一直在与一些顶级应用的开发人员进行合作,他们的反馈和支持帮助我们使 1.0 版本更加强大。”
Jetpack Compose for Android 迎来 1.0 版本
Compose 基于 Kotlin 开发,而 Kotlin 与 Android Studio(即官方指定的 Android IDE)均来自开发工具厂商 JetBrains。虽然 Jetpack Compose 专为 Android 打造(与谷歌的 Flutter 框架不同), 但 JetBrains 公司坚信 Compose 完全能够获得跨平台能力 。
Compose for Desktop: 这只是开始
Compose Multiplatform 可以说是该框架面向 MacOS、Linux、Windows 以及 Web 开设的一个端口,目前刚刚发布 1.0 Alpha 版本。虽然尚处于早期开发阶段,但 JetBrains 表示,其已经“为开发人员带来能够基本安全使用的稳定 API”。
TheRegister 就此事询问了 JetBrains 公司 Compose 项目负责人 Nikolay Igotti,希望了解为什么该公司在拥有了已经广泛应用于 IntelliJ IDEA IDE 及多种丰富变体的桌面应用程序跨平台 Java 框架之外,还要费力开发 Compose for Desktop。Igotti 的回答是,“旧有 Java 框架基本上就是修改版的 Swing。Swing 属于默认 JDK UI 框架,Swing 和 AWT(Abstract Windows Toolkit,抽象窗口工具包)。Compose 则完全是另一码事,当然我们也在设计中考虑到了互操作性需求……Swing 这套框架太陈旧了,最早出现在上世纪九十年代末。多年来人们对于 UI 的设计思路已经天翻地覆,Swing 显然满足不了要求了。”
JetBrains IDE 中的 Compose for Desktop 项目
Compose 与 Swing 有一个比较大的共同点:与其他使用本机控件的跨平台框架,比如例如 Java 的 SWT(Standard Widget Toolkit)以及微软的 Xamarin 有所不同,它们选择自主绘制控件。Compose 使用的 Skia 开源图形库,也在谷歌 Chrome、Flutter 及其他众多框架当中得到广泛应用。那这是否意味着 Compose 应用程序将没有自己的原生外观?对此,Igotti 的回应是,“这取决于开发人员的选择,取决于他们如何为应用程序设置主题。在这方面,Compose 的情况与 Flutter 等其他框架没什么区别。”
那 Compose for Desktop 应用程序是否依赖于 JVM(Java Virtual Machine)运行?Igotti 表示,“我们也知道,JVM 应用程序的发布情况可能比较棘手。因此我们提供自己的 Gradle 插件,其使用 jpackage 与 Jlink 以 JVM 应用程序为基础制作原生应用程序。Mac 的.dmg、Windows 的 MSI、Linux 的 deb 包等均可实现,大家用不着担心 JVM。”
也就是说,开发成果将会是一款被精心包裹起来的 JVM 应用程序。JetBrains 还有一款用于解决这个问题的 Kotlin/Native 编译器,“预计将在未来发布,或者专门用于桌面开发。”
对应用程序的另一种思考方式
那 Web 应用程序方面呢?Igotti 回应称,“我们使用 Kotlin/JS 编译器。”Compose 的 Web 版本不如桌面版先进,说明文档中也警告称“API 尚未最终确定,预计会发生重大变化。”此外,虽然 Web 版本确实使用 Compose 模型,但 API 却完全不同,而且会使用 HTML 与 CSS。所以,Web 版与 Compose for Desktop 之间能够共享的代码应该比较少。
据 Igotti 介绍,“Compose 代表着一种不同的应用程序思考方式。状态即 UI 的真实来源,而 UI 本身是无状态的,其表达永远由状态计算得出。在这方面,Compose for Web 采用一组相同的原语,完全相同的状态管理思路。但是对于具体的小部件集合与排列方式,Web 版与桌面版之间确实无法互通。”
说到这里,为什么要把 Compose for Android 扩展到多种其他平台之上?“Compose 的目标受众主要分为三类。首先是使用 Kotlin 与 Compose 的 Android 开发人员,他们希望把自己的开发成果交付至其他平台;其二是纯 Kotlin 开发人员,他们希望以‘一次编写、随处运行’的方式开发新的应用程序;第三则是那些不太熟悉 Kotlin 或者 Compose,但又希望开发出精美 UI 的用户,我们希望能为他们提供实现目标的工具。”
Igotti 并没有给出具体的发布日期,但表示自己希望 Beta 版能在今年秋天发布,“我们也希望能在今年之内推出 1.0 版本。”项目本身是完全开源的,“二十一世纪了,框架在大多数人们心目中就不应该收费。我们只是想开发一款长期缺失的软件”,补足 JetBrains 当前商业模式中的工具链。
那么,JetBrains 会在自己的其他工具中使用 Compose 吗?事实上,他们的 JetBrains Toolbox(用于管理已安装的 IDE)已经在使用 Compose,但 Igotti 表示短时间内 Compose 还无法取代 IntelliJ IDEA 等现有框架。“编辑器是其中最复杂也最重要的组件,经历了 20 年的发展演进,我们几乎不可能在中途进行重写了。无论是 JetBrains 还是我个人,都不打算强迫每个人都转而使用 Compose。我们的目标是为原有框架选项满足不了的用户提供新的解决方案。”
写在最后
那么,为什么除了 Flutter 之外,我们还需要另一个跨平台框架?虽然谷歌的 Flutter 最开始主要面向移动设备,但现在也开始向桌面及 iOS 进军,甚至比 Compose 还抢先了一步。不过,根据 StackOverflow 的最新调查, Flutter 使用的语言为 Dart;尽管 Dart 语言的人气正在增长(正是受到 Flutter 的推动),但仍然无法与 Kotlin 相提并论。
Compose 代表着一种独特的 UI 构建方法,也许最期待 Compose 跨平台功能的受众,正是那些曾在 Android 上使用过它、又特别喜欢这种 UI 构建体验的开发者。
想要进一步了解 Compose,国内 Android 开发者可访问以下链接查看中文手册:
延伸阅读: