カテゴリー別アーカイブ: Programming

Flutter, build.gradle Release


key.properties


keyAlias='key'
keyPassword=<password from previous step>
storeFile=<location of the key store file, such as /Users//key.jks>
storePassword=<password from previous step>

app/build.gradle


def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

signingConfigs {
release {
keyAlias keystoreProperties[‘keyAlias’]
keyPassword keystoreProperties[‘keyPassword’]
storeFile file(keystoreProperties[‘storeFile’])
storePassword keystoreProperties[‘storePassword’]
}
}

buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
useProguard true

proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
}
}

こちらを設定しても Build – Flutter – Build APK を実行すると、flutter storefile path may not be null or empty string. path=’null’ エラーが発生してAPKファイルが生成されません。

(rootPorject(your jroject))/android/app/key.jks を設置して、

keyAlias 'key', keyPassword '<password from previous step>', storeFile file('key.jks'), storePassword '<password from previous step>'

と直接指定すると正しく生成できるようになりました。''等は実際に使用するパスワードに置き換えます。

私の使用しているPC環境の問題かもしれません。passwordが流出することはないと思います。

Google Play License Verification (LVL)


Android Studio 3.5 でGoogle Play License Verification (LVL) をインポートする方法です。

  1. File – New – Import Module .. を選択して Source directory: に [ANDROID_SDK]/extras/google/market_licensing/library を指定します。Finishをクリックします。プロジェクト内にlibrary ディレクトリーが作成され、インポートされます。
  2. library/src/main/java/com を android/app/src/main/java/com にコピーします。
  3. AndroidManifest.xmlに次の要素を追加します。
<!-- Devices >= 3 have version of Google Play that supports licensing. -->
<uses-sdk android:minSdkVersion="3" />
<!-- Required permission to check licensing. -->
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />

Flutter, ‘which requires SDK version’ message


Windows の Android Studio で pubspec.yaml に、xml: ^3.6.0 を追加し、dartファイルに import 'package:xml/xml.dart' as xml;を追加すると次のようなエラーメッセージが表示されます。

The current Dart SDK version is 2.5.0.

Because (appname) depends on xml >=3.6.0 which requires SDK version >=2.6.0 <3.0.0, version solving failed.
Running "flutter pub get" in (appname) …
pub get failed (1)

次のコマンドをそれぞれ実行しました。

  • flutter doctor -v
  • flutter upgrade
  • flutter pub get
  • flutter channel master
  • flutter -v
  • flutter upgrade
  • flutter pub get

flutter -vを実行したところ

Checking Dart SDK version...
Downloading Dart SDK from Flutter engine (hash hex?)...
Unzipping Dart SDK...
Building flutter tool...
Running pub upgrade...
Manage your Flutter app development.
が表示されてダウンロードが始まりました。その後エラーメッセージが表示されなくなりました。2019-12-01の時点で xml: ^3.6.0は指定できないので xml: ^3.5.0を指定することになりました。
Because every version of flutter_test from sdk depends on xml 3.5.0 and xskytools_compact_app depends on xml ^3.6.0, flutter_test from sdk is forbidden.
So, because (appname) depends on flutter_test any from sdk, version solving failed.

Visual Studio, Debugger


Visual Studio でデバッガーの起動が遅くなった。

プロジェクトのフォルダー内の .vs ディレクトリーを削除します。

Flutter


Android Studioで実機に接続できない

flutter doctor を実行してライセンスに問題がある場合に flutter doctor --android-licensesを実行してすべてyesを選択します。RSA 鍵を受け入れる を選択します。

Microsoft Angel


Visual Studio 2017用に Microsoft Angel (https://github.com/Microsoft/angle) を修正したものを公開しました。

https://github.com/setokynet/vs2017-winrt-angel_opengl

詳細はこちらのページを参照してください。

XmlDocument, Namespace


既定の名前空間として xmlns=””が出力される


XmlDocument _xmldocument = new XmlDocument();
XmlElement _xmlelement = _xmldocument.Create("root","http://www.setokynet.com/");
_xmldocument.AppendChild(_xmlelement);
XmlElement _item = _xmldocument.Create("item");
_xmlelement.AppendChild(_item);
XmlElement _item2 = _xmldocument.Create("item", "http://www.setokynet.com/");
_xmlelement.AppendChild(_item2);
XmlElement _item3 = _xmldocument.Create("item", _xmldocument.DocumentElement.NamespaceURI);
_xmlelement.AppendChild(_item3);


<root xmlns="http://www.setokynet.com/">
<item xmlns="" />
<item xmlns="http://www.setokynet.com/" />
<item />
</root>

子要素についてDocumentElementの名前空間を使用する場合、_xmldocument.DocumentElement.NamespaceURI (_xmlelement.NamespaceURI)を指定します。

D8021, /Wextra


Cmakeを利用して生成したVisual Studioのソリューション(.sln)でビルドを行うと D8021:invalid numeric argument ‘/Wextra’ が発生してビルドできない

例えば次のように
set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wundef”)
となっている個所を
if(CMAKE_COMPILER_IS_GNUCXX)
set(CMAKE_CXX_FLAGS_DEBUG “${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra -Wundef”)
endif(CMAKE_COMPILER_IS_GNUCXX)
のようにif-endifで囲むとVisual Studioで正しくビルドを行うことができるようになります。Wextra はgccで使用されます。

Android AOSP


Building the System | Android Open Source Projectの手順に従って、Nexus 7 (Wi-Fi), nakasi (grouper)のビルドを行ったところ次のエラーが発生しました。

File “../base/android/jni_generator/jni_generator.py”, line 212, in ParseJavaPSignature
return ‘”%s”‘ % signature_line[signature_line.index(prefix) + len(prefix):]
ValueError: substring not found
make: *** [out/target/product/generic/obj/GYP/shared_intermediates/content/jni/HashSet_jni.h] Error 1
make: *** …
Traceback (most recent call last):
File “../base/android/jni_generator/jni_generator.py”, line 1527, in
sys.exit(main(sys.argv))
File “../base/android/jni_generator/jni_generator.py”, line 1518, in main
GenerateJNIHeader(input_file, output_file, options)
File “../base/android/jni_generator/jni_generator.py”, line 1401, in GenerateJNIHeader
jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
File “../base/android/jni_generator/jni_generator.py”, line 652, in CreateFromClass
jni_from_javap = JNIFromJavaP(stdout.split(‘\n’), options)
File “../base/android/jni_generator/jni_generator.py”, line 600, in __init__
signature=JniParams.ParseJavaPSignature(contents[lineno + 1]))]
File “../base/android/jni_generator/jni_generator.py”, line 212, in ParseJavaPSignature
return ‘”%s”‘ % signature_line[signature_line.index(prefix) + len(prefix):]
ValueError: substring not found
make: *** [out/target/product/generic/obj/GYP/shared_intermediates/content/jni/MotionEvent_jni.h] Error 1

その後ソースコードをダウンロードしなおしたところ問題なくビルドできました。

FSCTL_GET_VOLUME_BITMAP


When they specify the FSCTL_GET_VOLUME_BITMAP to DeviceIoControl function, The value 0 is returned. Also ERROR_INVALID_FUNCTION(1) is returned by GetLastError().

When they specify the GENERIC_READ to dwDesiredAccess of CreateFileW, it can not get the HANDLE.


DeviceIoControl に FSCTL_GET_VOLUME_BITMAP を指定すると 戻り値が0になり、GetLastError()が ERROR_INVALID_FUNCTION (1)を返します

CreateFileW の dwDesiredAccess に対して GENERIC_READ を指定すると HANDLE を取得できない。

Windows 10 x64で発生しています。

AutoGenerateBindingRedirects


[(0,0)]: Info: 競合を解決して警告を消去するために、app.config でアセンブリ “System.Runtime, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a” をバージョン “4.0.0.0” [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\Facades\System.Runtime.dll] からバージョン “4.0.10.0” [] にマップし直してください。
[C:\Program Files (x86)\MSBuild\14.0\bin\amd64\Microsoft.Common.CurrentVersion.targets(1819,5)]: Warning: 同じ依存アセンブリの異なるバージョン間で競合が見つかりました。プロジェクト ファイルで “AutoGenerateBindingRedirects” プロパティを true に設定してください。詳細については、http://go.microsoft.com/fwlink/?LinkId=294190 を参照してください。
[(0,0)]: Info: Patch for assembly [(ProjectName), Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
[(0,0)]: Info: (ProjectName).Windows -> xxx.exe

方法: 自動バインディング リダイレクトを有効/無効にする に従い、AutoGenerateBindingRedirectsをfalseに設定します。

プロセッサ アーキテクチャ


C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(1697,5): warning MSB3270: 構築されているプロジェクトのプロセッサ アーキテクチャ “MSIL” と、参照 “.dll” のプロセッサ アーキテクチャ “x86” の間には不一致がありました。この不一致は、ランタイム エラーを発生させる可能性があります。プロジェクトと参照の間でプロセッサ アーキテクチャが一致するように、構成マネージャーを使用してターゲットとするプロジェクトのプロセッサ アーキテクチャを変更するか、ターゲットとするプロジェクトのプロセッサ アーキテクチャに一致するプロジェクト アーキテクチャとの依存関係を参照で設定することを検討してください。

C# Windows フォーム アプリケーション プロジェクト の プロパティー、「ビルド」 タブ – 「プラットフォームターゲット」を Any CPU から x86 または x64 に変更すると発生しなくなります。

アプリケーションの多言語対応


Visual Studioを使用したアプリケーションの多言語の方法です。


Windows フォーム

  1. Windows フォームアプリケーション プロジェクトを作成します。
  2. フォームにコントロールを配置します。
  3. ソリューションエクスプローラーでプロジェクトを選択して右クリック、プロパティーを選択します。
  4. アプリケーションのアセンブリ情報をクリックして、ニュートラル言語を(なし)から変更します。
  5. Windows フォームのLocalizableをTureに設定して、Languageプロパティーを変更します。それぞれ対応する言語に合わせてラベル、ボタンなどのテキストを変更します。
Multilingual app toolkitを使用する場合
  1. メニューの 「ツール」-「多言語アプリツールキット」-「選択範囲を有効にする」を選択します。
  2. ソリューションエクスプローラーでプロジェクトを選択して右クリック、「多言語アプリツールキット」-「翻訳言語の追加」を選択します。疑似言語[qus-ploc]と追加する言語を選択します。
  3. MultilingualResourecesフォルダーのxlfファイルを選択して Multilingual Editor を起動します。候補表示をクリックして翻訳します。[qus-ploc]は必ず翻訳してください。

WPF アプリケーション

  1. WPF アプリケーション プロジェクトを作成します。
  2. MainWindows.xamlなどのファイルにコントロールを配置します。この例ではTextBlockコントロールを追加します。
  3. ソリューションエクスプローラーでプロジェクトを選択して右クリック、プロパティーを選択します。
  4. アプリケーションのアセンブリ情報をクリックして、ニュートラル言語を(なし)から変更します。
  5. Resources.resxファイルを開きます。アクセス修飾子をPublicに設定します。名前と値を入力して文字列を追加します。ここではTranslateTestとします。
  6. MainWindows.xamlファイルを開きます。Window要素にxmlns:Properties=”clr-namespace:(プロジェクトの名前).Properties” 属性を追加します。
  7. TextBlockコントロールの要素にText=”{x:Static Properties:Resources.TranslateTest} 属性を追加します。
    1. MainWindows.xaml.csファイルを開きます。[C#]
      private CultureInfo cultureOverride = new CultureInfo("qps-PLOC");

      を追加します。またコンストラクターのInitializeComponent();の後に

      
      if (Debugger.IsAttached == true && cultureOverride != null)
      {
      	Thread.CurrentThread.CurrentUICulture = cultureOverride;
      	Thread.CurrentThread.CurrentCulture = cultureOverride;
      }
      

      を追加します。Using the Multilingual App Toolkit with WPF Applications | Synergist:を参考にしました。

  8. Multilingual app toolkitを使用しない場合は、Resources.[lang].resxファイルを追加します。英語(米国)の場合はResouces.en-US.resxファイルを追加します。それぞれ値を翻訳します。
Multilingual app toolkitを使用する場合
  1. メニューの 「ツール」-「多言語アプリツールキット」-「選択範囲を有効にする」を選択します。
  2. ソリューションエクスプローラーでプロジェクトを選択して右クリック、「多言語アプリツールキット」-「翻訳言語の追加」を選択します。疑似言語[qus-ploc]と追加する言語を選択します。
  3. MultilingualResourecesフォルダーのxlfファイルを選択して Multilingual Editor を起動します。候補表示をクリックして翻訳します。[qus-ploc]は必ず翻訳してください。

ユニバーサル Windows プラットフォーム  アプリ(UWP)

  1. 空白のアプリ(ユニバーサル Windows)を選択して ユニバーサル Windows プラットフォーム用のアプリ プロジェクトを作成します。
  2. MainPage.xamlなどのファイルにコントロールを配置します。この例ではTextBlockコントロールを追加します。
  3. Package.appxmanifestファイルを開きます。既定の言語を設定します。
  4. ソリューションエクスプローラーでプロジェクトを選択して右クリック、Stringsフォルダーを作成します。さらにそのフォルダーにResources.reswファイルを追加します。
  5. Resources.reswファイルを開きます。アクセス修飾子をPublicに設定します。名前と値を入力して文字列を追加します。ここではTranslateTestとします。
  6. MainPage.xamlファイルを開きます。TextBlock要素にx:Uid=”TranslateTest”を追加します。
  7. Multilingual app toolkitを使用しない場合は、Stringsフォルダーに[lang]サブフォルダーを作成してResources.reswファイルを追加します。英語(米国)の場合は\en-US\Resouces.reswファイルを追加します。それぞれ値を翻訳します。
Multilingual app toolkitを使用する場合

Windows 10に対応したUWPを翻訳するには、Multilingual app toolkit 4.0が必要です。Multilingual app toolkit 3.0はWindows 8.1のUWPのみ対応しています。

  1. メニューの 「ツール」-「多言語アプリツールキット」-「選択範囲を有効にする」を選択します。
  2. ソリューションエクスプローラーでプロジェクトを選択して右クリック、「多言語アプリツールキット」-「翻訳言語の追加」を選択します。疑似言語[qus-ploc]と追加する言語を選択します。
  3. MultilingualResourecesフォルダーのxlfファイルを選択して Multilingual Editor を起動します。候補表示をクリックして翻訳します。[qus-ploc]は必ず翻訳してください。

サービス インストーラーの作成


サービス アプリケーションにインストーラーを追加する

Visual Studio 2015 に Microsoft Visual Studio 2015 Installer Projects を追加します。

  • Windows サービス プロジェクトを作成します。
  • ソリューションエクスプローラー の 新しいプロジェクト – その他のプロジェクト – Visual Studio Installer – Setup Project を選択して追加します。
  • インストーラーを追加します。
  • ソリューションエクスプローラー ProjectInstaller を選択、ビューデザインを選択します。
  • serviceInstaller1 を選択します。Descriptionにサービスの説明、DisplayName に サービスの表示名、ServiceNameにサービスの名前を入力します。管理ツールでサービスを起動させたとき、DisplayName が一覧に表示されます。また sc query [ServiceName]となります。StartType は [Automatic – 自動], [Manual – 手動], [Disabled – 無効]に対応します。DelayedAutoStart を True に設定すると 自動遅延 になります。
  • serviceInstaller1 を選択します。Account 項目を設定ます。
  • セットアッププロジェクトを選択して、Add – プロジェクト出力 – プライマリ出力を選択します。
  • ソリューションをビルドします。セットアッププロジェクトを選択して、「インストール」、「アンインストール」を行って正しく動作するか確認します。

Visual Studio


Visual Studio Community 2015, Visual Studio Community 2013 Update 5、いずれも問題なくインストールできました。