亂七八糟的自學(xué)(dart---flutter---android---AOP)


dart---flutter---android的框架...

其實(shí)還是因為新公司比較閑...

Dart

  • dynamicObject:

    1. dynamic更像是一種泛式偷仿,不屬于任何類型共耍,而object則在Dart中屬于基類

    2. dynamic的話可能需要注意傳入的類型判斷,object不用

  • finalconst

    1. final和const都只能定義變量一次葫录,不可以再修改值

    2. final修飾的是變量是第一次使用時被初始化,const修飾的是編譯時的常量

  • 函數(shù)式編程吴超,其實(shí)可以看成像js或者rxjava那種奴烙,講一個方法當(dāng)作對象來傳入其他對象中。在dart中方法其實(shí)也是一個基本數(shù)據(jù)類型:Function(感覺上就像kotlin的攜程蜕煌,都是可以理解為回調(diào)

  • 若要讓函數(shù)當(dāng)作對象來傳遞派阱,需要想進(jìn)行聲明typedef(這點(diǎn)又跟c++有點(diǎn)像,c++是傳遞函數(shù)指針斜纪,dart傳遞函數(shù)對象)

  • 異步 FutureStream

    1. Future只能接收一次異步的結(jié)果贫母,接收到將直接執(zhí)行下一步,然后結(jié)束盒刚,而stream可以接受多次

    2. Future有 then 腺劣,whenCompletecatchError 因块, wait等關(guān)鍵字橘原,跟rxjava的Observable非常相似的用法

Flutter

Widget

  • Widget其實(shí)相當(dāng)于View,只不過在Flutter中涡上,Widget變化將依賴State<Widget>

Android

與JS/H5互相通信的第三方框架JsBridge

  • 利用一個事件總線機(jī)制(突然好多東西都用的這種方式,android本身啦趾断,EventBus之類的,可能因為好管理吩愧?芋酌?),

  • 需要先進(jìn)行一下js->android的轉(zhuǎn)義(通過 java.net.URLEncoder )

  • 每一個url對應(yīng)一個CallbackFunction,然后再將這些對應(yīng)關(guān)系存在HashMap里

AOP

面向切面編程

  • 其實(shí)是一種思想雁佳,可以簡單理解為攔路虎或者斯芬克斯脐帝,需要過了考驗(也就是AOP切入點(diǎn))之后,才能繼續(xù)支持之前的操作
  • 詳細(xì)的已經(jīng)有人寫了(暫時項目用不上...所以懶...)甘穿,貼上地址

  • 用于重復(fù)點(diǎn)擊腮恩,業(yè)務(wù)處理前的校驗等一些前置的同步同時在同一線程同一進(jìn)程下的任務(wù)

  • 常用Aspect

線程安全

SparseArray

鏈接

Gradle

一鍵打包出release包+360加固簽名

若是新建gradle, 記得在app目錄下的build.gradle開頭做引入

https://blog.csdn.net/u012999651/article/details/105764812中修改

 // 把敏感信息存放到自定義的properties文件中
 def  propertiesFile  =  rootProject.file("release.properties")
 def  properties  =  new  Properties()
 properties.load(new  FileInputStream(propertiesFile))
 ?
 ext {
  // 簽名配置
  signing  = [keyAlias : "yourKeyAlias",
  keyPassword : "yourKeyPassword",
  storeFile : "yourStoreFileLocal",
  storePassword:  "yourStorePassword"
  ]
 ?
  // app相關(guān)的配置
  app  = [
  //默認(rèn)release apk的文件路徑,因為加固是基于release包的
  releasePath : "${project.buildDir}/outputs/apk/release",
  //對release apk 加固后產(chǎn)生的加固apk地址
  packersPath : "${project.buildDir}/outputs/apk/jiagu"
  ]
 ?
  // 360加固配置
  packers  = [account : properties['JiaguLoginName'], //賬號
  password : properties['JiaguPwd'],  //密碼
  jarPath : properties['JiaguDir']  //執(zhí)行命令的jar包路徑
  ]
 }
 ?
 /**
  *  360加固,適用于新后臺打包
  *  task名字可以自定義后温兼,通過android_studio創(chuàng)建一個task秸滴,兩個task同名即可
  */
 task  yourGradleCustomTaskName{
  group  'packers'
  dependsOn  'assembleRelease'
  doLast {
  //刪除加固后的渠道包
 //        deleteFile()
  // 尋找打包文件release apk
  def  releaseFile  =  findReleaseApk()
  if (releaseFile  !=  null) {
  println  "packers found release apk and start jiagu..."
  //執(zhí)行加固簽名
  packers360(releaseFile)
  //重命名加固后apk
  renameOutputApk()
  } else {
  println  'packers===can\'t find release apk and can\'t excute 360 jiagu'
  }
  }
 }
 ?
 /**
  *  對于release apk 進(jìn)行360加固
  */
 def  packers360(File  releaseApk) {
  println  'packers===beginning 360 jiagu'
  def  packersFile  =  file(app["packersPath"])
  if (!packersFile.exists()) {
  packersFile.mkdir()
  }
  exec {
  // 登錄360加固保
  executable  =  'java'
  args  = ['-jar', packers["jarPath"], '-login', packers["account"], packers["password"]]
  println  'packers===import 360 login'
  }
  exec {
  // 導(dǎo)入簽名信息
  executable  =  'java'
  args  = ['-jar', packers["jarPath"], '-importsign', signing["storeFile"],
  signing["storePassword"], signing["keyAlias"], signing["keyPassword"]]
  println  'packers===import 360 sign'
  }
  exec {
  // 查看360加固簽名信息
  executable  =  'java'
  args  = ['-jar', packers["jarPath"], '-showsign']
  println  'packers===show 360 sign'
  }
  exec {
  // 初始化加固服務(wù)配置,后面可不帶參數(shù)
  executable  =  'java'
  args  = ['-jar', packers["jarPath"], '-config']
  println  'packers===init 360 services'
  }
  exec {
  // 執(zhí)行加固
  executable  =  'java'
  args  = ['-jar', packers["jarPath"], '-jiagu', releaseApk.absolutePath, app["packersPath"], '-autosign']
  println  'packers===excute 360 jiagu'
  }
  println  'packers===360 jiagu finished'
  println  "packers===360 jiagu path ${app["packersPath"]}"
 }
 ?
 /**
  * 尋找本地的release  apk
  * @return true
  */
 def  deleteFile() {
  delete  app["packersPath"]
  println  'packers===delete all file'
 }
 ?
 /**
  * 創(chuàng)建時間標(biāo)簽
  * @return
  */
 def  createDateTip() {
  def  date  =  new  Date()
  def  formattedDate  =  date.format('yyyyMMddHHmm')
  return  formattedDate
 }
 ?
 /**
  * 首先打一個release包,然后找到當(dāng)前的文件進(jìn)行加固
  * @return releaseApk
  */
 def  findReleaseApk() {
  def  apkDir  =  file(app["releasePath"])
  File  releaseApk  =  apkDir.listFiles().find { it.isFile() &&  it.name.endsWith(".apk") }
  println  "packers===find release apk ${releaseApk.name}"
  return  releaseApk
 }
 ?
 ?
 /**
  * 重命名打包加固后的apk名稱
  */
 def  renameOutputApk() {
  File  oldApkDir  =  file(app["packersPath"])
  File  oldApk  =  oldApkDir.listFiles().find { it.isFile() &&  it.name.contains("jiagu") }
  def  newName  =  "app-${android.defaultConfig.versionCode}-${createDateTip()}-release.apk"
  println  "newName = ${newName}"
  copy {
  from  app["packersPath"] +  File.separator  +  oldApk.name
  into  app["packersPath"]
  rename(oldApk.name, newName)
  println  "packers===output pacckers ${newName}"
  }
  File  newApk  =  oldApkDir.listFiles().find { it.isFile() &&  it.name  ==  newName }
  oldApk.delete()
  println  "packers===output packers renameApk ${newApk.absolutePath}"
 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載募判,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者荡含。
  • 序言:七十年代末咒唆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子释液,更是在濱河造成了極大的恐慌全释,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误债,死亡現(xiàn)場離奇詭異浸船,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寝蹈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門李命,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人箫老,你說我怎么就攤上這事封字。” “怎么了耍鬓?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵阔籽,是天一觀的道長。 經(jīng)常有香客問我牲蜀,道長笆制,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任各薇,我火速辦了婚禮项贺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘峭判。我一直安慰自己,他們只是感情好棕叫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布林螃。 她就那樣靜靜地躺著,像睡著了一般俺泣。 火紅的嫁衣襯著肌膚如雪疗认。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天伏钠,我揣著相機(jī)與錄音横漏,去河邊找鬼。 笑死熟掂,一個胖子當(dāng)著我的面吹牛缎浇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赴肚,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼素跺,長吁一口氣:“原來是場噩夢啊……” “哼二蓝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起指厌,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤刊愚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后踩验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸥诽,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年箕憾,在試婚紗的時候發(fā)現(xiàn)自己被綠了牡借。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡厕九,死狀恐怖蓖捶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扁远,我是刑警寧澤俊鱼,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站畅买,受9級特大地震影響并闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谷羞,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一帝火、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湃缎,春花似錦犀填、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蹂季,卻和暖如春冕广,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背偿洁。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工撒汉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涕滋。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓睬辐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子溉委,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 特別說明 當(dāng)前博客平臺賬號已廢棄鹃唯,如果有使用細(xì)節(jié)問題請前往我新博客平臺進(jìn)行討論交流。 個人博客平臺 HuRuWo的...
    善篤有余劫閱讀 4,947評論 0 30
  • 附上原文作者連接:作者:金誠 一.榜單介紹 排行榜包括四大類: 單一框架:僅提供路由瓣喊、網(wǎng)絡(luò)層坡慌、UI層、通信層或其他...
    這個美嘉不姓陳閱讀 2,254評論 1 35
  • :移動開發(fā)簡介 一藻三、什么是原生開發(fā): 原生應(yīng)用程序是指某一個移動平臺(比如iOS或安卓)所特有的應(yīng)用洪橘,使用相應(yīng)平臺...
    shuo_fd6c閱讀 454評論 0 0
  • 一.榜單介紹 排行榜包括四大類: 單一框架:僅提供路由、網(wǎng)絡(luò)層棵帽、UI層熄求、通信層或其他單一功能的框架 混合開發(fā)框架:...
    偉子男閱讀 5,240評論 0 161
  • Flutter是谷歌的移動UI框架,可以快速在iOS和Android上構(gòu)建高質(zhì)量的原生用戶界面逗概。 Flutter可...
    奔跑吧李博閱讀 1,074評論 0 10