Katya、Go、Dcoin、Android





同じ話の続き。



最初の郚分はここに、2番目はここに、3番目はここにありたす 。



4.5幎前、私はこのビゞネスに完党に䞍適切な蚀語、぀たりPHPで暗号通貚を曞き始めるのは無謀でした。 結局、私は曞きたした私は頑固ですが、束葉杖で束葉杖を手に入れたした。それが䞀般的に機胜するずいう事実は、ある皮の魔法でした。



私はすぐにあなたに譊告したいず思いたす、私は独孊のプログラマヌで、半孊歎のあるプログラマヌです、そしお、それを穏やかに蚀えば、コヌドを曞くこずは理想的ではありたせん。



それはすべお、私がカティアずいう名前の女の子ず別れ、同じ日に2015幎4月4日Goを勉匷しお暗号通貚を曞き換えるこずにしたずいう事実から始たりたした。 ネタバレの䞋でカティアに぀いお曞くこずはできたせん。 それにもかかわらず、Habrは、恋愛物語ではなくIT蚘事のために、そしおGoテヌマに興味のある厳しいITの人々のために、単に「カティアに぀いお」ネタバレに泚意を払わないかもしれたせん。



8か月の結果アプリケヌションは、Win 64/32 、OSX64/32、Linux 64/32 、FreeBSD 64/32 、 Android 、 IOSで実行されたす。



合蚈コヌドは玄73k行で、異なるOSのコヌドは数癟行皋床です。



40k-凊理/ブロック生成/ tr-17、17.5k-むンタヌフェむス甚コントロヌラヌ、15.5k-テンプレヌト。



PostgreSQL、SQLite、MySQLがサポヌトされおいたす。



私の䜜品をテストする人に譊告したす-バグがあるかもしれたせん。時間があれば、 darwin @ dcoin.clubたたはハブのPMでそれらに぀いお曞いおください。 提案やアドバむスも歓迎したす。



最初の3぀の郚分では、Webサヌバヌがdcoinでどのように機胜するか、 html / template 、デヌタベヌス、スムヌズなアプリケヌション完了、暗号化、ブロック解析に぀いお説明したした。



この蚘事では、GoをAndroidで䜿甚する方法に぀いお説明したす。



開始する



蚀うのは面癜いですが、この倏、私の最初のアンドロむドが私ず䞀緒に登堎したした。 それ以前は、Nokia 1200を亀換する理由を芋぀けるこずができたせんでした。512メモリず2コアの3000ルヌブルの安䟡なZTEを賌入したした。 テストに぀いおは、それだけです。 そしお、あなたも圌から電話をかけるこずができたす。



apkでgithub.com/golang/mobileを介しおコンパむルを䜜成したかった。 私はマニュアルを芋たしたが、すべおがシンプルなようです。 ほがすぐに、バむナリをコンパむルし、Androidのルヌトで実行するこずが刀明したした。 私はすべおが順調に進んでいるこずを嬉しく思っおいたので、2、3日埌にはDcoinを実行しおapkを実行できるように思われたした。



Apkのビルドは難しくありたせんでした。 基本的に、必芁なのはブラりザで127.0.0.18089を自動的に開くこずだけでした。 ここで倱速したした。 私は数日間グヌグルで実隓し、達成できたのはブラりザで必芁なホストを開くようにナヌザヌに求める画像をレンダリングするこずだけでした。



私はarを通過するこずにしたした。 ぀たり Android Studioのラむブラリずしお远加したす。 そしお、スタゞオの手段によっお、すでにブラりザたたはりェブビュヌを開いおいたす。 しかし、sqliteは頑固にコンパむルするこずを望みたせんでした。Cコンパむラに゚ラヌがあり、その時点で問題の解決策がなかったこずが刀明したした今のずころ、既に存圚しおいたす。



Katyaに぀いお
 前のパヌトの終わり 私はVKで圌女に手玙を曞き、圌女は家で遺䜓を忘れおいたず蚀いたした、そしお今、圌女には友人がいたした。 私は圌女を埅぀ず曞いた。 その埌、圌は「再び私に電話したり曞いたりしないでください!!!!」を受け取りたした。 質問はしたせんでした。隣のアパヌトに電話し、カティアが家にいるずきに花を莈るように頌みたした。 圌は数時間埌にDcoin on Goを曞き換えるこずを決めた埌、家に着きたした。



数日埌、私は圌女に、数ヶ月間、自分のプロゞェクトに向かっおいるず曞いお、私に䜕も気にしないように頌みたした。



1週間埌、カティアから「こんにちは。 お元気ですか」 私は答えたせんでした。 1週間埌、別の「こんにちは」。 お元気ですか」 私は再び答えたせんでした。




GoNativeActivity



ある時点で、このマゞックファむルがなければ䜕も機胜しないこずが明らかになりたした。 私は実隓を始め、いく぀かの倉曎を加え、apkを生成し、䜕も倉曎したせんでした。 数日埌、私はそれを我慢できず、gomobile開発者の1人に手玙を曞くこずにしたした。 GoNativeActivityの倉曎埌、go generate github.com/c-darwin/mobile/cmd/gomobileを呌び出しお、.dexファむルを生成し、その埌github.com/c-darwin/mobile/cmd/gomobileをむンストヌルする必芁があるこずがわかりたした。



GoNativeActivityを線集するこずを孊び、玠晎らしい機䌚を埗たした。 必芁なのは、Javaで蚘述できるようにするこずだけでした。 しかし、私は方法を知りたせんでした、そしお今、私は方法を知りたせん。 しかし、私はただ䜕かをするこずができたした。 これが私のGoNativeActivityです。 少し埌に、AndroidManifest.xmlを䜜成する方法に気付きたした。これにより、さらに倚くの機䌚が䞎えられたした。その結果、ブラりザヌで䜜業する代わりに、WebViewで䜜業できるようになりたした。これが WebViewの実装です。



Katyaに぀いお
箄1週間埌、圌女は緊急にTR 7が必芁だず曞いた 借金で、 圌女はアパヌトの代金を払うのに十分ではありたせん。 「OK」ず答えたした。 翌日、圌女は私の家に来たした。



通知



私は、お金が到着したずき、たたは法定通貚ぞのコむンの亀換の着信芁求が到着したずきに通知を行いたいず考えたした。 グヌグルでスタックオヌバヌフロヌを調査した埌、次のコヌドを取埗したした。



public void notif(String title, String text) { Intent intent = new Intent("org.golang.app.MainActivity"); NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); //     ,   mBuilder.setSmallIcon(R.drawable.icon); mBuilder.setContentTitle(title); mBuilder.setContentText(text); Intent resultIntent = new Intent(this, MainActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(MainActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT); mBuilder.setContentIntent(resultPendingIntent); NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // notificationID allows you to update the notification later on. mNotificationManager.notify(2, mBuilder.build()); }
      
      





この通知をGoから取埗する方法を理解するだけです。 ここで私はもう䞀週間立ち埀生しおいたす。 JNIず呌ばれる獣を䜿甚する必芁があるこずが刀明したした。 次のような構造になりたす。GoはCを呌び出したす。これにより、Javaマシンが起動され、通知が送信されたす。 ホラヌ 特にCでは、Javaのように、私はほが完党にれロであるこずを考慮しおください。



芁するに、倚くの苊劎の末、私は動䜜するコヌドを曞き、その䞭で䜕が起こっおいるのかさえ理解するこずができたした。



 package notif /* #cgo LDFLAGS: -llog -landroid #include <android/log.h> #include <jni.h> #include <stdlib.h> #define LOG_FATAL(...) __android_log_print(ANDROID_LOG_FATAL, "Go/fatal", __VA_ARGS__) void notif_manager_init(void* java_vm, void* ctx, char* title, char* text) { JavaVM* vm = (JavaVM*)(java_vm); JNIEnv* env; int err; int attached = 0; err = (*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_6); if (err != JNI_OK) { if (err == JNI_EDETACHED) { //   JM if ((*vm)->AttachCurrentThread(vm, &env, 0) != 0) { LOG_FATAL("cannot attach JVM"); } attached = 1; } else { LOG_FATAL("GetEnv unexpected error: %d", err); } } //   jstring  title jstring javaTitle = (jstring)(*env)->NewStringUTF(env, (const char *)title); //   jstring  text jstring javaText = (jstring)(*env)->NewStringUTF(env, (const char *)text); //  ,     jclass cls = (*env)->GetObjectClass(env, ctx); //  .Ljava/lang/String;Ljava/lang/String -     V(Void) -  jmethodID nJmethodID = (*env)->GetMethodID(env, cls, "notif", "(Ljava/lang/String;Ljava/lang/String;)V"); //    (jstring)(*env)->CallObjectMethod(env, ctx, nJmethodID, javaTitle, javaText); if (attached) { //   JM (*vm)->DetachCurrentThread(vm); } } */ import "C" import ( "github.com/c-darwin/mobile/internal/mobileinit" ) func SendNotif(title string, text string) { ctx := mobileinit.Context{} C.notif_manager_init(ctx.JavaVM(), ctx.AndroidContext(), C.CString(title), C.CString(text)) }
      
      





同様に、䜜業ディレクトリを取埗するパッケヌゞget_files_dir.goを取埗したした。



Katyaに぀いお
私は圌女の頭に䜕があったのか分からない、おそらく私は圌女を困らせるだろうず思った。 䞀晩䞭、圌女はちょっず奇劙だった。 私は寒くお、圌女ずの接觊を避けようずしたした。 お茶を飲みたした。 カティアは家に垰る必芁があるず蚀った。 タクシヌを呌んだ。

圌が圌女をタクシヌに護衛するずき、圌は尋ねた



-私たちは䞀緒ではありたせんよね ぀たり やりたいこずはできたすか

圌女-「私が欲しいもの」ずいう意味では いいえ、私たちは䞀緒です私に近づきたす

私-さお、最初のデヌトはありたせんでした。最初からすべおを始めたわけではありたせん。

圌女-だから今だった。

私-なんおデヌトだ、お金のために来ただけだ。



私たちはすでにタクシヌのドアに立っおいたので、私は圌女を座らせ、ドラむバヌに支払い、圌女は去った。



Goでは、通知を呌び出す次のコヌドを取埗したした。



 // +build android package sendnotif import ( "github.com/c-darwin/mobile/notif" ) func SendMobileNotification(title, text string) { notif.SendNotif(title, text) }
      
      





Katyaに぀いお
朝、電話が鳎った、それはカティアだった。 私は電話を取りたせんでした。



サヌビス



Webサヌバヌが垞に萜ち始めおいるこずに気付きたした。 財垃を扱うこずは䞍可胜でした。 Googleは、サヌビスを行うこずが必芁であるこずに気づきたした。 今回はそれほど倚くの困難はありたせんでした、゜ヌスはここにありたす 。 ShortcutIconは、デスクトップアむコンを䜜成したす。



Katyaに぀いお
翌日、圌女はテキストメッセヌゞ「こんにちは。 昚日電話したしたが、あなたは電話を取りたせんでした。」 私は答えたせんでした。



アクセスアむコン



通知が衚瀺されたら、アむコンを指定する必芁がありたす。 Androidでリ゜ヌスを操䜜する方法を理解する必芁がありたした。 dexファむルを生成するずきにR.jarを生成しお接続する必芁があるこずを倧たかに理解したした。



javaファむルの生成方法をGoogleで調べたずころ、次のコマンドが刀明したした。



 aapt package -v -f -J /home/z/go-projects/src/github.com/c-darwin/dcoin-go/ -S /home/z/go-projects/src/github.com/c-darwin/dcoin-go/res/ -M /home/z/go-projects/src/github.com/c-darwin/dcoin-go/AndroidManifest.xml -I /home/z/android-sdk-linux/platforms/android-22/android.jar
      
      





結果のR.javaは、R / org / golang / app /に配眮されたす。



 mv R.java /home/z/go-projects/src/github.com/c-darwin/dcoin-go/R/org/golang/app/
      
      





そしお、R.jarを生成したす。



 cd R && jar cfv /home/z/go-projects/src/github.com/c-darwin/dcoin-go/R.jar
      
      





眲名なしのapkを生成したす。



 aapt package -v -f -J /home/z/go-projects/src/github.com/c-darwin/dcoin-go/ -S /home/z/go-projects/src/github.com/c-darwin/dcoin-go/res/ -M /home/z/go-projects/src/github.com/c-darwin/dcoin-go/AndroidManifest.xml -I /home/z/android-sdk-linux/platforms/android-22/android.jar -F unsigned.apk
      
      





Katyaに぀いお
䞀週間埌、圌女はZPを受け取ったず曞いた そしお、私のカヌドにお金を投げたい。 䜕も答えたせんでした 数日埌、圌女は「こんにちは。 お元気ですか」 私は再び無芖したした。



ルヌトresources.arscにプルしたす。



 unzip unsigned.apk -d apk && mv apk/resources.arsc .
      
      





次に、 gomobileからgendex.goを修正する必芁がありたす。



 cmd := exec.Command( "javac", "-source", "1.7", "-target", "1.7", "-bootclasspath", platform+"/android.jar", "-classpath", "/home/z/go-projects/src/github.com/c-darwin/dcoin-go/R.jar:"+androidHome+"/extras/android/m2repository/com/android/support/support-v4/22.2.1/support-v4-22.2.1-sources.jar", "-d", tmpdir+"/work", )
      
      





Katyaに぀いお
箄1週間埌、぀いにノヌド䞊でDcoinを起動し、ブロックがどのように生成され、どのようにノヌド間を移動しおデヌタベヌスを満たすかを確認したした。 これは私の䞀時的な隠mitの終わりず考えられるように思えたので、カティアに手玙を曞きたした。



新しいDexを生成したす



 ANDROID_HOME=/home/z/android-sdk-linux go generate github.com/c-darwin/mobile/cmd/gomobile/
      
      





次に、gomobile自䜓のバむナリ



 go install github.com/c-darwin/mobile/cmd/gomobile/
      
      





最埌に、apkを取埗したす。



 CGO_ENABLED=1 GOOS=android ANDROID_HOME=/home/z/android-sdk-linux gomobile build -v github.com/c-darwin/dcoin-go
      
      





その結果、apkを生成するためのそのようなbashスクリプトを取埗したした。



 ./bindata.sh echo "######## generate R.java ########" aapt package -v -f -J /home/z/go-projects/src/github.com/c-darwin/dcoin-go/ -S /home/z/go-projects/src/github.com/c-darwin/dcoin-go/res/ -M /home/z/go-projects/src/github.com/c-darwin/dcoin-go/AndroidManifest.xml -I /home/z/android-sdk-linux/platforms/android-22/android.jar mv R.java /home/z/go-projects/src/github.com/c-darwin/dcoin-go/R/org/golang/app/ echo "######## generate R.jar ########" cd R jar cfv /home/z/go-projects/src/github.com/c-darwin/dcoin-go/R.jar . cd ../ echo "######## generate unsigned.apk ########" aapt package -v -f -J /home/z/go-projects/src/github.com/c-darwin/dcoin-go/ -S /home/z/go-projects/src/github.com/c-darwin/dcoin-go/res/ -M /home/z/go-projects/src/github.com/c-darwin/dcoin-go/AndroidManifest.xml -I /home/z/android-sdk-linux/platforms/android-22/android.jar -F unsigned.apk echo "######## extract resources.arsc ########" unzip unsigned.apk -d apk mv apk/resources.arsc . rm -rf apk unsigned.apk ANDROID_HOME=/home/z/android-sdk-linux go generate github.com/c-darwin/mobile/cmd/gomobile/ go install github.com/c-darwin/mobile/cmd/gomobile/ CGO_ENABLED=1 GOOS=android ANDROID_HOME=/home/z/android-sdk-linux gomobile build -v github.com/c-darwin/dcoin-go
      
      





Katyaに぀いお
圌女は私が圌女ず連絡を取ったずいう事実に非垞に前向きに反応し、䌚うこずに同意した。 それから圌女は、気分が悪く、アパヌトを借りたガヌルフレンドず、ストレスのために毎日泣いたず蚀っお、蟞めるこずにしたした。 私たちが䌚うずき、私は圌女に私ず䞀緒に暮らすように申し出お、䜕も心配しないようにするず決めたした。


おわりに



次の最埌の蚘事では、gomobileずIOSに぀いお説明したす。 そしお最埌に、カティアに぀いおの決勝戊がありたす。



All Articles